├── .editorconfig ├── .gitattributes ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json └── tasks.json ├── AUTHORS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── COPYING ├── D2Mod.sln ├── Makefile ├── OpenRA.Mods.D2 ├── AudioLoaders │ ├── AudLoader.cs │ └── VocLoader.cs ├── FileFormats │ ├── AudReader.cs │ ├── LCWCompression.cs │ ├── WsaReader.cs │ └── XORDeltaCompression.cs ├── FileSystem │ └── Pak.cs ├── Graphics │ ├── D2BuildingPlacementRenderable.cs │ └── D2ChromeProvider.cs ├── ImportData │ ├── D2ImportOriginalMaps.cs │ ├── D2MapImporter.cs │ ├── D2MapSeed.cs │ └── D2UnpackContent.cs ├── LoadScreens │ └── D2LoadScreen.cs ├── MapUtils │ └── D2MapUtils.cs ├── MathExtention │ └── D2MathExtention.cs ├── OpenRA.Mods.D2.csproj ├── Properties │ └── launchSettings.json ├── SpriteLoaders │ ├── CpsD2Loader.cs │ ├── IcnD2Loader.cs │ ├── ShpD2Loader.cs │ ├── ShpTDLoader.cs │ └── WsaLoader.cs ├── Traits │ ├── Buildings │ │ ├── D2Building.cs │ │ ├── D2Concrete.cs │ │ ├── D2ConcreteOwners.cs │ │ └── D2PlaceBuildingPreview.cs │ ├── D2AffectsShroud.cs │ ├── D2RevealsShroud.cs │ ├── PaletteEffects │ │ └── D2WindtrapPaletteEffect.cs │ ├── Render │ │ ├── D2LeavesTracks.cs │ │ └── WithTilesetBody.cs │ └── World │ │ ├── D2BuildableTerrainLayer.cs │ │ ├── D2ResourceRenderer.cs │ │ ├── D2Selection.cs │ │ ├── D2ShroudRenderer.cs │ │ └── D2TerrainLayer.cs ├── UtilityCommands │ └── D2ImportMapD2Command.cs └── Widgets │ ├── D2ButtonWidget.cs │ ├── D2ImageWidget.cs │ ├── D2LineWidget.cs │ ├── D2PanelWidget.cs │ ├── D2ProgressBarWidget.cs │ ├── D2SpriteWidget.cs │ ├── D2WidgetUtils.cs │ ├── Logic │ ├── D2AssetBrowserLogic.cs │ ├── D2MissionBrowserLogic.cs │ └── Ingame │ │ └── D2IngameActorLogic.cs │ └── WsaPlayerWidget.cs ├── README.md ├── fetch-engine.sh ├── launch-dedicated.cmd ├── launch-dedicated.sh ├── launch-game.cmd ├── launch-game.sh ├── make.cmd ├── make.ps1 ├── mod.config ├── mods └── d2 │ ├── AUTHORS │ ├── audio │ ├── music.yaml │ ├── notifications.yaml │ └── voices.yaml │ ├── bits │ ├── scripts │ │ └── campaign-global.lua │ └── transparent.shp │ ├── chrome.yaml │ ├── chrome │ ├── assetbrowser.yaml │ ├── ingame-observer.yaml │ ├── ingame-player.yaml │ └── missionbrowser.yaml │ ├── cursors.yaml │ ├── hotkeys.yaml │ ├── icon.png │ ├── installer │ ├── d2k-a.yaml │ ├── d2k-b.yaml │ ├── d2k-c.yaml │ ├── d2k-d.yaml │ ├── d2k-e.yaml │ ├── downloads.yaml │ └── gruntmods.yaml │ ├── maps │ ├── map1 │ │ ├── map.bin │ │ ├── map.png │ │ └── map.yaml │ ├── oh-gap.oramap │ ├── scena001 │ │ ├── map.bin │ │ ├── map.png │ │ ├── map.yaml │ │ ├── rules.yaml │ │ └── scena001.lua │ ├── scena002 │ │ ├── map.bin │ │ ├── map.png │ │ ├── map.yaml │ │ ├── rules.yaml │ │ ├── scena002-AI.lua │ │ └── scena002.lua │ └── shellmap │ │ ├── map.bin │ │ ├── map.png │ │ └── map.yaml │ ├── metrics.yaml │ ├── missions.yaml │ ├── mod.yaml │ ├── rules │ ├── ai.yaml │ ├── aircrafthusk.yaml │ ├── arrakis.yaml │ ├── autotarget.yaml │ ├── barracks.yaml │ ├── building.yaml │ ├── campaign-rules.yaml │ ├── campaign-tooltips.yaml │ ├── carryall.yaml │ ├── colorpicker.yaml │ ├── combat_tank.yaml │ ├── concrete.yaml │ ├── construction_yard.yaml │ ├── defaults.yaml │ ├── defense.yaml │ ├── devastator.yaml │ ├── deviator.yaml │ ├── fremen.yaml │ ├── frigate.yaml │ ├── gun_turret.yaml │ ├── harvester.yaml │ ├── heavy_factory.yaml │ ├── high_tech_factory.yaml │ ├── husk.yaml │ ├── husks.yaml │ ├── infantry.yaml │ ├── light_factory.yaml │ ├── light_inf.yaml │ ├── light_squad.yaml │ ├── mcv.yaml │ ├── misc.yaml │ ├── missile_tank.yaml │ ├── ornithopter.yaml │ ├── outpost.yaml │ ├── palace.yaml │ ├── palettes.yaml │ ├── plane.yaml │ ├── player.yaml │ ├── powerdown.yaml │ ├── quad.yaml │ ├── raider.yaml │ ├── refinery.yaml │ ├── repair_pad.yaml │ ├── research_centre.yaml │ ├── rocket_turret.yaml │ ├── saboteur.yaml │ ├── sandworm.yaml │ ├── sardaukar.yaml │ ├── siege_tank.yaml │ ├── silo.yaml │ ├── sonic_tank.yaml │ ├── spicebloom.yaml │ ├── starport.yaml │ ├── starport_items.yaml │ ├── tank.yaml │ ├── trike.yaml │ ├── trooper.yaml │ ├── trooper_squad.yaml │ ├── vechicle.yaml │ ├── vechiclehusk.yaml │ ├── wall.yaml │ ├── wind_trap.yaml │ ├── wor.yaml │ └── world.yaml │ ├── sequences │ ├── atomic.yaml │ ├── barracks.yaml │ ├── bombs.yaml │ ├── carryall.yaml │ ├── colorpicker.yaml │ ├── combat_tank.yaml │ ├── concrete.yaml │ ├── conyard.yaml │ ├── craters.yaml │ ├── devastator.yaml │ ├── deviator.yaml │ ├── explosion.yaml │ ├── fire.yaml │ ├── fremen.yaml │ ├── frigate.yaml │ ├── gun_turret.yaml │ ├── guns_fire.yaml │ ├── harvester.yaml │ ├── heavy_factory.yaml │ ├── high_tech_factory.yaml │ ├── icon.yaml │ ├── light_factory.yaml │ ├── light_inf.yaml │ ├── light_squad.yaml │ ├── mcv.yaml │ ├── misc.yaml │ ├── missile_tank.yaml │ ├── ornithopter.yaml │ ├── outpost.yaml │ ├── overlay.yaml │ ├── palace.yaml │ ├── quad.yaml │ ├── raider.yaml │ ├── refinery.yaml │ ├── repair_pad.yaml │ ├── research.yaml │ ├── rocket_turret.yaml │ ├── saboteur.yaml │ ├── sandworm.yaml │ ├── sardaukar.yaml │ ├── shroud.yaml │ ├── sides.yaml │ ├── siege_tank.yaml │ ├── silo.yaml │ ├── smoke.yaml │ ├── sonic_tank.yaml │ ├── spice.yaml │ ├── spicebloom.yaml │ ├── starport.yaml │ ├── tracks.yaml │ ├── trails.yaml │ ├── trike.yaml │ ├── trooper.yaml │ ├── trooper_squad.yaml │ ├── wall.yaml │ ├── wind_trap.yaml │ └── wor.yaml │ ├── tilesets │ └── arrakis2.yaml │ └── weapons │ ├── largeguns.yaml │ ├── missiles.yaml │ ├── other.yaml │ ├── smallguns.yaml │ ├── spicebloom.yaml │ └── squads.yaml ├── omnisharp.json ├── packaging ├── artwork │ ├── icon_1024x1024.png │ ├── icon_128x128.png │ ├── icon_16x16.png │ ├── icon_24x24.png │ ├── icon_256x256.png │ ├── icon_32x32.png │ ├── icon_48x48.png │ ├── icon_512x512.png │ ├── icon_64x64.png │ ├── macos-background-2x.png │ └── macos-background.png ├── functions.sh ├── linux │ └── buildpackage.sh ├── macos │ └── buildpackage.sh ├── package-all.sh └── windows │ ├── buildpackage.nsi │ └── buildpackage.sh ├── utility.cmd └── utility.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Enforce LF normalization on Windows 2 | *.yaml eol=lf 3 | *.lua eol=lf 4 | *.cs eol=lf 5 | *.csproj eol=lf 6 | *.sln eol=lf 7 | * text=lf 8 | 9 | # Custom for Visual Studio 10 | *.cs diff=csharp 11 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | linux: 9 | name: Linux (.NET 6.0) 10 | runs-on: ubuntu-22.04 11 | 12 | steps: 13 | - name: Clone Repository 14 | uses: actions/checkout@v3 15 | 16 | - name: Install .NET 6.0 17 | uses: actions/setup-dotnet@v3 18 | with: 19 | dotnet-version: '6.0.x' 20 | 21 | - name: Prepare Environment 22 | run: | 23 | . mod.config; 24 | awk '/\r$$/ { exit(1); }' mod.config || (printf "Invalid mod.config format. File must be saved using unix-style (LF, not CRLF or CR) line endings.\n"; exit 1); 25 | 26 | - name: Check Code 27 | run: | 28 | make check 29 | make check-packaging-scripts 30 | 31 | - name: Check Mod 32 | run: | 33 | sudo apt-get install lua5.1 34 | make check-scripts 35 | make test 36 | 37 | linux-mono: 38 | name: Linux (mono) 39 | runs-on: ubuntu-22.04 40 | 41 | steps: 42 | - name: Clone Repository 43 | uses: actions/checkout@v3 44 | 45 | - name: Prepare Environment 46 | run: | 47 | . mod.config; 48 | awk '/\r$$/ { exit(1); }' mod.config || (printf "Invalid mod.config format. File must be saved using unix-style (LF, not CRLF or CR) line endings.\n"; exit 1); 49 | 50 | - name: Check Code 51 | run: | 52 | # check-packaging-scripts does not depend on .net/mono, so is not needed here 53 | mono --version 54 | make RUNTIME=mono check 55 | 56 | - name: Check Mod 57 | run: | 58 | # check-scripts does not depend on .net/mono, so is not needed here 59 | make RUNTIME=mono test 60 | 61 | windows: 62 | name: Windows (.NET 6.0) 63 | runs-on: windows-2019 64 | 65 | steps: 66 | - name: Clone Repository 67 | uses: actions/checkout@v3 68 | 69 | - name: Install .NET 6.0 70 | uses: actions/setup-dotnet@v3 71 | with: 72 | dotnet-version: '6.0.x' 73 | 74 | - name: Check Code 75 | shell: powershell 76 | run: | 77 | # Work around runtime failures on the GH Actions runner 78 | dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org 79 | .\make.ps1 check 80 | 81 | - name: Check Mods 82 | run: | 83 | choco install lua --version 5.1.5.52 84 | $ENV:Path = $ENV:Path + ";C:\Program Files (x86)\Lua\5.1\" 85 | .\make.ps1 check-scripts 86 | .\make.ps1 test 87 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | user.config 2 | engine 3 | bin 4 | obj 5 | mods/*/*.dll 6 | mods/*/*.mdb 7 | mods/*/*.pdb 8 | /*.dll 9 | /*.dll.config 10 | /*.so 11 | /*.dylib 12 | /*.pdb 13 | /*.mdb 14 | /*.exe 15 | */*.user 16 | DOCUMENTATION.md 17 | Lua-API.md 18 | StyleCopViolations.xml 19 | .DS_Store 20 | .vs 21 | .idea 22 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "EditorConfig.EditorConfig", 4 | "ms-dotnettools.csharp", 5 | "openra.oraide-vscode", 6 | "openra.vscode-openra-lua", 7 | "macabeus.vscode-fluent", 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "d2", 6 | "type": "coreclr", 7 | "request": "launch", 8 | "program": "${workspaceRoot}/engine/bin/OpenRA.dll", 9 | "args": [ 10 | "Game.Mod=d2", 11 | "Engine.EngineDir=${workspaceRoot}/engine", 12 | "Engine.ModSearchPaths=${workspaceRoot}/mods, ${workspaceRoot}/engine/mods", 13 | "Debug.DisplayDeveloperSettings=true", 14 | ], 15 | "preLaunchTask": "build", 16 | }, 17 | { 18 | "name": "Launch Utility", 19 | "type": "coreclr", 20 | "request": "launch", 21 | "program": "${workspaceRoot}/engine/bin/OpenRA.Utility.dll", 22 | "args": ["d2", "--check-yaml"], 23 | "env": { 24 | "ENGINE_DIR": "${workspaceRoot}/engine", 25 | "MOD_SEARCH_PATHS": "${workspaceRoot}/mods, ${workspaceRoot}/engine/mods" 26 | }, 27 | "preLaunchTask": "build", 28 | }, 29 | ], 30 | } 31 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "build", 6 | "command": "make", 7 | "args": ["all", "CONFIGURATION=Debug"], 8 | "windows": { 9 | "command": "make.cmd" 10 | } 11 | }, 12 | { 13 | "label": "Run Utility", 14 | "command": "dotnet ${workspaceRoot}/engine/bin/OpenRA.Utility.dll ${input:modId} ${input:command}", 15 | "type": "shell", 16 | "options": { 17 | "env": { 18 | "ENGINE_DIR": "${workspaceRoot}/engine", 19 | "MOD_SEARCH_PATHS": "${workspaceRoot}/mods,${workspaceRoot}/engine/mods" 20 | } 21 | } 22 | } 23 | ], 24 | "inputs": [ 25 | { 26 | "id": "modId", 27 | "description": "ID of the mod to run", 28 | "default": "d2", 29 | "type": "promptString" 30 | }, { 31 | "id": "command", 32 | "description": "Name of the command + parameters", 33 | "default": "", 34 | "type": "promptString" 35 | }, 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | ./mods/d2/AUTHORS -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # d2 mod Contributing Guidelines 2 | 3 | ## debug 4 | 5 | Command: /Users/user/d2/engine/OpenRA.Game.exe 6 | Arguments: Engine.ModSearchPaths="/Users/user/d2/engine/mods,/Users/user/d2/mods" Game.Mod=d2 7 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/AudioLoaders/AudLoader.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | /* Copied as is from OpenRA.Mods.Cnc */ 13 | 14 | using System; 15 | using System.IO; 16 | using OpenRA.Mods.D2.FileFormats; 17 | 18 | namespace OpenRA.Mods.D2.AudioLoaders 19 | { 20 | public class AudLoader : ISoundLoader 21 | { 22 | bool IsAud(Stream s) 23 | { 24 | var start = s.Position; 25 | s.Position += 10; 26 | var readFlag = s.ReadByte(); 27 | var readFormat = s.ReadByte(); 28 | s.Position = start; 29 | 30 | if (!Enum.IsDefined(typeof(SoundFlags), readFlag)) 31 | return false; 32 | 33 | return Enum.IsDefined(typeof(SoundFormat), readFormat); 34 | } 35 | 36 | bool ISoundLoader.TryParseSound(Stream stream, out ISoundFormat sound) 37 | { 38 | try 39 | { 40 | if (IsAud(stream)) 41 | { 42 | sound = new AudFormat(stream); 43 | return true; 44 | } 45 | } 46 | catch 47 | { 48 | // Not a supported AUD 49 | } 50 | 51 | sound = null; 52 | return false; 53 | } 54 | } 55 | 56 | public sealed class AudFormat : ISoundFormat 57 | { 58 | public int Channels { get { return 1; } } 59 | public int SampleBits { get { return 16; } } 60 | public int SampleRate { get { return sampleRate; } } 61 | public float LengthInSeconds { get { return AudReader.SoundLength(sourceStream); } } 62 | public Stream GetPCMInputStream() { return audStreamFactory(); } 63 | public void Dispose() { sourceStream.Dispose(); } 64 | 65 | readonly Stream sourceStream; 66 | readonly Func audStreamFactory; 67 | readonly int sampleRate; 68 | 69 | public AudFormat(Stream stream) 70 | { 71 | sourceStream = stream; 72 | 73 | if (!AudReader.LoadSound(stream, out audStreamFactory, out sampleRate)) 74 | throw new InvalidDataException(); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/FileFormats/WsaReader.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System.IO; 13 | using System.Linq; 14 | using OpenRA.Graphics; 15 | using OpenRA.Mods.D2.SpriteLoaders; 16 | using OpenRA.Primitives; 17 | 18 | namespace OpenRA.Mods.D2.FileFormats 19 | { 20 | public class WsaReader 21 | { 22 | int width; 23 | int height; 24 | int currentFrame; 25 | ISpriteFrame[] frames; 26 | 27 | public int Length { get { return frames == null ? 0 : frames.Length; } } 28 | public int CurrentFrame { get { return currentFrame; } } 29 | public ISpriteFrame Frame { get { return CurrentSpriteFrame(); } } 30 | public int Width { get { return width; } } 31 | public int Height { get { return height; } } 32 | 33 | public WsaReader() 34 | { 35 | frames = null; 36 | Reset(); 37 | } 38 | 39 | public WsaReader(Stream stream) 40 | { 41 | TypeDictionary metadata; 42 | 43 | Read(stream, out metadata); 44 | Reset(); 45 | } 46 | 47 | public void Read(Stream stream, out TypeDictionary metadata) 48 | { 49 | ISpriteFrame[] videoFrames; 50 | ISpriteFrame prev = null; 51 | WsaLoader wsaLoader = new WsaLoader(); 52 | 53 | metadata = null; 54 | 55 | if (frames != null) 56 | prev = frames[frames.Length - 1]; 57 | 58 | wsaLoader.TryParseSpriteWithPrevFrame(stream, prev, out videoFrames, out metadata); 59 | 60 | if (frames == null) 61 | { 62 | frames = videoFrames; 63 | 64 | if (Length > 0) 65 | { 66 | var frame = frames[0]; 67 | width = frame.Size.Width; 68 | height = frame.Size.Height; 69 | } 70 | } 71 | else 72 | frames = frames.Concat(videoFrames).ToArray(); 73 | } 74 | 75 | public void Reset() 76 | { 77 | currentFrame = 0; 78 | } 79 | 80 | public void AdvanceFrame() 81 | { 82 | if (frames != null && currentFrame < frames.Length - 1) 83 | currentFrame++; 84 | else 85 | currentFrame = 0; 86 | } 87 | 88 | ISpriteFrame CurrentSpriteFrame() 89 | { 90 | if (frames != null && currentFrame < frames.Length) 91 | return frames[currentFrame]; 92 | 93 | return null; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/FileFormats/XORDeltaCompression.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | /* Copied as is from OpenRA.Mods.Cnc */ 13 | 14 | using OpenRA.Mods.Common.FileFormats; 15 | 16 | namespace OpenRA.Mods.D2.FileFormats 17 | { 18 | // Data that is to be XORed against another set of data (aka Format40) 19 | public static class XORDeltaCompression 20 | { 21 | public static int DecodeInto(byte[] src, byte[] dest, int srcOffset) 22 | { 23 | var ctx = new FastByteReader(src, srcOffset); 24 | var destIndex = 0; 25 | 26 | while (true) 27 | { 28 | var i = ctx.ReadByte(); 29 | if ((i & 0x80) == 0) 30 | { 31 | var count = i & 0x7F; 32 | if (count == 0) 33 | { 34 | // case 6 35 | count = ctx.ReadByte(); 36 | var value = ctx.ReadByte(); 37 | for (var end = destIndex + count; destIndex < end; destIndex++) 38 | dest[destIndex] ^= value; 39 | } 40 | else 41 | { 42 | // case 5 43 | for (var end = destIndex + count; destIndex < end; destIndex++) 44 | dest[destIndex] ^= ctx.ReadByte(); 45 | } 46 | } 47 | else 48 | { 49 | var count = i & 0x7F; 50 | if (count == 0) 51 | { 52 | count = ctx.ReadWord(); 53 | if (count == 0) 54 | return destIndex; 55 | 56 | if ((count & 0x8000) == 0) 57 | { 58 | // case 2 59 | destIndex += count & 0x7FFF; 60 | } 61 | else if ((count & 0x4000) == 0) 62 | { 63 | // case 3 64 | for (var end = destIndex + (count & 0x3FFF); destIndex < end; destIndex++) 65 | dest[destIndex] ^= ctx.ReadByte(); 66 | } 67 | else 68 | { 69 | // case 4 70 | var value = ctx.ReadByte(); 71 | for (var end = destIndex + (count & 0x3FFF); destIndex < end; destIndex++) 72 | dest[destIndex] ^= value; 73 | } 74 | } 75 | else 76 | { 77 | // case 1 78 | destIndex += count; 79 | } 80 | } 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/FileSystem/Pak.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | /* Copied as is from OpenRA.Mods.Cnc */ 13 | 14 | using System; 15 | using System.Collections.Generic; 16 | using System.IO; 17 | using OpenRA.FileSystem; 18 | using OpenRA.Primitives; 19 | using FS = OpenRA.FileSystem.FileSystem; 20 | 21 | namespace OpenRA.Mods.D2.FileSystem 22 | { 23 | public class PakFileLoader : IPackageLoader 24 | { 25 | struct Entry 26 | { 27 | public uint Offset; 28 | public uint Length; 29 | public string Filename; 30 | } 31 | 32 | sealed class PakFile : IReadOnlyPackage 33 | { 34 | public string Name { get; private set; } 35 | public IEnumerable Contents { get { return index.Keys; } } 36 | 37 | readonly Dictionary index = new Dictionary(); 38 | readonly Stream stream; 39 | 40 | public PakFile(Stream stream, string filename) 41 | { 42 | Name = filename; 43 | this.stream = stream; 44 | 45 | try 46 | { 47 | var offset = stream.ReadUInt32(); 48 | while (offset != 0) 49 | { 50 | var file = stream.ReadASCIIZ(); 51 | var next = stream.ReadUInt32(); 52 | var length = (next == 0 ? (uint)stream.Length : next) - offset; 53 | 54 | // Ignore duplicate files 55 | if (index.ContainsKey(file)) 56 | continue; 57 | 58 | index.Add(file, new Entry { Offset = offset, Length = length, Filename = file }); 59 | offset = next; 60 | } 61 | } 62 | catch 63 | { 64 | Dispose(); 65 | throw; 66 | } 67 | } 68 | 69 | public Stream GetStream(string filename) 70 | { 71 | Entry entry; 72 | if (!index.TryGetValue(filename, out entry)) 73 | return null; 74 | 75 | return SegmentStream.CreateWithoutOwningStream(stream, entry.Offset, (int)entry.Length); 76 | } 77 | 78 | public bool Contains(string filename) 79 | { 80 | return index.ContainsKey(filename); 81 | } 82 | 83 | public IReadOnlyPackage OpenPackage(string filename, FS context) 84 | { 85 | // Not implemented 86 | return null; 87 | } 88 | 89 | public void Dispose() 90 | { 91 | stream.Dispose(); 92 | } 93 | } 94 | 95 | bool IPackageLoader.TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package) 96 | { 97 | if (!filename.EndsWith(".pak", StringComparison.InvariantCultureIgnoreCase)) 98 | { 99 | package = null; 100 | return false; 101 | } 102 | 103 | package = new PakFile(s, filename); 104 | return true; 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Graphics/D2BuildingPlacementRenderable.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using OpenRA.Graphics; 13 | using OpenRA.Primitives; 14 | 15 | namespace OpenRA.Mods.D2.Graphics 16 | { 17 | public struct D2BuildingPlacementRenderable : IRenderable, IFinalizedRenderable 18 | { 19 | readonly WPos pos; 20 | readonly Rectangle bounds; 21 | readonly Color color; 22 | readonly bool crossEnabled; 23 | 24 | public D2BuildingPlacementRenderable(Actor actor, Rectangle bounds, Color color, bool crossEnabled) 25 | : this(actor.CenterPosition, bounds, color, crossEnabled) { } 26 | 27 | public D2BuildingPlacementRenderable(WPos pos, Rectangle bounds, Color color, bool crossEnabled) 28 | { 29 | this.pos = pos; 30 | this.bounds = bounds; 31 | this.color = color; 32 | this.crossEnabled = crossEnabled; 33 | } 34 | 35 | public WPos Pos { get { return pos; } } 36 | 37 | public PaletteReference Palette { get { return null; } } 38 | public int ZOffset { get { return 0; } } 39 | public bool IsDecoration { get { return true; } } 40 | 41 | public IRenderable WithPalette(PaletteReference newPalette) { return this; } 42 | public IRenderable WithZOffset(int newOffset) { return this; } 43 | public IRenderable OffsetBy(in WVec vec) { return new D2BuildingPlacementRenderable(pos + vec, bounds, color, crossEnabled); } 44 | public IRenderable AsDecoration() { return this; } 45 | 46 | public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } 47 | 48 | public void Render(WorldRenderer wr) 49 | { 50 | var rect = ScreenBounds(wr); 51 | var tl = new float3(rect.Left, rect.Top, 1024.0f); 52 | var br = new float3(rect.Right, rect.Bottom, 1024.0f); 53 | var width = 1.0f; 54 | Game.Renderer.WorldRgbaColorRenderer.DrawRect(tl, br, width, color); 55 | if (crossEnabled) 56 | { 57 | Game.Renderer.WorldRgbaColorRenderer.DrawLine(tl, br, width, color); 58 | var tr = new float3(br.X, tl.Y, 1024.0f); 59 | var bl = new float3(tl.X, br.Y, 1024.0f); 60 | Game.Renderer.WorldRgbaColorRenderer.DrawLine(tr, bl, width, color); 61 | } 62 | } 63 | 64 | public void RenderDebugGeometry(WorldRenderer wr) { } 65 | 66 | public Rectangle ScreenBounds(WorldRenderer wr) 67 | { 68 | var tl = new WPos(pos.X + bounds.Left, pos.Y + bounds.Top - 1, 0); 69 | var br = new WPos(pos.X + bounds.Right, pos.Y + bounds.Bottom - 1, 0); 70 | var tlOffset = wr.ScreenPxPosition(tl); 71 | var brOffset = wr.ScreenPxPosition(br); 72 | 73 | return new Rectangle(tlOffset.X, tlOffset.Y, brOffset.X - tlOffset.X, brOffset.Y - tlOffset.Y); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/ImportData/D2ImportOriginalMaps.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using System.Collections.Generic; 14 | using System.IO; 15 | using OpenRA.FileSystem; 16 | 17 | namespace OpenRA.Mods.D2.ImportData 18 | { 19 | public class D2ImportOriginalMaps 20 | { 21 | public static int ImportOriginalMaps(ModData modData, Dictionary info) 22 | { 23 | string[] files = Array.Empty(); 24 | var unpackedFilesCount = 0; 25 | 26 | if (info.ContainsKey("OriginalMaps")) 27 | files = info["OriginalMaps"].Split(','); 28 | 29 | if (files.Length == 0) 30 | return 0; 31 | 32 | var path = Platform.ResolvePath(Platform.SupportDir); 33 | 34 | var contentPath = Path.Combine(path, "maps"); 35 | if (!Directory.Exists(contentPath)) 36 | Directory.CreateDirectory(contentPath); 37 | 38 | var d2Path = Path.Combine(contentPath, "d2"); 39 | if (!Directory.Exists(d2Path)) 40 | Directory.CreateDirectory(d2Path); 41 | 42 | var originalPath = Path.Combine(d2Path, "original"); 43 | if (!Directory.Exists(originalPath)) 44 | Directory.CreateDirectory(originalPath); 45 | 46 | foreach (var s in files) 47 | { 48 | var filename = s.Trim(); 49 | var mapFilename = Path.Combine(originalPath, Path.GetFileNameWithoutExtension(filename) + ".oramap"); 50 | try 51 | { 52 | if (!File.Exists(mapFilename)) 53 | { 54 | if (modData.DefaultFileSystem.Exists(filename)) 55 | { 56 | var rules = Ruleset.LoadDefaults(modData); 57 | var map = D2MapImporter.Import(filename, modData.Manifest.Id, "arrakis2", rules); 58 | 59 | if (map != null) 60 | { 61 | map.Save(ZipFileLoader.Create(mapFilename)); 62 | Console.WriteLine("Original map {0} saved to {1}", filename, mapFilename); 63 | } 64 | } 65 | } 66 | } 67 | catch (Exception e) 68 | { 69 | Console.WriteLine(e.ToString()); 70 | } 71 | } 72 | 73 | return unpackedFilesCount; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/ImportData/D2MapSeed.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | /* 11 | * Based on Dune Dynasty random_general.c (https://sourceforge.net/p/dunedynasty/dunedynasty/ci/master/tree/src/tools/random_general.c) 12 | * Dune Dynasty Written by: 13 | * (c) David Wang 14 | */ 15 | #endregion 16 | 17 | namespace OpenRA.Mods.D2.ImportData 18 | { 19 | public class D2MapSeed 20 | { 21 | readonly byte[] seed = new byte[4]; 22 | 23 | public uint Seed 24 | { 25 | get 26 | { 27 | return (uint)(seed[0]) 28 | + (uint)(seed[1] << 8) 29 | + (uint)(seed[2] << 16) 30 | + (uint)(seed[3] << 24); 31 | } 32 | } 33 | 34 | public D2MapSeed(uint seed) 35 | { 36 | this.seed[0] = (byte)(seed & 0xFF); 37 | this.seed[1] = (byte)((seed >> 8) & 0xFF); 38 | this.seed[2] = (byte)((seed >> 16) & 0xFF); 39 | this.seed[3] = (byte)((seed >> 24) & 0xFF); 40 | } 41 | 42 | public byte Random() 43 | { 44 | var carry0 = (byte)((seed[0] >> 1) & 0x01); 45 | var carry2 = (byte)(seed[2] >> 7); 46 | seed[2] = (byte)((seed[2] << 1) | carry0); 47 | 48 | var carry1 = (byte)(seed[1] >> 7); 49 | seed[1] = (byte)((seed[1] << 1) | carry2); 50 | 51 | var carry = (byte)(((seed[0] >> 2) - seed[0] - (carry1 ^ 0x01)) & 0x01); 52 | seed[0] = (byte)((carry << 7) | (seed[0] >> 1)); 53 | 54 | return (byte)(seed[0] ^ seed[1]); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/ImportData/D2UnpackContent.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using System.Collections.Generic; 14 | using System.IO; 15 | 16 | namespace OpenRA.Mods.D2.ImportData 17 | { 18 | public class D2UnpackContent 19 | { 20 | public static int UnpackFiles(ModData modData, Dictionary info) 21 | { 22 | string[] files = Array.Empty(); 23 | var unpackedFilesCount = 0; 24 | 25 | if (info.ContainsKey("UnpackFiles")) 26 | files = info["UnpackFiles"].Split(','); 27 | 28 | if (files.Length == 0) 29 | return 0; 30 | 31 | var path = Platform.ResolvePath(Platform.SupportDir); 32 | 33 | var contentPath = Path.Combine(path, "Content"); 34 | if (!Directory.Exists(contentPath)) 35 | Directory.CreateDirectory(contentPath); 36 | 37 | var d2Path = Path.Combine(contentPath, "d2"); 38 | if (!Directory.Exists(d2Path)) 39 | Directory.CreateDirectory(d2Path); 40 | 41 | var unpackedPath = Path.Combine(d2Path, "Unpacked"); 42 | if (!Directory.Exists(unpackedPath)) 43 | Directory.CreateDirectory(unpackedPath); 44 | 45 | foreach (var s in files) 46 | { 47 | var originalFileName = s.Trim(); 48 | var fileName = originalFileName; 49 | 50 | var explicitSplit = s.IndexOf(':'); 51 | if (explicitSplit > 0) 52 | { 53 | originalFileName = s.Substring(0, explicitSplit).Trim(); 54 | fileName = s.Substring(explicitSplit + 1).Trim(); 55 | } 56 | 57 | try 58 | { 59 | if (modData.DefaultFileSystem.Exists(originalFileName)) 60 | { 61 | using (var stream = modData.DefaultFileSystem.Open(originalFileName)) 62 | { 63 | var newFileName = Path.Combine(unpackedPath, fileName); 64 | if (!File.Exists(newFileName)) 65 | { 66 | using (FileStream fs = new FileStream(newFileName, FileMode.CreateNew, FileAccess.Write)) 67 | { 68 | stream.CopyTo(fs); 69 | unpackedFilesCount += 1; 70 | Console.WriteLine("Successfully unpacked file: {0}", fileName); 71 | } 72 | } 73 | } 74 | } 75 | } 76 | catch (Exception) 77 | { 78 | } 79 | } 80 | 81 | return unpackedFilesCount; 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/MathExtention/D2MathExtention.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | /* 11 | * Based on Dune Dynasty landscape.c (https://sourceforge.net/p/dunedynasty/dunedynasty/ci/master/tree/src/mods/landscape.c) 12 | * Dune Dynasty Written by: 13 | * (c) David Wang 14 | */ 15 | #endregion 16 | 17 | using System; 18 | 19 | namespace OpenRA.Mods.D2.MathExtention 20 | { 21 | public static class D2MathExtention 22 | { 23 | public static T Clamp(this T val, T min, T max) where T : IComparable 24 | { 25 | if (val.CompareTo(min) < 0) 26 | return min; 27 | else if (val.CompareTo(max) > 0) 28 | return max; 29 | else 30 | return val; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/OpenRA.Mods.D2.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ../engine 5 | 6 | 7 | 8 | 9 | 10 | 11 | False 12 | 13 | 14 | 15 | False 16 | 17 | 18 | 19 | 20 | 21 | Always 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "OpenRA.Mods.D2": { 4 | "commandName": "Executable", 5 | "executablePath": "..\\..\\engine\\bin\\OpenRA.exe", 6 | "commandLineArgs": "Game.Mod=d2 Engine.EngineDir=..\\..\\engine Engine.LaunchPath=..\\..\\engine\\bin Engine.ModSearchPaths=..\\..\\mods,..\\..\\engine\\mods Debug.DisplayDeveloperSettings=true" 7 | }, 8 | "Utility": { 9 | "commandName": "Executable", 10 | "executablePath": "..\\..\\engine\\bin\\OpenRA.Utility.exe", 11 | "commandLineArgs": "d2 --check-yaml", 12 | "environmentVariables": { 13 | "ENGINE_DIR": "..\\..\\engine", 14 | "MOD_SEARCH_PATHS": "..\\..\\mods,..\\..\\engine\\mods" 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/SpriteLoaders/CpsD2Loader.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System.IO; 13 | using OpenRA.Graphics; 14 | using OpenRA.Mods.D2.FileFormats; 15 | using OpenRA.Primitives; 16 | 17 | namespace OpenRA.Mods.D2.SpriteLoaders 18 | { 19 | public class CpsD2Loader : ISpriteLoader 20 | { 21 | public const int TileWidth = 320; 22 | public const int TileHeight = 200; 23 | 24 | public const int TileSize = TileWidth * TileHeight; 25 | const int NumTiles = 1; 26 | uint palSize; 27 | 28 | class CpsD2Tile : ISpriteFrame 29 | { 30 | public SpriteFrameType Type { get { return SpriteFrameType.Indexed8; } } 31 | public Size Size { get; private set; } 32 | public Size FrameSize { get { return Size; } } 33 | public float2 Offset { get { return float2.Zero; } } 34 | public byte[] Data { get; set; } 35 | public bool DisableExportPadding { get { return false; } } 36 | 37 | public CpsD2Tile(Stream s) 38 | { 39 | Size = new Size(TileWidth, TileHeight); 40 | var tempData = StreamExts.ReadBytes(s, (int)(s.Length - s.Position)); 41 | Data = new byte[TileSize]; 42 | LCWCompression.DecodeInto(tempData, Data); 43 | } 44 | } 45 | 46 | bool IsCpsD2(Stream s) 47 | { 48 | if (s.Length < 10) 49 | return false; 50 | 51 | var start = s.Position; 52 | 53 | s.Position += 2; 54 | 55 | var format = s.ReadUInt16(); 56 | if (format != 0x0004) 57 | { 58 | s.Position = start; 59 | return false; 60 | } 61 | 62 | var sizeXTimeSizeY = s.ReadUInt16(); 63 | sizeXTimeSizeY += s.ReadUInt16(); 64 | if (sizeXTimeSizeY != TileSize) 65 | { 66 | s.Position = start; 67 | return false; 68 | } 69 | 70 | palSize = s.ReadUInt16(); 71 | 72 | s.Position = start; 73 | return true; 74 | } 75 | 76 | CpsD2Tile[] ParseFrames(Stream s) 77 | { 78 | var start = s.Position; 79 | 80 | s.Position += 10; 81 | s.Position += palSize; 82 | 83 | var tiles = new CpsD2Tile[NumTiles]; 84 | for (var i = 0; i < tiles.Length; i++) 85 | tiles[i] = new CpsD2Tile(s); 86 | 87 | s.Position = start; 88 | return tiles; 89 | } 90 | 91 | public bool TryParseSprite(Stream s, string filename, out ISpriteFrame[] frames, out TypeDictionary metadata) 92 | { 93 | metadata = null; 94 | if (!IsCpsD2(s)) 95 | { 96 | frames = null; 97 | return false; 98 | } 99 | 100 | s.Position = 0; 101 | frames = ParseFrames(s); 102 | return true; 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Traits/Buildings/D2Concrete.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using OpenRA.Traits; 13 | 14 | namespace OpenRA.Mods.D2.Traits 15 | { 16 | public class D2ConcreteInfo : TraitInfo 17 | { 18 | public override object Create(ActorInitializer init) { return new D2Concrete(init.Self); } 19 | } 20 | 21 | public class D2Concrete 22 | { 23 | public D2Concrete(Actor self) { } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Traits/Buildings/D2ConcreteOwners.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System.Linq; 13 | using OpenRA.Mods.Common.Traits; 14 | using OpenRA.Traits; 15 | 16 | namespace OpenRA.Mods.D2.Traits 17 | { 18 | [Desc("A dictionary of concrete placed on the map. Attach this to the world actor.")] 19 | public class D2ConcreteOwnersInfo : TraitInfo 20 | { 21 | public override object Create(ActorInitializer init) { return new D2ConcreteOwners(init.World); } 22 | } 23 | 24 | public class D2ConcreteOwners 25 | { 26 | readonly Map map; 27 | readonly CellLayer owners; 28 | 29 | public D2ConcreteOwners(World world) 30 | { 31 | map = world.Map; 32 | 33 | owners = new CellLayer(map); 34 | 35 | world.ActorAdded += a => 36 | { 37 | var c = a.Info.TraitInfoOrDefault(); 38 | if (c == null) 39 | return; 40 | 41 | var b = a.Info.TraitInfoOrDefault(); 42 | if (b == null) 43 | return; 44 | 45 | var tiles = b.Tiles(a.Location).ToList(); 46 | foreach (var u in tiles) 47 | if (owners.Contains(u) && owners[u] == null) 48 | owners[u] = a.Owner; 49 | }; 50 | } 51 | 52 | public Player GetOwnerAt(CPos cell) 53 | { 54 | return owners.Contains(cell) ? owners[cell] : null; 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Traits/D2RevealsShroud.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using OpenRA.Traits; 13 | 14 | namespace OpenRA.Mods.D2.Traits 15 | { 16 | public class D2RevealsShroudInfo : D2AffectsShroudInfo 17 | { 18 | [Desc("Relationships the watching player needs to see the shroud removed.")] 19 | public readonly PlayerRelationship ValidRelationships = PlayerRelationship.Ally; 20 | 21 | [Desc("Can this actor reveal shroud generated by the GeneratesShroud trait?")] 22 | public readonly bool RevealGeneratedShroud = true; 23 | 24 | public override object Create(ActorInitializer init) { return new D2RevealsShroud(init.Self, this); } 25 | } 26 | 27 | public class D2RevealsShroud : D2AffectsShroud 28 | { 29 | readonly D2RevealsShroudInfo info; 30 | readonly Shroud.SourceType type; 31 | 32 | public D2RevealsShroud(Actor self, D2RevealsShroudInfo info) 33 | : base(self, info) 34 | { 35 | this.info = info; 36 | type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility 37 | : Shroud.SourceType.PassiveVisibility; 38 | } 39 | 40 | protected override void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) 41 | { 42 | if (!info.ValidRelationships.HasRelationship(p.RelationshipWith(self.Owner))) 43 | return; 44 | 45 | p.Shroud.AddSource(this, type, uv); 46 | } 47 | 48 | protected override void RemoveCellsFromPlayerShroud(Actor self, Player p) { p.Shroud.RemoveSource(this); } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Traits/PaletteEffects/D2WindtrapPaletteEffect.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System.Collections.Generic; 13 | using OpenRA.Graphics; 14 | using OpenRA.Traits; 15 | 16 | namespace OpenRA.Mods.D2.Traits 17 | { 18 | [Desc("Palette effect used for windtrap \"animations\".")] 19 | class D2WindtrapPaletteEffectInfo : TraitInfo 20 | { 21 | [Desc("Palette for effect.")] 22 | public string PaletteName = "player"; 23 | 24 | [Desc("Palette index where Rotated color will be copied.")] 25 | public readonly int RotationIndex = 223; 26 | 27 | [Desc("Palette index of first RotationRange color.")] 28 | public readonly int RotationBase = 160; 29 | 30 | [Desc("Range of colors to rotate.")] 31 | public readonly int RotationRange = 4; 32 | 33 | [Desc("Step towards next color index per tick.")] 34 | public readonly float RotationStep = .2f; 35 | 36 | public override object Create(ActorInitializer init) { return new D2WindtrapPaletteEffect(init.World, this); } 37 | } 38 | 39 | class D2WindtrapPaletteEffect : ITick, IPaletteModifier 40 | { 41 | readonly D2WindtrapPaletteEffectInfo info; 42 | float t = 0; 43 | float step; 44 | 45 | public D2WindtrapPaletteEffect(World world, D2WindtrapPaletteEffectInfo info) 46 | { 47 | this.info = info; 48 | step = info.RotationStep; 49 | } 50 | 51 | void ITick.Tick(Actor self) 52 | { 53 | t += step; 54 | if (t >= info.RotationRange || t <= 0) step = -step; 55 | } 56 | 57 | public void AdjustPalette(IReadOnlyDictionary palettes) 58 | { 59 | var rotate = (int)t % (info.RotationRange + 1); 60 | 61 | foreach (var kvp in palettes) 62 | { 63 | if (kvp.Key.StartsWith(info.PaletteName)) 64 | { 65 | var palette = kvp.Value; 66 | palette[info.RotationIndex] = palette[info.RotationBase + rotate]; 67 | } 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/UtilityCommands/D2ImportMapD2Command.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using System.IO; 14 | using OpenRA.FileSystem; 15 | using OpenRA.Mods.D2.ImportData; 16 | 17 | namespace OpenRA.Mods.D2.UtilityCommands 18 | { 19 | class D2ImportD2MapCommand : IUtilityCommand 20 | { 21 | string IUtilityCommand.Name { get { return "--import-d2-map"; } } 22 | 23 | bool IUtilityCommand.ValidateArguments(string[] args) 24 | { 25 | return args.Length >= 3; 26 | } 27 | 28 | [Desc("FILENAME", "TILESET", "Convert a legacy Dune 2 MAP file to the OpenRA format.")] 29 | void IUtilityCommand.Run(Utility utility, string[] args) 30 | { 31 | // HACK: The engine code assumes that Game.modData is set. 32 | Game.ModData = utility.ModData; 33 | 34 | var rules = Ruleset.LoadDefaultsForTileSet(utility.ModData, "arrakis2"); 35 | var map = D2MapImporter.Import(args[1], utility.ModData.Manifest.Id, args[2], rules); 36 | 37 | if (map == null) 38 | return; 39 | 40 | var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap"; 41 | map.Save(ZipFileLoader.Create(dest)); 42 | Console.WriteLine(dest + " saved."); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Widgets/D2ButtonWidget.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2020 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using OpenRA.Mods.Common.Widgets; 14 | using OpenRA.Primitives; 15 | using OpenRA.Widgets; 16 | 17 | namespace OpenRA.Mods.D2.Widgets 18 | { 19 | public class D2ButtonWidget : ButtonWidget 20 | { 21 | public int BarMargin = 3; 22 | 23 | public Func GetBackgroundColor; 24 | 25 | [ObjectCreator.UseCtor] 26 | public D2ButtonWidget(ModData modData) 27 | : base(modData) 28 | { 29 | GetBackgroundColor = () => Color.FromArgb(186, 190, 150); 30 | } 31 | 32 | protected D2ButtonWidget(D2ButtonWidget other) 33 | : base(other) 34 | { 35 | GetBackgroundColor = other.GetBackgroundColor; 36 | } 37 | 38 | public override Widget Clone() { return new D2ButtonWidget(this); } 39 | 40 | public override void DrawBackground(Rectangle rect, bool disabled, bool pressed, bool hover, bool highlighted) 41 | { 42 | D2DrawBackground(GetBackgroundColor(), BarMargin, rect, disabled, pressed, hover, highlighted); 43 | } 44 | 45 | public static void D2DrawBackground(Color color, int margin, Rectangle rect, bool disabled, bool pressed, bool hover, bool highlighted) 46 | { 47 | WidgetUtils.FillRectWithColor(rect, color); 48 | D2WidgetUtils.DrawPanelBorder(rect, margin, pressed || highlighted); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Widgets/D2LineWidget.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using OpenRA.Primitives; 14 | using OpenRA.Widgets; 15 | 16 | namespace OpenRA.Mods.D2.Widgets 17 | { 18 | public class D2LineWidget : Widget 19 | { 20 | public int Size = 3; 21 | public Func GetColor; 22 | 23 | public D2LineWidget() 24 | { 25 | GetColor = () => Color.FromArgb(251, 255, 203); 26 | } 27 | 28 | protected D2LineWidget(D2LineWidget widget) 29 | : base(widget) 30 | { 31 | GetColor = widget.GetColor; 32 | } 33 | 34 | public override Widget Clone() 35 | { 36 | return new D2LineWidget(this); 37 | } 38 | 39 | public override void Draw() 40 | { 41 | var rb = RenderBounds; 42 | D2WidgetUtils.DrawLine( 43 | new float2(rb.Left, rb.Top), 44 | new float2(rb.Right, rb.Bottom), Size, GetColor()); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Widgets/D2PanelWidget.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using OpenRA.Mods.Common.Widgets; 14 | using OpenRA.Primitives; 15 | using OpenRA.Widgets; 16 | 17 | namespace OpenRA.Mods.D2.Widgets 18 | { 19 | public class D2PanelWidget : Widget 20 | { 21 | public int BarMargin = 3; 22 | 23 | public Func GetColor; 24 | 25 | public Action OnMouseDown = _ => { }; 26 | public Action OnMouseUp = _ => { }; 27 | 28 | public D2PanelWidget() 29 | { 30 | GetColor = () => Color.FromArgb(186, 190, 150); 31 | } 32 | 33 | protected D2PanelWidget(D2PanelWidget other) 34 | : base(other) 35 | { 36 | GetColor = other.GetColor; 37 | } 38 | 39 | public override Widget Clone() 40 | { 41 | return new D2PanelWidget(this); 42 | } 43 | 44 | public override void Draw() 45 | { 46 | var rb = RenderBounds; 47 | WidgetUtils.FillRectWithColor(rb, GetColor()); 48 | D2WidgetUtils.DrawPanelBorder(rb, BarMargin); 49 | } 50 | 51 | public override bool HandleMouseInput(MouseInput mi) 52 | { 53 | if (mi.Button != MouseButton.Left) 54 | return false; 55 | 56 | if (mi.Event == MouseInputEvent.Down && !TakeMouseFocus(mi)) 57 | return false; 58 | 59 | if (HasMouseFocus && mi.Event == MouseInputEvent.Up) 60 | { 61 | // Only fire the onMouseUp event if we successfully lost focus, and were pressed 62 | OnMouseUp(mi); 63 | 64 | return YieldMouseFocus(mi); 65 | } 66 | 67 | if (mi.Event == MouseInputEvent.Down) 68 | { 69 | // OnMouseDown returns false if the button shouldn't be pressed 70 | OnMouseDown(mi); 71 | } 72 | 73 | return false; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Widgets/D2ProgressBarWidget.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using System; 13 | using OpenRA.Mods.Common.Widgets; 14 | using OpenRA.Primitives; 15 | using OpenRA.Widgets; 16 | 17 | namespace OpenRA.Mods.D2.Widgets 18 | { 19 | public class D2ProgressBarWidget : Widget 20 | { 21 | public int BarMargin = 3; 22 | 23 | public int Percentage = 0; 24 | 25 | public Func GetPercentage; 26 | 27 | public D2ProgressBarWidget() 28 | { 29 | GetPercentage = () => Percentage; 30 | } 31 | 32 | protected D2ProgressBarWidget(D2ProgressBarWidget other) 33 | : base(other) 34 | { 35 | Percentage = other.Percentage; 36 | GetPercentage = other.GetPercentage; 37 | } 38 | 39 | public override void Draw() 40 | { 41 | if (GetPercentage == null) 42 | return; 43 | 44 | var rb = RenderBounds; 45 | var r = new Rectangle(rb.Left, rb.Top, rb.Width, rb.Height - 3 * BarMargin); 46 | 47 | var percentage = GetPercentage(); 48 | 49 | var backgroundColor = Color.FromArgb(186, 190, 150); 50 | 51 | WidgetUtils.FillRectWithColor(rb, backgroundColor); 52 | D2WidgetUtils.DrawPanelBorder(r, BarMargin); 53 | 54 | D2WidgetUtils.DrawRedTriangle(new int2(r.Left + BarMargin * 2, r.Bottom), BarMargin); 55 | D2WidgetUtils.DrawYellowTriangle(new int2((r.Left + r.Right) / 2, r.Bottom), BarMargin); 56 | D2WidgetUtils.DrawGreenTriangle(new int2(r.Right - 2 * BarMargin, r.Bottom), BarMargin); 57 | 58 | var minBarWidth = 1; 59 | var maxBarWidth = r.Width - BarMargin * 2; 60 | var barWidth = percentage * maxBarWidth / 100; 61 | barWidth = Math.Max(barWidth, minBarWidth); 62 | 63 | var barRect = new Rectangle(r.X + BarMargin, r.Y + BarMargin, barWidth, r.Height - 2 * BarMargin); 64 | var barColor = Color.FromArgb(85, 254, 81); 65 | if (percentage < 25) 66 | barColor = Color.FromArgb(168, 0, 0); 67 | else if (percentage < 50) 68 | barColor = Color.FromArgb(254, 251, 84); 69 | 70 | WidgetUtils.FillRectWithColor(barRect, barColor); 71 | } 72 | 73 | public override Widget Clone() { return new D2ProgressBarWidget(this); } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /OpenRA.Mods.D2/Widgets/D2SpriteWidget.cs: -------------------------------------------------------------------------------- 1 | #region Copyright & License Information 2 | /* 3 | * Copyright 2007-2019 The d2 mod Developers (see AUTHORS) 4 | * This file is part of OpenRA, which is free software. It is made 5 | * available to you under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation, either version 3 of 7 | * the License, or (at your option) any later version. For more 8 | * information, see COPYING. 9 | */ 10 | #endregion 11 | 12 | using OpenRA.Graphics; 13 | using OpenRA.Mods.Common.Widgets; 14 | using OpenRA.Widgets; 15 | 16 | namespace OpenRA.Mods.D2.Widgets 17 | { 18 | public class D2SpriteWidget : Widget 19 | { 20 | public readonly World World; 21 | 22 | public Sprite Sprite = null; 23 | public PaletteReference Palette = null; 24 | public float2 Offset = float2.Zero; 25 | public float Scale = 1.0f; 26 | 27 | readonly WorldRenderer worldRenderer; 28 | 29 | [ObjectCreator.UseCtor] 30 | public D2SpriteWidget(World world, WorldRenderer worldRenderer) 31 | { 32 | World = world; 33 | this.worldRenderer = worldRenderer; 34 | } 35 | 36 | public override void Draw() 37 | { 38 | if (Sprite == null) 39 | return; 40 | 41 | var pos = new float2(RenderBounds.Location); 42 | var f = Scale / 2.0f; 43 | var center = new float2(Sprite.Size.X * f, Sprite.Size.Y * f); 44 | 45 | WidgetUtils.DrawSpriteCentered(Sprite, Palette, pos + center + Offset, Scale); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # d2 mod for OpenRA 2 | 3 | This repository contains a `d2 mod` for the [OpenRA](https://github.com/OpenRA/OpenRA) engine. 4 | It is based on [OpenRAModSDK](https://github.com/OpenRA/OpenRAModSDK) and should be updated if `OpenRAModSDK` changed 5 | 6 | These scripts and support files from `OpenRAModSDK` wrap and automatically manage a copy of the OpenRA game engine and common files, 7 | and provide entrypoints to run development versions and to generate platform-specific installers. 8 | 9 | Before run `d2 mod`, Download the Original Game and copy following files: 10 | - `DUNE.PAK` 11 | - `VOC.PAK` 12 | - `ATRE.PAK` 13 | - `HARK.PAK` 14 | - `ORDOS.PAK` 15 | - `INTRO.PAK` 16 | - `FINALE.PAK` 17 | - `SCENARIO.PAK` 18 | 19 | Paste those files into `d2` directory. If this directory doesn't exist, create it: 20 | - `%USERPROFILE%\AppData\Roaming\OpenRA\Content\d2` (Windows) 21 | - `~/Library/Application Support/OpenRA/Content/d2` (macOS) 22 | - `~/.openra/Content/d2` (Linux) 23 | 24 | The key scripts from [OpenRAModSDK](https://github.com/OpenRA/OpenRAModSDK) are: 25 | 26 | | Windows | Linux / macOS | Purpose 27 | | --------------------- | ------------------------ | ------------- | 28 | | make.cmd | Makefile | Compiles `d2 mod` and fetches dependencies (including the OpenRA engine). 29 | | launch-game.cmd | launch-game.sh | Launches `d2 mod` from the SDK directory. 30 | | launch-server.cmd | launch-server.sh | Launches a dedicated server for `d2 mod` from the `d2 mod` directory. 31 | | utility.cmd | utility.sh | Launches the OpenRA Utility for `d2 mod`. 32 | | <not available> | packaging/package-all.sh | Generates release installers for `d2 mod`. 33 | 34 | To launch `d2 mod` from the development environment you must first compile it by running `make.cmd` (Windows), 35 | or opening a terminal in the SDK directory and running `make` (Linux / macOS). 36 | 37 | Now you can run `d2 mod` using `launch-game.cmd` (Windows) or `launch-game.sh` (Linux / macOS). 38 | Currently `d2 mod` uses some data from `d2k mod`. You will be prompt to download d2k content on first run. 39 | 40 | 41 | ## License 42 | `d2 mod` is free software. It is made available to you under the terms of the GNU General Public License 43 | as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 44 | For more information, see [COPYING](https://github.com/OpenRA/d2/blob/bleed/COPYING). 45 | 46 | 47 | ## Authors 48 | d2 mod for OpenRA [AUTHORS](https://github.com/OpenRA/d2/blob/master/mods/d2/AUTHORS) 49 | 50 | Special thanks to [OpenRA AUTHORS](https://github.com/OpenRA/OpenRA/blob/bleed/AUTHORS) 51 | 52 | 53 | ------------------------------------------------------------------------------------------------------------------------- 54 | 55 | More information can be found here: [wiki](https://github.com/OpenRA/d2/wiki) 56 | -------------------------------------------------------------------------------- /launch-dedicated.cmd: -------------------------------------------------------------------------------- 1 | :: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated for details 2 | 3 | @echo on 4 | 5 | set Name="Dedicated Server" 6 | set ListenPort=1234 7 | set AdvertiseOnline=True 8 | set Password="" 9 | set RecordReplays=False 10 | 11 | set RequireAuthentication=False 12 | set ProfileIDBlacklist="" 13 | set ProfileIDWhitelist="" 14 | 15 | set EnableSingleplayer=False 16 | set EnableSyncReports=False 17 | set EnableGeoIP=True 18 | set EnableLintChecks=True 19 | set ShareAnonymizedIPs=True 20 | 21 | set JoinChatDelay=5000 22 | 23 | @echo off 24 | setlocal EnableDelayedExpansion 25 | 26 | title %Name% 27 | FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) 28 | if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) 29 | set MOD_SEARCH_PATHS=%~dp0mods,./mods 30 | 31 | if "!MOD_ID!" == "" goto badconfig 32 | if "!ENGINE_VERSION!" == "" goto badconfig 33 | if "!ENGINE_DIRECTORY!" == "" goto badconfig 34 | 35 | if not exist %ENGINE_DIRECTORY%\bin\OpenRA.exe goto noengine 36 | >nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine 37 | cd %ENGINE_DIRECTORY% 38 | 39 | :loop 40 | bin\OpenRA.Server.exe Game.Mod=%MOD_ID% Engine.EngineDir=".." Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.RecordReplays=%RecordReplays% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Server.EnableLintChecks=%EnableLintChecks% Engine.SupportDir=%SupportDir% Server.JoinChatDelay=%JoinChatDelay% 41 | goto loop 42 | 43 | :noengine 44 | echo Required engine files not found. 45 | echo Run `make all` in the mod directory to fetch and build the required files, then try again. 46 | pause 47 | exit /b 48 | 49 | :badconfig 50 | echo Required mod.config variables are missing. 51 | echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are 52 | echo defined in your mod.config (or user.config) and try again. 53 | pause 54 | exit /b 55 | -------------------------------------------------------------------------------- /launch-game.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal EnableDelayedExpansion 3 | title OpenRA 4 | 5 | FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) 6 | if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) 7 | set TEMPLATE_LAUNCHER=%0 8 | set MOD_SEARCH_PATHS=%~dp0mods,./mods 9 | 10 | if "!MOD_ID!" == "" goto badconfig 11 | if "!ENGINE_VERSION!" == "" goto badconfig 12 | if "!ENGINE_DIRECTORY!" == "" goto badconfig 13 | 14 | set TEMPLATE_DIR=%CD% 15 | if not exist %ENGINE_DIRECTORY%\bin\OpenRA.exe goto noengine 16 | >nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine 17 | cd %ENGINE_DIRECTORY% 18 | 19 | bin\OpenRA.exe Game.Mod=%MOD_ID% Engine.EngineDir=".." Engine.LaunchPath="%TEMPLATE_LAUNCHER%" Engine.ModSearchPaths="%MOD_SEARCH_PATHS%" "%*" 20 | set ERROR=%errorlevel% 21 | cd %TEMPLATE_DIR% 22 | 23 | if %ERROR% neq 0 goto crashdialog 24 | exit /b 25 | 26 | :noengine 27 | echo Required engine files not found. 28 | echo Run `make all` in the mod directory to fetch and build the required files, then try again. 29 | pause 30 | exit /b 31 | 32 | :badconfig 33 | echo Required mod.config variables are missing. 34 | echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are 35 | echo defined in your mod.config (or user.config) and try again. 36 | pause 37 | exit /b 38 | 39 | :crashdialog 40 | echo ---------------------------------------- 41 | echo OpenRA has encountered a fatal error. 42 | echo * Log Files are available in Documents\OpenRA\Logs 43 | echo * FAQ is available at https://github.com/OpenRA/OpenRA/wiki/FAQ 44 | echo ---------------------------------------- 45 | pause 46 | -------------------------------------------------------------------------------- /launch-game.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | if ! command -v mono >/dev/null 2>&1; then 5 | command -v dotnet >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires dotnet or mono."; exit 1; } 6 | fi 7 | 8 | if command -v python3 >/dev/null 2>&1; then 9 | PYTHON="python3" 10 | else 11 | command -v python >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires python."; exit 1; } 12 | PYTHON="python" 13 | fi 14 | 15 | require_variables() { 16 | missing="" 17 | for i in "$@"; do 18 | eval check="\$$i" 19 | [ -z "${check}" ] && missing="${missing} ${i}\n" 20 | done 21 | if [ ! -z "${missing}" ]; then 22 | echo "Required mod.config variables are missing:\n${missing}Repair your mod.config (or user.config) and try again." 23 | exit 1 24 | fi 25 | } 26 | 27 | TEMPLATE_LAUNCHER=$(${PYTHON} -c "import os; print(os.path.realpath('$0'))") 28 | TEMPLATE_ROOT=$(dirname "${TEMPLATE_LAUNCHER}") 29 | MOD_SEARCH_PATHS="${TEMPLATE_ROOT}/mods,./mods" 30 | 31 | # shellcheck source=mod.config 32 | . "${TEMPLATE_ROOT}/mod.config" 33 | 34 | if [ -f "${TEMPLATE_ROOT}/user.config" ]; then 35 | # shellcheck source=user.config 36 | . "${TEMPLATE_ROOT}/user.config" 37 | fi 38 | 39 | require_variables "MOD_ID" "ENGINE_VERSION" "ENGINE_DIRECTORY" 40 | 41 | cd "${TEMPLATE_ROOT}" 42 | if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.dll" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then 43 | echo "Required engine files not found." 44 | echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; 45 | exit 1 46 | fi 47 | 48 | if command -v mono >/dev/null 2>&1 && [ "$(grep -c .NETCoreApp,Version= ${ENGINE_DIRECTORY}/bin/OpenRA.dll)" = "0" ]; then 49 | RUNTIME_LAUNCHER="mono --debug" 50 | else 51 | RUNTIME_LAUNCHER="dotnet" 52 | fi 53 | 54 | cd "${ENGINE_DIRECTORY}" 55 | ${RUNTIME_LAUNCHER} bin/OpenRA.dll Game.Mod="${MOD_ID}" Engine.EngineDir=".." Engine.LaunchPath="${TEMPLATE_LAUNCHER}" Engine.ModSearchPaths="${MOD_SEARCH_PATHS}" "$@" 56 | -------------------------------------------------------------------------------- /make.cmd: -------------------------------------------------------------------------------- 1 | @powershell -NoProfile -ExecutionPolicy Bypass -File make.ps1 %* 2 | -------------------------------------------------------------------------------- /mods/d2/audio/music.yaml: -------------------------------------------------------------------------------- 1 | ARAKATAK: Attack on Arrakis 2 | Extension: AUD 3 | ENTORDOS: Enter the Ordos 4 | Extension: AUD 5 | FIGHTPWR: Fight for Power 6 | Extension: AUD 7 | HARK_BAT: Harkonnen Battle 8 | Extension: AUD 9 | LANDSAND: Land of Sand 10 | Extension: AUD 11 | OPTIONS: Options 12 | Extension: AUD 13 | Hidden: true 14 | PLOTTING: Plotting 15 | Extension: AUD 16 | RISEHARK: Rise of Harkonnen 17 | Extension: AUD 18 | ROBOTIX: Robotix 19 | Extension: AUD 20 | SCORE: Score 21 | Extension: AUD 22 | Hidden: true 23 | SPICESCT: Spice Scouting 24 | Extension: AUD 25 | AMBUSH: The Ambush 26 | Extension: AUD 27 | ATREGAIN: The Atreides Gain 28 | Extension: AUD 29 | FREMEN: The Fremen 30 | Extension: AUD 31 | SOLDAPPR: The Soldiers Approach 32 | Extension: AUD 33 | WAITGAME: The Waiting Game 34 | Extension: AUD 35 | UNDERCON: Under Construction 36 | Extension: AUD 37 | -------------------------------------------------------------------------------- /mods/d2/audio/notifications.yaml: -------------------------------------------------------------------------------- 1 | Speech: 2 | DefaultVariant: .VOC 3 | Prefixes: 4 | atreides: A 5 | ordos: O 6 | harkonnen: H 7 | Notifications: 8 | BaseAttack: ATTACK 9 | Building: 10 | BuildingCannotPlaceAudio: 11 | BuildingCaptured: CAPTURE 12 | BuildingLost: DESTROY 13 | BuildingReady: CONST 14 | Cancelled: 15 | CannotDeploy: 16 | DeathHandMissilePrepping: 17 | DeathHandMissileReady: 18 | EnemyUnitsApproaching: 19 | EnemyUnitsDetected: 20 | GameLoaded: 21 | GameSaved: 22 | Guarding: 23 | HarvesterAttack: 24 | InsufficientFunds: 25 | Leave: LOSE 26 | Lose: LOSE 27 | LowPower: 28 | MissileLaunchDetected: 29 | NewOptions: 30 | NoRoom: 31 | OnHold: 32 | OrderPlaced: 33 | PrimaryBuildingSelected: 34 | Reinforce: 35 | Repairing: 36 | Retreating: 37 | SilosNeeded: 38 | StarportActions: 39 | StartGame: 40 | StructureSold: 41 | TMinusFive: 42 | TMinusFour: 43 | TMinusOne: 44 | TMinusThree: 45 | TMinusTwo: 46 | Training: 47 | UnitLost: 48 | UnitReady: 49 | UnitRepaired: REPAIR 50 | UpgradeOptions: 51 | Upgrading: 52 | Win: WIN 53 | WormAttack: 54 | WormSign: WORMY 55 | 56 | Sounds: 57 | DefaultVariant: .VOC 58 | Notifications: 59 | RadarUp: STATICP 60 | RadarDown: STATICP 61 | DisablePower: HON 62 | EnablePower: HOFF 63 | CashTickUp: 64 | CashTickDown: 65 | LevelUp: 66 | ChatLine: 67 | BuildPaletteOpen: BUTTON 68 | BuildPaletteClose: BUTTON 69 | TabClick: 70 | ClickSound: BUTTON 71 | ClickDisabledSound: 72 | Beacon: 73 | -------------------------------------------------------------------------------- /mods/d2/audio/voices.yaml: -------------------------------------------------------------------------------- 1 | GenericVoice: 2 | DefaultVariant: .VOC 3 | Voices: 4 | Select: REPORT2 5 | Action: AFFIRM 6 | Die: VSCREAM1, VSCREAM2, VSCREAM3, VSCREAM4, VSCREAM5 7 | Guard: 8 | 9 | VehicleVoice: 10 | DefaultVariant: .VOC 11 | Voices: 12 | Select: REPORT2 13 | Action: REPORT3, AFFIRM 14 | Guard: 15 | 16 | InfantryVoice: 17 | DefaultVariant: .VOC 18 | Voices: 19 | Select: REPORT1 20 | Action: OVEROUT, MOVEOUT 21 | Die: VSCREAM1, VSCREAM2, VSCREAM3, VSCREAM4, VSCREAM5 22 | Guard: OVEROUT 23 | 24 | FremenVoice: 25 | DefaultVariant: .VOC 26 | Voices: 27 | Select: REPORT1 28 | Action: OVEROUT, MOVEOUT 29 | Die: VSCREAM1, VSCREAM2, VSCREAM3, VSCREAM4, VSCREAM5 30 | Guard: OVEROUT 31 | 32 | SaboteurVoice: 33 | DefaultVariant: .VOC 34 | Voices: 35 | Select: REPORT1 36 | Action: OVEROUT, MOVEOUT 37 | Die: VSCREAM1, VSCREAM2, VSCREAM3, VSCREAM4, VSCREAM5 38 | Guard: OVEROUT 39 | -------------------------------------------------------------------------------- /mods/d2/bits/transparent.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/bits/transparent.shp -------------------------------------------------------------------------------- /mods/d2/hotkeys.yaml: -------------------------------------------------------------------------------- 1 | ProductionTypeBuilding: E 2 | Description: Building Tab 3 | Types: Production 4 | 5 | ProductionTypeUpgrade: R 6 | Description: Upgrade Tab 7 | Types: Production 8 | 9 | ProductionTypeInfantry: T 10 | Description: Infantry Tab 11 | Types: Production 12 | 13 | ProductionTypeVehicle: Y 14 | Description: Vehicle Tab 15 | Types: Production 16 | 17 | ProductionTypeAircraft: U 18 | Description: Aircraft Tab 19 | Types: Production 20 | 21 | ProductionTypeTank: I 22 | Description: Tank Tab 23 | Types: Production 24 | 25 | ProductionTypeMerchant: O 26 | Description: Starport Tab 27 | Types: Production 28 | 29 | PowerDown: X 30 | Description: Power-down mode 31 | Types: OrderGenerator 32 | -------------------------------------------------------------------------------- /mods/d2/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/icon.png -------------------------------------------------------------------------------- /mods/d2/maps/map1/map.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/map1/map.bin -------------------------------------------------------------------------------- /mods/d2/maps/map1/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/map1/map.png -------------------------------------------------------------------------------- /mods/d2/maps/map1/map.yaml: -------------------------------------------------------------------------------- 1 | MapFormat: 11 2 | 3 | RequiresMod: d2 4 | 5 | Title: Name your map here 6 | 7 | Author: Your name here 8 | 9 | Tileset: arrakis2 10 | 11 | MapSize: 130,130 12 | 13 | Bounds: 1,1,128,128 14 | 15 | Visibility: Lobby 16 | 17 | Categories: Conquest 18 | 19 | Players: 20 | PlayerReference@Neutral: 21 | Name: Neutral 22 | OwnsWorld: True 23 | NonCombatant: True 24 | Faction: Random 25 | PlayerReference@Creeps: 26 | Name: Creeps 27 | NonCombatant: True 28 | Faction: Random 29 | Enemies: Multi0, Multi1, Multi2, Multi3, Multi4 30 | PlayerReference@Multi0: 31 | Name: Multi0 32 | Playable: True 33 | Faction: Random 34 | Enemies: Creeps 35 | PlayerReference@Multi1: 36 | Name: Multi1 37 | Playable: True 38 | Faction: Random 39 | Enemies: Creeps 40 | PlayerReference@Multi2: 41 | Name: Multi2 42 | Playable: True 43 | Faction: Random 44 | Enemies: Creeps 45 | PlayerReference@Multi3: 46 | Name: Multi3 47 | Playable: True 48 | Faction: Random 49 | Enemies: Creeps 50 | PlayerReference@Multi4: 51 | Name: Multi4 52 | Playable: True 53 | Faction: Random 54 | Enemies: Creeps 55 | 56 | Actors: 57 | Actor0: mpspawn 58 | Owner: Neutral 59 | Location: 69,46 60 | Actor1: mpspawn 61 | Owner: Neutral 62 | Location: 42,73 63 | Actor9: wormspawner 64 | Owner: Neutral 65 | Location: 59,70 66 | Actor10: mpspawn 67 | Owner: Neutral 68 | Location: 68,80 69 | Actor11: mpspawn 70 | Owner: Neutral 71 | Location: 49,43 72 | Actor12: mpspawn 73 | Owner: Neutral 74 | Location: 17,70 75 | Actor13: wormspawner 76 | Owner: Neutral 77 | Location: 62,50 78 | Actor14: wormspawner 79 | Owner: Neutral 80 | Location: 78,50 81 | Actor15: wormspawner 82 | Owner: Neutral 83 | Location: 68,65 84 | Actor16: wormspawner 85 | Owner: Neutral 86 | Location: 76,79 87 | Actor17: wormspawner 88 | Owner: Neutral 89 | Location: 52,64 90 | Actor18: wormspawner 91 | Owner: Neutral 92 | Location: 42,81 93 | Actor19: wormspawner 94 | Owner: Neutral 95 | Location: 48,50 96 | Actor20: wormspawner 97 | Owner: Neutral 98 | Location: 35,55 99 | Actor21: wormspawner 100 | Owner: Neutral 101 | Location: 17,74 102 | -------------------------------------------------------------------------------- /mods/d2/maps/oh-gap.oramap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/oh-gap.oramap -------------------------------------------------------------------------------- /mods/d2/maps/scena001/map.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/scena001/map.bin -------------------------------------------------------------------------------- /mods/d2/maps/scena001/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/scena001/map.png -------------------------------------------------------------------------------- /mods/d2/maps/scena001/map.yaml: -------------------------------------------------------------------------------- 1 | MapFormat: 11 2 | 3 | RequiresMod: d2 4 | 5 | Title: Atreides 01 6 | 7 | Author: Westwood Studios 8 | 9 | Tileset: arrakis2 10 | 11 | MapSize: 34,34 12 | 13 | Bounds: 1,1,32,32 14 | 15 | Visibility: MissionSelector 16 | 17 | Categories: Mission 18 | 19 | Players: 20 | PlayerReference@Neutral: 21 | Name: Neutral 22 | OwnsWorld: True 23 | NonCombatant: True 24 | Faction: Random 25 | PlayerReference@Creeps: 26 | Name: Creeps 27 | NonCombatant: True 28 | Faction: Random 29 | Enemies: Atreides, Ordos 30 | PlayerReference@Atreides: 31 | Name: Atreides 32 | Playable: True 33 | Faction: atreides 34 | LockFaction: True 35 | LockColor: True 36 | Color: 5079D6 37 | Enemies: Ordos 38 | PlayerReference@Ordos: 39 | Name: Ordos 40 | Faction: ordos 41 | LockFaction: True 42 | LockColor: True 43 | Color: 4CD64C 44 | Enemies: Atreides 45 | 46 | Actors: 47 | Actor0: spicebloom 48 | Owner: Neutral 49 | Location: 26,22 50 | AConyard: construction_yard 51 | Owner: Atreides 52 | Location: 15,10 53 | Actor4: light_inf 54 | Owner: Atreides 55 | Location: 18,9 56 | SubCell: 3 57 | Facing: 768 58 | Actor7: light_inf 59 | Owner: Atreides 60 | Location: 18,11 61 | SubCell: 3 62 | Facing: 512 63 | Actor8: light_inf 64 | Owner: Atreides 65 | Location: 16,7 66 | SubCell: 3 67 | Facing: 768 68 | Actor5: trike 69 | Owner: Atreides 70 | Location: 17,13 71 | Facing: 640 72 | Actor9: trike 73 | Owner: Atreides 74 | Location: 14,8 75 | Facing: 128 76 | Actor10: light_inf 77 | Owner: Ordos 78 | Location: 7,7 79 | SubCell: 3 80 | Facing: 768 81 | Actor11: light_inf 82 | Owner: Ordos 83 | Location: 10,13 84 | SubCell: 3 85 | Facing: 768 86 | Actor12: light_inf 87 | Owner: Ordos 88 | Location: 9,19 89 | SubCell: 3 90 | Facing: 768 91 | Actor13: light_inf 92 | Owner: Ordos 93 | Location: 19,20 94 | SubCell: 3 95 | Facing: 768 96 | Actor14: light_inf 97 | Owner: Ordos 98 | Location: 25,15 99 | SubCell: 3 100 | Facing: 768 101 | Actor15: light_inf 102 | Owner: Ordos 103 | Location: 28,23 104 | SubCell: 3 105 | Facing: 768 106 | Actor16: light_inf 107 | Owner: Ordos 108 | Location: 22,29 109 | SubCell: 3 110 | Facing: 768 111 | Actor17: light_inf 112 | Owner: Ordos 113 | Location: 14,25 114 | SubCell: 3 115 | Facing: 768 116 | Actor18: light_inf 117 | Owner: Ordos 118 | Location: 2,31 119 | SubCell: 3 120 | Facing: 768 121 | 122 | Rules: d2|rules/campaign-rules.yaml, rules.yaml 123 | -------------------------------------------------------------------------------- /mods/d2/maps/scena001/rules.yaml: -------------------------------------------------------------------------------- 1 | Player: 2 | PlayerResources: 3 | DefaultCash: 1000 4 | 5 | World: 6 | LuaScript: 7 | Scripts: campaign-global.lua, scena001.lua 8 | MapOptions: 9 | TechLevel: low 10 | ScriptLobbyDropdown@difficulty: 11 | ID: difficulty 12 | Label: Difficulty 13 | Values: 14 | easy: Easy 15 | normal: Normal 16 | hard: Hard 17 | Default: easy 18 | MissionData: 19 | Briefing: Harvest some spice 20 | StartVideo: INTRO2.WSA 21 | 22 | upgrade.conyard: 23 | Buildable: 24 | Prerequisites: ~disabled 25 | 26 | upgrade.barracks: 27 | Buildable: 28 | Prerequisites: ~disabled 29 | 30 | upgrade.light: 31 | Buildable: 32 | Prerequisites: ~disabled 33 | 34 | upgrade.heavy: 35 | Buildable: 36 | Prerequisites: ~disabled 37 | 38 | concreteb: 39 | Buildable: 40 | Prerequisites: ~disabled 41 | 42 | barracks: 43 | Buildable: 44 | Prerequisites: ~disabled 45 | 46 | light_factory: 47 | Buildable: 48 | Prerequisites: ~disabled 49 | 50 | heavy_factory: 51 | Buildable: 52 | Prerequisites: ~disabled 53 | 54 | outpost: 55 | Buildable: 56 | Prerequisites: ~disabled 57 | 58 | gun_turret: 59 | Buildable: 60 | Prerequisites: ~disabled 61 | 62 | wall: 63 | Buildable: 64 | Prerequisites: ~disabled 65 | 66 | silo: 67 | Buildable: 68 | Prerequisites: ~disabled 69 | -------------------------------------------------------------------------------- /mods/d2/maps/scena001/scena001.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Copyright 2007-2018 The OpenRA Developers (see AUTHORS) 3 | This file is part of OpenRA, which is free software. It is made 4 | available to you under the terms of the GNU General Public License 5 | as published by the Free Software Foundation, either version 3 of 6 | the License, or (at your option) any later version. For more 7 | information, see COPYING. 8 | ]] 9 | 10 | ToHarvest = 11 | { 12 | easy = 1000, 13 | normal = 1500, 14 | hard = 2000 15 | } 16 | 17 | Tick = function() 18 | if ordos.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillOrdos) then 19 | player.MarkCompletedObjective(KillOrdos) 20 | end 21 | 22 | if player.Resources > SpiceToHarvest - 1 and not player.IsObjectiveCompleted(GatherSpice) then 23 | player.MarkCompletedObjective(GatherSpice) 24 | end 25 | 26 | UserInterface.SetMissionText("Produced Credits: " .. player.Resources .. "/" .. SpiceToHarvest, player.Color) 27 | end 28 | 29 | WorldLoaded = function() 30 | player = Player.GetPlayer("Atreides") 31 | ordos = Player.GetPlayer("Ordos") 32 | 33 | SpiceToHarvest = ToHarvest[Difficulty] 34 | 35 | InitObjectives(player) 36 | KillAtreides = ordos.AddPrimaryObjective("Kill all Atreides units.") 37 | GatherSpice = player.AddPrimaryObjective("Harvest Spice and produce " .. tostring(SpiceToHarvest) .. " Credits.") 38 | KillOrdos = player.AddSecondaryObjective("Eliminate all Ordos units in the area.") 39 | 40 | Camera.Position = AConyard.CenterPosition 41 | 42 | local checkResourceCapacity = function() 43 | Trigger.AfterDelay(0, function() 44 | if player.ResourceCapacity < SpiceToHarvest then 45 | Media.DisplayMessage("We don't have enough silo space to store the required amount of Spice!", "Mentat") 46 | Trigger.AfterDelay(DateTime.Seconds(3), function() 47 | ordos.MarkCompletedObjective(KillAtreides) 48 | end) 49 | 50 | return true 51 | end 52 | end) 53 | end 54 | 55 | Trigger.OnRemovedFromWorld(AConyard, function() 56 | 57 | -- Mission already failed, no need to check the other conditions as well 58 | if checkResourceCapacity() then 59 | return 60 | end 61 | 62 | local refs = Utils.Where(Map.ActorsInWorld, function(actor) return actor.Type == "refinery" and actor.Owner == player end) 63 | if #refs == 0 then 64 | ordos.MarkCompletedObjective(KillAtreides) 65 | else 66 | Trigger.OnAllRemovedFromWorld(refs, function() 67 | ordos.MarkCompletedObjective(KillAtreides) 68 | end) 69 | 70 | Utils.Do(refs, function(actor) Trigger.OnRemovedFromWorld(actor, checkResourceCapacity) end) 71 | end 72 | end) 73 | end 74 | -------------------------------------------------------------------------------- /mods/d2/maps/scena002/map.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/scena002/map.bin -------------------------------------------------------------------------------- /mods/d2/maps/scena002/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/scena002/map.png -------------------------------------------------------------------------------- /mods/d2/maps/scena002/rules.yaml: -------------------------------------------------------------------------------- 1 | Player: 2 | PlayerResources: 3 | DefaultCash: 1000 4 | 5 | World: 6 | LuaScript: 7 | Scripts: campaign-global.lua, scena002.lua, scena002-AI.lua 8 | MapOptions: 9 | TechLevel: low 10 | ScriptLobbyDropdown@difficulty: 11 | ID: difficulty 12 | Label: Difficulty 13 | Values: 14 | easy: Easy 15 | normal: Normal 16 | hard: Hard 17 | Default: easy 18 | MissionData: 19 | Briefing: Destroy the Ordos forces 20 | StartVideo: INTRO2.WSA 21 | 22 | upgrade.conyard: 23 | Buildable: 24 | Prerequisites: ~disabled 25 | 26 | upgrade.barracks: 27 | Buildable: 28 | Prerequisites: ~disabled 29 | 30 | upgrade.light: 31 | Buildable: 32 | Prerequisites: ~disabled 33 | 34 | upgrade.heavy: 35 | Buildable: 36 | Prerequisites: ~disabled 37 | 38 | concreteb: 39 | Buildable: 40 | Prerequisites: ~disabled 41 | 42 | wor: 43 | Buildable: 44 | Prerequisites: ~disabled 45 | 46 | heavy_factory: 47 | Buildable: 48 | Prerequisites: ~disabled 49 | 50 | gun_turret: 51 | Buildable: 52 | Prerequisites: ~disabled 53 | 54 | wall: 55 | Buildable: 56 | Prerequisites: ~disabled 57 | -------------------------------------------------------------------------------- /mods/d2/maps/scena002/scena002-AI.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Copyright 2007-2018 The OpenRA Developers (see AUTHORS) 3 | This file is part of OpenRA, which is free software. It is made 4 | available to you under the terms of the GNU General Public License 5 | as published by the Free Software Foundation, either version 3 of 6 | the License, or (at your option) any later version. For more 7 | information, see COPYING. 8 | ]] 9 | 10 | AttackGroupSize = 11 | { 12 | easy = 3, 13 | normal = 4, 14 | hard = 5 15 | } 16 | 17 | AttackDelays = 18 | { 19 | easy = { DateTime.Seconds(4), DateTime.Seconds(9) }, 20 | normal = { DateTime.Seconds(2), DateTime.Seconds(7) }, 21 | hard = { DateTime.Seconds(1), DateTime.Seconds(5) } 22 | } 23 | 24 | OrdosInfantryTypes = { "light_inf" } 25 | 26 | ActivateAI = function() 27 | IdlingUnits[ordos] = { } 28 | DefendAndRepairBase(ordos, OrdosBase, 0.75, AttackGroupSize[Difficulty]) 29 | 30 | local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end 31 | local toBuild = function() return OrdosInfantryTypes end 32 | local attackThresholdSize = AttackGroupSize[Difficulty] * 2.5 33 | ProduceUnits(ordos, OBarracks, delay, toBuild, AttackGroupSize[Difficulty], attackThresholdSize) 34 | end 35 | -------------------------------------------------------------------------------- /mods/d2/maps/scena002/scena002.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Copyright 2007-2018 The OpenRA Developers (see AUTHORS) 3 | This file is part of OpenRA, which is free software. It is made 4 | available to you under the terms of the GNU General Public License 5 | as published by the Free Software Foundation, either version 3 of 6 | the License, or (at your option) any later version. For more 7 | information, see COPYING. 8 | ]] 9 | 10 | OrdosBase = { OConyard, OPower, OBarracks, OOutpost, ORefinery } 11 | 12 | Tick = function() 13 | if ordos.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillOrdos) then 14 | player.MarkCompletedObjective(KillOrdos) 15 | end 16 | 17 | if player.HasNoRequiredUnits() and not ordos.IsObjectiveCompleted(KillAtreides) then 18 | ordos.MarkCompletedObjective(KillAtreides) 19 | end 20 | end 21 | 22 | WorldLoaded = function() 23 | player = Player.GetPlayer("Atreides") 24 | ordos = Player.GetPlayer("Ordos") 25 | 26 | InitObjectives(player) 27 | KillAtreides = ordos.AddPrimaryObjective("Destroy the Atreides.") 28 | KillOrdos = player.AddPrimaryObjective("Destroy the Ordos.") 29 | 30 | Camera.Position = AConyard.CenterPosition 31 | 32 | Trigger.AfterDelay(0, ActivateAI) 33 | end 34 | -------------------------------------------------------------------------------- /mods/d2/maps/shellmap/map.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/shellmap/map.bin -------------------------------------------------------------------------------- /mods/d2/maps/shellmap/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/mods/d2/maps/shellmap/map.png -------------------------------------------------------------------------------- /mods/d2/metrics.yaml: -------------------------------------------------------------------------------- 1 | # General dumping-ground for UI element sizes, etc. 2 | Metrics: 3 | ButtonDepth: 0 4 | ButtonFont: Bold 5 | ButtonTextColor: FFFFFF 6 | ButtonTextColorDisabled: 808080 7 | ButtonTextContrast: false 8 | ButtonTextShadow: true 9 | ButtonTextContrastColorDark: 000000 10 | ButtonTextContrastColorLight: 7F7F7F 11 | ButtonBaseLine: 0 12 | CheckboxPressedState: true 13 | HotkeyFont: Regular 14 | HotkeyColor: FFFFFF 15 | HotkeyColorDisabled: 808080 16 | TextfieldFont: Regular 17 | TextfieldColor: FFFFFF 18 | TextfieldColorDisabled: 808080 19 | TextfieldColorInvalid: FFC0C0 20 | TextfieldColorHighlight: 7f4d29 21 | TextFont: Regular 22 | TextColor: FFFFFF 23 | TextContrast: false 24 | TextShadow: false 25 | TextContrastColorDark: 000000 26 | TextContrastColorLight: 7F7F7F 27 | ChatLineSound: ChatLine 28 | ClickDisabledSound: ClickDisabledSound 29 | ClickSound: ClickSound 30 | ChatMessageColor: FFFFFF 31 | SystemMessageColor: FFFF00 32 | -------------------------------------------------------------------------------- /mods/d2/missions.yaml: -------------------------------------------------------------------------------- 1 | Atreides Campaign: 2 | ./mods/d2/maps/scena001 3 | ./mods/d2/maps/scena002 4 | -------------------------------------------------------------------------------- /mods/d2/rules/aircrafthusk.yaml: -------------------------------------------------------------------------------- 1 | ^AircraftHusk: 2 | Inherits: ^Husk 3 | Tooltip: 4 | GenericName: Unit 5 | WithShadow: 6 | FallsToEarth: 7 | Moves: True 8 | Explosion: UnitExplodeLarge 9 | MaximumSpinSpeed: 0 10 | -------------------------------------------------------------------------------- /mods/d2/rules/arrakis.yaml: -------------------------------------------------------------------------------- 1 | sietch: 2 | Inherits: ^Building 3 | Tooltip: 4 | Name: Fremen Sietch 5 | D2Building: 6 | Footprint: xx xx 7 | Dimensions: 2,2 8 | TerrainTypes: Cliff 9 | Health: 10 | HP: 6000 11 | Armor: 12 | Type: wood 13 | RevealsShroud: 14 | Range: 10c0 15 | -GivesBuildableArea: 16 | -Capturable: 17 | -RepairableBuilding: 18 | WithTilesetBody: 19 | Sequence: idle 20 | Power: 21 | Amount: 0 22 | ProvidesPrerequisite@buildingname: 23 | -------------------------------------------------------------------------------- /mods/d2/rules/autotarget.yaml: -------------------------------------------------------------------------------- 1 | ^AutoTargetGround: 2 | AutoTarget: 3 | AttackAnythingCondition: stance-attackanything 4 | AutoTargetPriority@DEFAULT: 5 | RequiresCondition: !stance-attackanything 6 | ValidTargets: Infantry, Vehicle, Creep, Water, Defense 7 | InvalidTargets: NoAutoTarget 8 | AutoTargetPriority@ATTACKANYTHING: 9 | RequiresCondition: stance-attackanything 10 | ValidTargets: Infantry, Vehicle, Creep, Water, Structure, Defense 11 | InvalidTargets: NoAutoTarget 12 | 13 | ^AutoTargetGroundAssaultMove: 14 | Inherits: ^AutoTargetGround 15 | AutoTargetPriority@DEFAULT: 16 | RequiresCondition: !stance-attackanything && !assault-move 17 | AutoTargetPriority@ATTACKANYTHING: 18 | RequiresCondition: stance-attackanything || assault-move 19 | AttackMove: 20 | AssaultMoveCondition: assault-move 21 | 22 | ^AutoTargetAll: 23 | AutoTarget: 24 | AttackAnythingCondition: stance-attackanything 25 | AutoTargetPriority@DEFAULT: 26 | RequiresCondition: !stance-attackanything 27 | ValidTargets: Infantry, Vehicle, Creep, Water, Air, Defense 28 | InvalidTargets: NoAutoTarget 29 | AutoTargetPriority@ATTACKANYTHING: 30 | RequiresCondition: stance-attackanything 31 | ValidTargets: Infantry, Vehicle, Creep, Water, Air, Structure, Defense 32 | InvalidTargets: NoAutoTarget 33 | 34 | ^AutoTargetAllAssaultMove: 35 | Inherits: ^AutoTargetAll 36 | AutoTargetPriority@DEFAULT: 37 | RequiresCondition: !stance-attackanything && !assault-move 38 | AutoTargetPriority@ATTACKANYTHING: 39 | RequiresCondition: stance-attackanything || assault-move 40 | AttackMove: 41 | AssaultMoveCondition: assault-move 42 | -------------------------------------------------------------------------------- /mods/d2/rules/barracks.yaml: -------------------------------------------------------------------------------- 1 | barracks: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: ~structure.atreides_or_ordos, wind_trap, outpost 5 | Queue: Building 6 | BuildPaletteOrder: 100 7 | BuildDuration: 900 8 | BuildDurationModifier: 40 9 | Description: Trains infantry\n Cannot be captured. 10 | Selectable: 11 | Bounds: 2048, 2048 12 | Valued: 13 | Cost: 300 14 | Tooltip: 15 | Name: Barracks 16 | D2Building: 17 | Footprint: xx xx 18 | Dimensions: 2,2 19 | Health: 20 | HP: 300 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1024 24 | BottomRight: 1024, 1024 25 | Armor: 26 | Type: building 27 | RevealsShroud: 28 | Range: 2c0 29 | RallyPoint: 30 | Path: 1,2 31 | Exit@1: 32 | SpawnOffset: 352,576,0 33 | ExitCell: 0,2 34 | Exit@2: 35 | SpawnOffset: 512,480,0 36 | ExitCell: 1,2 37 | Production: 38 | Produces: Infantry 39 | ProductionBar: 40 | ProductionType: Infantry 41 | ProductionQueue: 42 | Type: Infantry 43 | Group: Infantry 44 | LowPowerModifier: 300 45 | BlockedAudio: NoRoom 46 | BuildDurationModifier: 250 47 | ProvidesPrerequisite@atreides: 48 | Prerequisite: barracks.atreides 49 | Factions: atreides 50 | ProvidesPrerequisite@ordos: 51 | Prerequisite: barracks.ordos 52 | Factions: ordos 53 | ProvidesPrerequisite@harkonnen: 54 | Prerequisite: barracks.harkonnen 55 | Factions: harkonnen 56 | Power: 57 | Amount: -10 58 | RenderSprites: 59 | Image: barracks 60 | PlayerPalette: player 61 | WithTilesetBody: 62 | SkipFrames: 3 63 | WithIdleOverlay@FLAG: 64 | Sequence: idle-flag 65 | ProvidesPrerequisite@buildingname: 66 | ProvidesPrerequisite@har_conyard_or_barracks: 67 | Prerequisite: har_conyard_or_barracks 68 | GrantConditionOnPrerequisite: 69 | Prerequisites: upgrade.barracks 70 | Condition: stardecoration 71 | WithDecoration@upgraded: 72 | Image: pips 73 | Sequence: tag-upgraded 74 | RequiresCondition: stardecoration 75 | Offsets: 76 | stardecoration: -6, -6 77 | RevealOnDeath: 78 | Radius: 3c768 79 | -Capturable: 80 | -CaptureNotification: 81 | -CaptureManager: 82 | 83 | upgrade.barracks: 84 | AlwaysVisible: 85 | Interactable: 86 | ScriptTriggers: 87 | Tooltip: 88 | Name: Barracks Upgrade 89 | Buildable: 90 | BuildPaletteOrder: 999 91 | Queue: Infantry 92 | BuildLimit: 1 93 | BuildDuration: 250 94 | BuildDurationModifier: 40 95 | Description: Unlocks infantry squads 96 | Valued: 97 | Cost: 150 98 | RenderSprites: 99 | Image: barracks 100 | ProvidesPrerequisite@upgradename: 101 | -------------------------------------------------------------------------------- /mods/d2/rules/building.yaml: -------------------------------------------------------------------------------- 1 | ^Building: 2 | Inherits@1: ^ExistsInWorld 3 | Inherits@2: ^SpriteActor 4 | Tooltip: 5 | GenericName: Structure 6 | Huntable: 7 | SelectionDecorations: 8 | WithSpriteControlGroupDecoration: 9 | Selectable: 10 | Priority: 2 11 | RevealsShroud: 12 | Type: CenterPosition 13 | Targetable: 14 | TargetTypes: Ground, C4, Structure 15 | HitShape: 16 | UseTargetableCellsOffsets: true 17 | Type: Rectangle 18 | TopLeft: -512, -512 19 | BottomRight: 512, 512 20 | D2Building: 21 | Dimensions: 2,2 22 | Footprint: xx xx 23 | TerrainTypes: Rock, Concrete 24 | BuildSounds: BUILD1.WAV 25 | D2PlaceBuildingPreview: 26 | RequiresBuildableArea: 27 | AreaTypes: building 28 | Adjacent: 1 29 | GivesBuildableArea: 30 | AreaTypes: building 31 | Capturable: 32 | Types: building 33 | CaptureNotification: 34 | CaptureManager: 35 | SoundOnDamageTransition: 36 | DamagedSounds: EXPLSML1.WAV 37 | DestroyedSounds: EXPLHG1.WAV 38 | #WithSpriteBody: 39 | WithTilesetBody: 40 | Explodes: 41 | Type: Footprint 42 | Weapon: BuildingExplode 43 | EmptyWeapon: BuildingExplode 44 | RepairableBuilding: 45 | RepairStep: 50 46 | MustBeDestroyed: 47 | RequiredForShortGame: true 48 | FrozenUnderFog: 49 | ActorLostNotification: 50 | Notification: BuildingLost 51 | ShakeOnDeath: 52 | Guardable: 53 | Range: 3c0 54 | #WithCrumbleOverlay: 55 | Demolishable: 56 | #WithMakeAnimation: 57 | RevealOnDeath: 58 | Duration: 100 59 | Radius: 4c768 60 | MapEditorData: 61 | Categories: Building 62 | CommandBarBlacklist: 63 | -------------------------------------------------------------------------------- /mods/d2/rules/campaign-rules.yaml: -------------------------------------------------------------------------------- 1 | Player: 2 | -ConquestVictoryConditions: 3 | MissionObjectives: 4 | EarlyGameOver: true 5 | Shroud: 6 | FogCheckboxLocked: True 7 | FogCheckboxEnabled: False 8 | ExploredMapCheckboxLocked: True 9 | ExploredMapCheckboxEnabled: False 10 | 11 | World: 12 | -SpawnStartingUnits: 13 | -MapStartingLocations: 14 | ObjectivesPanel: 15 | PanelName: MISSION_OBJECTIVES 16 | ActorSpawnManager: 17 | Minimum: 1 18 | Maximum: 1 19 | MapCreeps: 20 | CheckboxLocked: True 21 | CheckboxEnabled: True 22 | MapBuildRadius: 23 | AllyBuildRadiusCheckboxLocked: True 24 | AllyBuildRadiusCheckboxEnabled: False 25 | MapOptions: 26 | TechLevelDropdownLocked: True 27 | ShortGameCheckboxLocked: True 28 | ShortGameCheckboxEnabled: False 29 | -------------------------------------------------------------------------------- /mods/d2/rules/campaign-tooltips.yaml: -------------------------------------------------------------------------------- 1 | ^Vehicle: 2 | Tooltip: 3 | GenericVisibility: Enemy, Neutral 4 | NeutralPrefix: Neutral 5 | ShowOwnerRow: false 6 | 7 | ^Tank: 8 | Tooltip: 9 | GenericVisibility: Enemy, Neutral 10 | NeutralPrefix: Neutral 11 | ShowOwnerRow: false 12 | 13 | ^Infantry: 14 | Tooltip: 15 | GenericVisibility: Enemy, Neutral 16 | NeutralPrefix: Neutral 17 | ShowOwnerRow: false 18 | 19 | ^Plane: 20 | Tooltip: 21 | GenericVisibility: Enemy, Neutral 22 | NeutralPrefix: Neutral 23 | ShowOwnerRow: false 24 | 25 | ^Building: 26 | Tooltip: 27 | GenericVisibility: Enemy, Neutral 28 | NeutralPrefix: Neutral 29 | ShowOwnerRow: false 30 | 31 | ^Husk: 32 | Tooltip: 33 | GenericVisibility: Enemy, Ally, Neutral 34 | GenericStancePrefix: false 35 | ShowOwnerRow: false 36 | 37 | ^Crate: 38 | Tooltip: 39 | ShowOwnerRow: false 40 | 41 | wall: 42 | Tooltip: 43 | GenericVisibility: Enemy, Neutral 44 | NeutralPrefix: Neutral 45 | ShowOwnerRow: false 46 | -------------------------------------------------------------------------------- /mods/d2/rules/carryall.yaml: -------------------------------------------------------------------------------- 1 | carryall.reinforce: 2 | Inherits: ^Plane 3 | Valued: 4 | Cost: 800 5 | Tooltip: 6 | Name: Carryall 7 | Health: 8 | HP: 100 9 | Armor: 10 | Type: light 11 | Aircraft: 12 | CruiseAltitude: 192 13 | InitialFacing: 0 14 | Speed: 144 # 112 * ~1.3 for balance reasons 15 | TurnSpeed: 16 16 | LandableTerrainTypes: Sand, Rock, Transition, Spice, SpiceSand, Dune, Concrete 17 | Repulsable: False 18 | AirborneCondition: airborne 19 | CanHover: True 20 | VTOL: true 21 | IdleTurnSpeed: 8 22 | CanSlide: True 23 | Targetable@GROUND: 24 | TargetTypes: Ground, Vehicle 25 | RequiresCondition: !airborne 26 | Targetable@AIRBORNE: 27 | TargetTypes: Air 28 | RequiresCondition: airborne 29 | SpawnActorOnDeath: 30 | Actor: carryall.husk 31 | RequiresCondition: airborne 32 | OwnerType: InternalName 33 | EffectiveOwnerFromOwner: true 34 | Carryall: 35 | BeforeLoadDelay: 10 36 | BeforeUnloadDelay: 15 37 | LocalOffset: 0, 0, -128 38 | RenderSprites: 39 | Image: carryall 40 | ChangesHealth: 41 | Step: 5 42 | Delay: 3 43 | StartIfBelow: 50 44 | Buildable: 45 | BuildDuration: 800 46 | BuildDurationModifier: 40 47 | Description: Large winged, planet-bound ship\n Automatically lifts harvesters from and to Spice.\n Lifts vehicles to Repair Pads when ordered. 48 | 49 | carryall: 50 | Inherits: carryall.reinforce 51 | -Carryall: 52 | AutoCarryall: 53 | BeforeLoadDelay: 10 54 | BeforeUnloadDelay: 15 55 | LocalOffset: 0, 0, -128 56 | Aircraft: 57 | MinAirborneAltitude: 40 58 | InitialFacing: 768 59 | CruisingCondition: cruising 60 | RevealsShroud@ligting_low: 61 | Range: 2c512 62 | Type: GroundPosition 63 | RequiresCondition: !airborne 64 | RevealsShroud@lifting_high: 65 | Range: 1c256 66 | Type: GroundPosition 67 | RequiresCondition: !cruising 68 | Buildable: 69 | Queue: Aircraft 70 | BuildPaletteOrder: 120 71 | 72 | carryall.husk: 73 | Inherits: ^AircraftHusk 74 | Tooltip: 75 | Name: Carryall 76 | Aircraft: 77 | TurnSpeed: 16 78 | Speed: 144 79 | CanHover: True 80 | VTOL: true 81 | CanSlide: True 82 | RenderSprites: 83 | Image: carryall 84 | -------------------------------------------------------------------------------- /mods/d2/rules/colorpicker.yaml: -------------------------------------------------------------------------------- 1 | harvester.colorpicker: 2 | Inherits: harvester 3 | -Buildable: 4 | -MapEditorData: 5 | -WithHarvestOverlay: 6 | -WithDockingAnimation: 7 | RenderSprites: 8 | Image: harvester.colorpicker 9 | Palette: colorpicker 10 | -------------------------------------------------------------------------------- /mods/d2/rules/combat_tank.yaml: -------------------------------------------------------------------------------- 1 | combat_tank: 2 | Inherits: ^Tank 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Armor 6 | BuildPaletteOrder: 40 7 | BuildDuration: 800 8 | BuildDurationModifier: 40 9 | Prerequisites: heavy_factory 10 | Description: Main Battle Tank\n Strong vs Tanks\n Weak vs Infantry, Aircraft\n 11 | Valued: 12 | Cost: 300 13 | Tooltip: 14 | Name: Combat Tank 15 | Health: 16 | HP: 200 17 | Armor: 18 | Type: heavy 19 | Mobile: 20 | Speed: 75 21 | TurnSpeed: 20 22 | D2RevealsShroud: 23 | Range: 3c0 24 | MovingRange: 1c768 25 | Turreted: 26 | TurnSpeed: 20 27 | RealignDelay: 0 28 | Armament: 29 | Weapon: 80mm 30 | Recoil: 128 31 | RecoilRecovery: 32 32 | LocalOffset: 256,0,0 33 | MuzzleSequence: muzzle 34 | AttackTurreted: 35 | WithMuzzleOverlay: 36 | WithSpriteTurret: 37 | AutoTarget: 38 | Explodes: 39 | Weapon: UnitExplodeMed 40 | EmptyWeapon: UnitExplodeMed 41 | Selectable: 42 | Class: combat 43 | AttractsWorms: 44 | Intensity: 520 45 | SpawnActorOnDeath: 46 | Actor: combat_tank.husk 47 | OwnerType: InternalName 48 | EffectiveOwnerFromOwner: true 49 | -------------------------------------------------------------------------------- /mods/d2/rules/concrete.yaml: -------------------------------------------------------------------------------- 1 | ^concrete: 2 | AlwaysVisible: 3 | Interactable: 4 | D2Building: 5 | TerrainTypes: Rock 6 | BuildSounds: CHUNG.WAV 7 | AllowInvalidPlacement: true 8 | D2PlaceBuildingPreview: 9 | RequiresBuildableArea: 10 | AreaTypes: building 11 | Adjacent: 1 12 | Tooltip: 13 | Name: Concrete 14 | GenericName: Structure 15 | RenderSprites: 16 | KillsSelf: 17 | RemoveInstead: true 18 | D2Concrete: 19 | Buildable: 20 | Queue: Building 21 | Prerequisites: construction_yard 22 | BuildPaletteOrder: 10 23 | Description: Provides a strong foundation that prevents\ndamage from the terrain. 24 | 25 | concretea: 26 | Inherits: ^concrete 27 | D2Building: 28 | Footprint: x 29 | Dimensions: 1,1 30 | LaysOnConcrete: true 31 | ConcreteTemplate: 126 32 | WithSpriteBody: 33 | RenderSprites: 34 | Image: concretea 35 | Valued: 36 | Cost: 5 37 | Buildable: 38 | BuildPaletteOrder: 10 39 | BuildDuration: 200 40 | BuildDurationModifier: 40 41 | 42 | concreteb: 43 | Inherits: ^concrete 44 | D2Building: 45 | Footprint: xx xx 46 | Dimensions: 2,2 47 | LaysOnConcrete: true 48 | ConcreteTemplate: 127 49 | D2PlaceBuildingPreview: 50 | StrictBuildableChecks: false 51 | WithTilesetBody: 52 | RenderSprites: 53 | Image: concreteb 54 | Valued: 55 | Cost: 20 56 | Buildable: 57 | BuildPaletteOrder: 40 58 | BuildDuration: 200 59 | BuildDurationModifier: 40 60 | Prerequisites: upgrade.conyard 61 | -------------------------------------------------------------------------------- /mods/d2/rules/construction_yard.yaml: -------------------------------------------------------------------------------- 1 | construction_yard: 2 | Inherits: ^Building 3 | Buildable: 4 | Description: Produces structures. 5 | D2Building: 6 | Footprint: xx xx 7 | Dimensions: 2,2 8 | ConcreteTemplate: 127 9 | DamageThreshold: 100 10 | DamageInterval: 0 11 | Damage: 0 12 | Selectable: 13 | Bounds: 2048, 2048 14 | Health: 15 | HP: 400 16 | HitShape: 17 | Type: Rectangle 18 | TopLeft: -1024, -1024 19 | BottomRight: 1024, 1024 20 | Armor: 21 | Type: cy 22 | RevealsShroud: 23 | Range: 3c0 24 | Production: 25 | Produces: Building 26 | ProductionBar: 27 | ProductionType: Building 28 | ProductionQueue: 29 | Type: Building 30 | Group: Building 31 | LowPowerModifier: 300 32 | QueuedAudio: Building 33 | ReadyAudio: BuildingReady 34 | BuildDurationModifier: 250 35 | Exit: 36 | Valued: 37 | Cost: 400 38 | Tooltip: 39 | Name: Construction Yard 40 | BaseBuilding: 41 | Power: 42 | Amount: 0 43 | WithTilesetBody: 44 | SkipFrames: 0 45 | RenderSprites: 46 | Image: conyard 47 | PlayerPalette: player 48 | WithIdleOverlay@FLAG: 49 | Sequence: idle-flag 50 | ProvidesPrerequisite@buildingname: 51 | ProvidesPrerequisite@Atreides: 52 | Prerequisite: structure.atreides 53 | Factions: atreides 54 | ProvidesPrerequisite@Ordos: 55 | Prerequisite: structure.ordos 56 | Factions: ordos 57 | ProvidesPrerequisite@Harkonnen: 58 | Prerequisite: structure.harkonnen 59 | Factions: harkonnen 60 | ProvidesPrerequisite@Atreides+Ordos: 61 | Prerequisite: structure.atreides_or_ordos 62 | Factions: atreides, ordos 63 | ProvidesPrerequisite@Ordos+Harkonnen: 64 | Prerequisite: structure.ordos_or_harkonnen 65 | Factions: ordos, harkonnen 66 | ProvidesPrerequisite@har_conyard_or_barracks: 67 | Prerequisite: har_conyard_or_barracks 68 | Factions: harkonnen 69 | GrantConditionOnPrerequisite: 70 | Prerequisites: upgrade.conyard 71 | Condition: stardecoration 72 | WithDecoration@upgraded: 73 | Image: pips 74 | Sequence: tag-upgraded 75 | RequiresCondition: stardecoration 76 | Offsets: 77 | stardecoration: -6, -6 78 | RevealOnDeath: 79 | Radius: 5c768 80 | 81 | upgrade.conyard: 82 | AlwaysVisible: 83 | Interactable: 84 | ScriptTriggers: 85 | Tooltip: 86 | Name: Construction Yard Upgrade 87 | Buildable: 88 | BuildPaletteOrder: 999 89 | Queue: Building 90 | BuildLimit: 1 91 | BuildDuration: 250 92 | BuildDurationModifier: 40 93 | Description: Unlocks new construction options 94 | Valued: 95 | Cost: 200 96 | RenderSprites: 97 | Image: conyard 98 | ProvidesPrerequisite@upgradename: 99 | -------------------------------------------------------------------------------- /mods/d2/rules/defaults.yaml: -------------------------------------------------------------------------------- 1 | ^ExistsInWorld: 2 | AppearsOnRadar: 3 | UpdatesPlayerStatistics: 4 | CombatDebugOverlay: 5 | ScriptTriggers: 6 | RenderDebugState: 7 | 8 | ^SpriteActor: 9 | BodyOrientation: 10 | QuantizedFacings: 8 11 | RenderSprites: 12 | -------------------------------------------------------------------------------- /mods/d2/rules/defense.yaml: -------------------------------------------------------------------------------- 1 | ^Defense: 2 | Inherits: ^Building 3 | WithSpriteTurret: 4 | AttackTurreted: 5 | -Capturable: 6 | -WithTilesetBody: 7 | WithWallSpriteBody: 8 | LineBuildNode: 9 | Types: turret 10 | MustBeDestroyed: 11 | RequiredForShortGame: false 12 | D2Building: 13 | Dimensions: 1,1 14 | Footprint: x 15 | RevealOnFire: 16 | Targetable: 17 | TargetTypes: Ground, C4, Structure, Defence 18 | MapEditorData: 19 | Categories: Defense 20 | -CommandBarBlacklist: 21 | -------------------------------------------------------------------------------- /mods/d2/rules/devastator.yaml: -------------------------------------------------------------------------------- 1 | devastator: 2 | Inherits: ^Tank 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Armor 6 | BuildPaletteOrder: 100 7 | Prerequisites: ~heavy.harkonnen, research_centre, ~techlevel.high 8 | BuildDuration: 1300 9 | BuildDurationModifier: 40 10 | Description: Super Heavy Tank\n Strong vs Tanks\n Weak vs Artillery, Aircraft 11 | Valued: 12 | Cost: 800 13 | Tooltip: 14 | Name: Devastator 15 | Health: 16 | HP: 400 17 | Armor: 18 | Type: heavy 19 | Mobile: 20 | TurnSpeed: 12 21 | Speed: 31 22 | Locomotor: devastator 23 | PauseOnCondition: notmobile # TODO: Can this overload? 24 | AutoCarryable: 25 | # RequiresCondition: !overload # TODO: Can this overload? 26 | D2RevealsShroud: 27 | Range: 4c0 28 | MovingRange: 1c768 29 | Armament: 30 | Weapon: DevBullet 31 | LocalOffset: 640,0,32 32 | MuzzleSequence: muzzle 33 | AttackFrontal: 34 | FacingTolerance: 0 35 | Turreted: 36 | TurnSpeed: 20 37 | RealignDelay: 0 38 | WithSpriteTurret: 39 | WithMuzzleOverlay: 40 | IgnoreOffset: true 41 | Explodes: 42 | Weapon: UnitExplodeLarge 43 | EmptyWeapon: UnitExplodeLarge 44 | #RequiresCondition: !overload # TODO: Can this overload? 45 | SpawnActorOnDeath: 46 | Actor: devastator.husk 47 | OwnerType: InternalName 48 | EffectiveOwnerFromOwner: true 49 | AttractsWorms: 50 | Intensity: 700 51 | ChangesHealth: 52 | Step: 5 53 | Delay: 3 54 | StartIfBelow: 50 55 | -------------------------------------------------------------------------------- /mods/d2/rules/deviator.yaml: -------------------------------------------------------------------------------- 1 | deviator: 2 | Inherits: ^Tank 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Valued: 5 | Cost: 750 6 | Tooltip: 7 | Name: Deviator 8 | Buildable: 9 | Queue: Armor 10 | BuildPaletteOrder: 50 11 | BuildDuration: 1000 12 | BuildDurationModifier: 40 13 | Prerequisites: ~heavy.ordos, research_centre, ~techlevel.high 14 | Description: Fires a warhead which changes\nthe allegiance of enemy vehicles 15 | Mobile: 16 | TurnSpeed: 12 17 | Speed: 53 18 | Health: 19 | HP: 120 20 | Armor: 21 | Type: wood 22 | D2RevealsShroud: 23 | Range: 4c768 24 | MovingRange: 1c768 25 | Armament: 26 | Weapon: DeviatorMissile 27 | LocalOffset: -299,0,85 28 | AttackFrontal: 29 | FacingTolerance: 0 30 | Turreted: 31 | TurnSpeed: 20 32 | RealignDelay: 0 33 | WithSpriteTurret: 34 | AutoTarget: 35 | InitialStanceAI: Defend 36 | Explodes: 37 | Weapon: UnitExplodeLarge 38 | EmptyWeapon: UnitExplodeLarge 39 | SpawnActorOnDeath: 40 | Actor: deviator.husk 41 | OwnerType: InternalName 42 | EffectiveOwnerFromOwner: true 43 | AttractsWorms: 44 | Intensity: 600 45 | -------------------------------------------------------------------------------- /mods/d2/rules/fremen.yaml: -------------------------------------------------------------------------------- 1 | fremen: 2 | Inherits: ^Infantry 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Tooltip: 5 | Name: Fremen 6 | Buildable: 7 | Queue: Infantry 8 | BuildPaletteOrder: 100 9 | Prerequisites: ~disabled 10 | Description: Elite sniper infantry unit\n Strong vs Infantry\n Weak vs Vehicles\n Special Ability: Invisibility 11 | Mobile: 12 | Speed: 43 13 | Valued: 14 | Cost: 200 ## actually 0, but spawns from support power at Palace 15 | Health: 16 | HP: 700 17 | AutoTarget: 18 | ScanRadius: 7 19 | InitialStance: HoldFire 20 | InitialStanceAI: ReturnFire 21 | Armament@PRIMARY: 22 | Weapon: Fremen_S 23 | Armament@SECONDARY: 24 | Weapon: Fremen_L 25 | AttackFrontal: 26 | FacingTolerance: 0 27 | Cloak: 28 | InitialDelay: 85 29 | CloakDelay: 85 30 | CloakSound: STEALTH1.WAV 31 | UncloakSound: STEALTH2.WAV 32 | IsPlayerPalette: true 33 | PauseOnCondition: cloak-force-disabled 34 | GrantConditionOnDamageState@UNCLOAK: 35 | Condition: cloak-force-disabled 36 | ValidDamageStates: Critical 37 | -MustBeDestroyed: 38 | Voiced: 39 | VoiceSet: FremenVoice 40 | 41 | nsfremen: 42 | Inherits: fremen 43 | Tooltip: 44 | Buildable: 45 | BuildPaletteOrder: 105 46 | Prerequisites: ~disabled 47 | Description: Elite sniper infantry unit\n Strong vs Infantry\n Weak vs Vehicles 48 | RenderSprites: 49 | Image: fremen 50 | -Cloak: 51 | -GrantConditionOnDamageState@UNCLOAK: 52 | -------------------------------------------------------------------------------- /mods/d2/rules/frigate.yaml: -------------------------------------------------------------------------------- 1 | frigate: 2 | Inherits: ^Plane 3 | ParaDrop: 4 | DropRange: 1c0 5 | Interactable: 6 | Tooltip: 7 | Name: Frigate 8 | Health: 9 | HP: 500 10 | Aircraft: 11 | Speed: 189 # 126 * ~1.5 for balance reasons 12 | TurnSpeed: 4 13 | Repulsable: False 14 | MaximumPitch: 20 15 | CruiseAltitude: 192 16 | IdleBehavior: LeaveMap 17 | InitialFacing: 768 18 | -AppearsOnRadar: 19 | Cargo: 20 | MaxWeight: 20 21 | RejectsOrders: 22 | Buildable: 23 | Description: Supply spacecraft 24 | WithCargoPipsDecoration: 25 | Position: BottomLeft 26 | RequiresSelection: true 27 | PipCount: 10 28 | -------------------------------------------------------------------------------- /mods/d2/rules/gun_turret.yaml: -------------------------------------------------------------------------------- 1 | gun_turret: 2 | Inherits: ^Defense 3 | Inherits@AUTOTARGET: ^AutoTargetGround 4 | Buildable: 5 | Queue: Building 6 | Prerequisites: wind_trap, outpost 7 | BuildPaletteOrder: 80 8 | BuildDuration: 800 9 | BuildDurationModifier: 40 10 | Description: Defensive structure\n Strong vs Tanks\n Weak vs Infantry, Aircraft 11 | Valued: 12 | Cost: 125 13 | Tooltip: 14 | Name: Gun Turret 15 | D2Building: 16 | BuildSounds: CHUNG.WAV 17 | RequiresBuildableArea: 18 | Adjacent: 1 19 | Selectable: 20 | Bounds: 1024, 1024 21 | Priority: 3 22 | Health: 23 | HP: 200 24 | Armor: 25 | Type: heavy 26 | RevealsShroud: 27 | Range: 2c0 28 | BodyOrientation: 29 | QuantizedFacings: 8 30 | WithMuzzleOverlay: 31 | Turreted: 32 | TurnSpeed: 24 33 | InitialFacing: 512 34 | Armament: 35 | Weapon: 110mm_Gun 36 | LocalOffset: 512,0,432 37 | MuzzleSequence: muzzle 38 | Power: 39 | Amount: -10 40 | -------------------------------------------------------------------------------- /mods/d2/rules/harvester.yaml: -------------------------------------------------------------------------------- 1 | harvester: 2 | Inherits: ^Tank 3 | -AttackMove: 4 | Buildable: 5 | Queue: Armor 6 | Prerequisites: refinery 7 | BuildPaletteOrder: 10 8 | BuildDuration: 800 9 | BuildDurationModifier: 40 10 | Description: Collects Spice for processing\n Unarmed 11 | Valued: 12 | Cost: 300 13 | Tooltip: 14 | Name: Spice Harvester 15 | Selectable: 16 | Class: harvester 17 | Priority: 7 18 | Harvester: 19 | Capacity: 28 20 | HarvestFacings: 8 21 | Resources: Spice 22 | BaleUnloadDelay: 5 23 | SearchFromProcRadius: 30 24 | SearchFromHarvesterRadius: 15 25 | CarryableHarvester: 26 | Health: 27 | HP: 150 28 | Armor: 29 | Type: harvester 30 | Mobile: 31 | Speed: 43 32 | D2RevealsShroud: 33 | Range: 2c0 34 | MovingRange: 1c768 35 | Explodes: 36 | Weapon: UnitExplodeLarge 37 | EmptyWeapon: UnitExplodeLarge 38 | SpawnActorOnDeath: 39 | Actor: harvester.Husk 40 | OwnerType: InternalName 41 | EffectiveOwnerFromOwner: true 42 | WithHarvestOverlay: 43 | WithDockingAnimation: 44 | AttractsWorms: 45 | Intensity: 700 46 | ChangesHealth: 47 | Step: 5 48 | Delay: 3 49 | StartIfBelow: 50 50 | -RevealOnFire: 51 | WithHarvesterPipsDecoration: 52 | Position: BottomLeft 53 | RequiresSelection: true 54 | PipCount: 7 55 | WithHarvesterPipsDecoration: 56 | Position: BottomLeft 57 | RequiresSelection: true 58 | PipCount: 7 59 | -------------------------------------------------------------------------------- /mods/d2/rules/heavy_factory.yaml: -------------------------------------------------------------------------------- 1 | heavy_factory: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: wind_trap, light_factory, outpost 5 | Queue: Building 6 | BuildPaletteOrder: 130 7 | BuildDuration: 1800 8 | BuildDurationModifier: 40 9 | Description: Produces heavy vehicles 10 | Selectable: 11 | Bounds: 3072, 2048 12 | Valued: 13 | Cost: 600 14 | Tooltip: 15 | Name: Heavy Factory 16 | D2Building: 17 | Footprint: xxx xxx 18 | Dimensions: 3,2 19 | Health: 20 | HP: 200 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1536 24 | BottomRight: 1024, 1536 25 | Armor: 26 | Type: wood 27 | RevealsShroud: 28 | Range: 3c0 29 | RallyPoint: 30 | Path: 0,3 31 | Exit@1: 32 | SpawnOffset: 256,192,0 33 | ExitCell: 0,2 34 | Production: 35 | Produces: Armor 36 | ProductionBar: 37 | ProductionType: Armor 38 | ProductionQueue: 39 | Type: Armor 40 | Group: Armor 41 | LowPowerModifier: 300 42 | BlockedAudio: NoRoom 43 | BuildDurationModifier: 250 44 | ProvidesPrerequisite@atreides: 45 | Prerequisite: heavy.atreides 46 | Factions: atreides 47 | ProvidesPrerequisite@ordos: 48 | Prerequisite: heavy.ordos 49 | Factions: ordos 50 | ProvidesPrerequisite@harkonnen: 51 | Prerequisite: heavy.harkonnen 52 | Factions: harkonnen 53 | ProvidesPrerequisite@missiletank: 54 | Prerequisite: heavy.missiletank 55 | Factions: atreides, harkonnen 56 | WithTilesetBody: 57 | SkipFrames: 0 58 | RenderSprites: 59 | Image: heavy 60 | WithProductionOverlay@WELDING1: 61 | Sequence: production-welding-1 62 | WithProductionOverlay@WELDING2: 63 | Sequence: production-welding-2 64 | WithIdleOverlay@FLAG: 65 | Sequence: idle-flag 66 | Power: 67 | Amount: -35 68 | ProvidesPrerequisite@buildingname: 69 | GrantConditionOnPrerequisite: 70 | Prerequisites: upgrade.heavy 71 | Condition: stardecoration 72 | WithDecoration@upgraded: 73 | Image: pips 74 | Sequence: tag-upgraded 75 | RequiresCondition: stardecoration 76 | Offsets: 77 | stardecoration: -6, -6 78 | 79 | upgrade.heavy: 80 | AlwaysVisible: 81 | Interactable: 82 | Tooltip: 83 | Name: Heavy Factory Upgrade 84 | Buildable: 85 | BuildPaletteOrder: 999 86 | Queue: Armor 87 | BuildLimit: 1 88 | BuildDuration: 250 89 | BuildDurationModifier: 40 90 | Description: Unlocks advanced technology and heavy weapons 91 | Valued: 92 | Cost: 300 93 | RenderSprites: 94 | Image: heavy 95 | ProvidesPrerequisite@upgradename: 96 | -------------------------------------------------------------------------------- /mods/d2/rules/high_tech_factory.yaml: -------------------------------------------------------------------------------- 1 | high_tech_factory: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: wind_trap, light_factory, outpost, ~techlevel.medium 5 | Queue: Building 6 | BuildPaletteOrder: 140 7 | BuildDuration: 1500 8 | BuildDurationModifier: 40 9 | Description: Unlocks advanced technology 10 | Selectable: 11 | Bounds: 3072, 2048 12 | Valued: 13 | Cost: 500 14 | Tooltip: 15 | Name: High Tech Factory 16 | ProductionFromMapEdge: 17 | Produces: Aircraft 18 | ProductionBar: 19 | ProductionType: Aircraft 20 | ProductionQueue: 21 | Type: Aircraft 22 | Group: Aircraft 23 | LowPowerModifier: 300 24 | BlockedAudio: NoRoom 25 | BuildDurationModifier: 312 26 | Exit: 27 | SpawnOffset: 0,0,728 28 | ExitCell: 0,0 29 | D2Building: 30 | Footprint: xxx xxx 31 | Dimensions: 3,2 32 | Health: 33 | HP: 400 34 | HitShape: 35 | Type: Rectangle 36 | TopLeft: -1024, -1536 37 | BottomRight: 1024, 1536 38 | Armor: 39 | Type: building 40 | RevealsShroud: 41 | Range: 3c0 42 | WithTilesetBody: 43 | SkipFrames: 3 44 | WithIdleOverlay@FLAG: 45 | Sequence: idle-flag 46 | RenderSprites: 47 | Image: hightech 48 | PlayerPalette: player 49 | ProvidesPrerequisite@Atreides+Ordos: 50 | Prerequisite: aircraft.atreides_or_ordos 51 | Factions: atreides, ordos 52 | ProvidesPrerequisite@buildingname: 53 | Power: 54 | Amount: -35 55 | GrantConditionOnPrerequisite: 56 | Prerequisites: upgrade.hightech 57 | Condition: stardecoration 58 | WithDecoration@upgraded: 59 | Image: pips 60 | Sequence: tag-upgraded 61 | RequiresCondition: stardecoration 62 | Offsets: 63 | stardecoration: -6, -6 64 | 65 | upgrade.hightech: 66 | AlwaysVisible: 67 | Interactable: 68 | ScriptTriggers: 69 | Tooltip: 70 | Name: High Tech Factory Upgrade 71 | Buildable: 72 | BuildPaletteOrder: 999 73 | Prerequisites: ~aircraft.atreides_or_ordos, ~techlevel.high 74 | Queue: Aircraft 75 | BuildLimit: 1 76 | BuildDuration: 250 77 | BuildDurationModifier: 40 78 | Description: Unlocks ornithopters 79 | Valued: 80 | Cost: 200 81 | RenderSprites: 82 | Image: hightech 83 | ProvidesPrerequisite@upgradename: 84 | -------------------------------------------------------------------------------- /mods/d2/rules/husk.yaml: -------------------------------------------------------------------------------- 1 | ^Husk: 2 | Inherits@1: ^SpriteActor 3 | Interactable: 4 | Health: 5 | HP: 75 6 | Armor: 7 | Type: light 8 | HiddenUnderFog: 9 | Type: CenterPosition 10 | Tooltip: 11 | GenericName: Destroyed Unit 12 | ScriptTriggers: 13 | WithFacingSpriteBody: 14 | HitShape: 15 | MapEditorData: 16 | Categories: Husk 17 | -------------------------------------------------------------------------------- /mods/d2/rules/husks.yaml: -------------------------------------------------------------------------------- 1 | mcv.husk: 2 | Inherits: ^VehicleHusk 3 | Health: 4 | HP: 175 5 | Tooltip: 6 | Name: Destroyed Mobile Construction Vehicle 7 | 8 | harvester.husk: 9 | Inherits: ^VehicleHusk 10 | Health: 11 | HP: 150 12 | Tooltip: 13 | Name: Destroyed Spice Harvester 14 | TransformOnCapture: 15 | IntoActor: harvester 16 | 17 | siege_tank.husk: 18 | Inherits: ^VehicleHusk 19 | ThrowsParticle@turret: 20 | Anim: turret 21 | TransformOnCapture: 22 | IntoActor: siege_tank 23 | 24 | missile_tank.husk: 25 | Inherits: ^VehicleHusk 26 | TransformOnCapture: 27 | IntoActor: missile_tank 28 | 29 | sonic_tank.husk: 30 | Inherits: ^VehicleHusk 31 | TransformOnCapture: 32 | IntoActor: sonic_tank 33 | 34 | devastator.husk: 35 | Inherits: ^VehicleHusk 36 | Health: 37 | HP: 125 38 | TransformOnCapture: 39 | IntoActor: devastator 40 | 41 | deviator.husk: 42 | Inherits: ^VehicleHusk 43 | TransformOnCapture: 44 | IntoActor: deviator 45 | 46 | combat_tank.husk: 47 | Inherits: ^VehicleHusk 48 | Health: 49 | HP: 100 50 | ThrowsParticle@turret: 51 | Anim: turret 52 | TransformOnCapture: 53 | IntoActor: combat_tank 54 | -------------------------------------------------------------------------------- /mods/d2/rules/infantry.yaml: -------------------------------------------------------------------------------- 1 | ^Infantry: 2 | Inherits@1: ^ExistsInWorld 3 | Inherits@3: ^SpriteActor 4 | Tooltip: 5 | GenericName: Unit 6 | Huntable: 7 | Health: 8 | Armor: 9 | Type: none 10 | RevealsShroud: 11 | Range: 1c768 12 | Mobile: 13 | Locomotor: foot 14 | SelectionDecorations: 15 | WithSpriteControlGroupDecoration: 16 | Selectable: 17 | Bounds: 704, 704, 0, 0 18 | Targetable: 19 | TargetTypes: Ground, Infantry 20 | BodyOrientation: 21 | QuantizedFacings: 4 22 | WithInfantryBody: 23 | TakeCover: 24 | DamageModifiers: 25 | Prone50Percent: 50 26 | DamageTriggers: TriggerProne 27 | ProneOffset: 300,0,0 28 | ProneSequencePrefix: 29 | WithDeathAnimation: 30 | DeathTypes: 31 | ExplosionDeath: 1 32 | SoundDeath: 2 33 | SmallExplosionDeath: 3 34 | BulletDeath: 4 35 | CrushedSequence: die-crushed 36 | AttackMove: 37 | AttackMoveBlockedCursor: 38 | AssaultMoveCursor: 39 | AssaultMoveBlockedCursor: 40 | Passenger: 41 | CargoType: Infantry 42 | CustomPipType: green 43 | HiddenUnderFog: 44 | ActorLostNotification: 45 | Crushable: 46 | CrushSound: CRUSH1.WAV 47 | Guard: 48 | Voice: Guard 49 | Guardable: 50 | DetectCloaked: 51 | Range: 1c384 52 | DeathSounds: 53 | DeathTypes: ExplosionDeath, SoundDeath, SmallExplosionDeath, BulletDeath 54 | MustBeDestroyed: 55 | TerrainModifiesDamage: 56 | TerrainModifier: 57 | Rough: 80 58 | Voiced: 59 | VoiceSet: InfantryVoice 60 | Captures: 61 | CaptureTypes: building 62 | SabotageThreshold: 25 63 | SabotageHPRemoval: 10 64 | CaptureManager: 65 | RevealOnFire: 66 | RevealOnDeath: 67 | Duration: 100 68 | HitShape: 69 | Type: Circle 70 | Radius: 256 71 | MapEditorData: 72 | Categories: Infantry 73 | 74 | ^Infantry_squad: 75 | Inherits@1: ^Infantry 76 | HitShape: 77 | Type: Circle 78 | Radius: 512 79 | Mobile: 80 | Locomotor: squad 81 | Captures: 82 | SabotageHPRemoval: 30 83 | -------------------------------------------------------------------------------- /mods/d2/rules/light_factory.yaml: -------------------------------------------------------------------------------- 1 | light_factory: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: wind_trap, refinery 5 | Queue: Building 6 | BuildPaletteOrder: 110 7 | BuildDuration: 1200 8 | BuildDurationModifier: 40 9 | Description: Produces light vehicles 10 | Selectable: 11 | Bounds: 2048, 2048 12 | Valued: 13 | Cost: 400 14 | Tooltip: 15 | Name: Light Factory 16 | D2Building: 17 | Footprint: xx xx 18 | Dimensions: 2,2 19 | Health: 20 | HP: 350 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1024 24 | BottomRight: 1024, 1024 25 | Armor: 26 | Type: building 27 | RevealsShroud: 28 | Range: 3c0 29 | WithTilesetBody: 30 | SkipFrames: 1 31 | RenderSprites: 32 | Image: light 33 | PlayerPalette: player 34 | WithIdleOverlay@FLAG: 35 | Sequence: idle-flag 36 | WithProductionOverlay@WELDING: 37 | Sequence: production-welding 38 | RallyPoint: 39 | Path: 1,3 40 | Exit@1: 41 | SpawnOffset: -244,224,0 42 | ExitCell: 1,2 43 | Production: 44 | Produces: Vehicle 45 | ProductionBar: 46 | ProductionType: Vehicle 47 | ProductionQueue: 48 | Type: Vehicle 49 | Group: Vehicle 50 | LowPowerModifier: 300 51 | BlockedAudio: NoRoom 52 | BuildDurationModifier: 250 53 | ProvidesPrerequisite@atreides: 54 | Prerequisite: light.atreides 55 | Factions: atreides 56 | ProvidesPrerequisite@ordos: 57 | Prerequisite: light.ordos 58 | Factions: ordos 59 | ProvidesPrerequisite@harkonnen: 60 | Prerequisite: light.harkonnen 61 | Factions: harkonnen 62 | ProvidesPrerequisite@atreides+ordos: 63 | Prerequisite: light.atreides_or_ordos 64 | Factions: atreides, ordos 65 | ProvidesPrerequisite@light.harkonnen_or_upgrade.light: 66 | Prerequisite: light.harkonnen_or_upgrade.light 67 | Factions: harkonnen 68 | ProvidesPrerequisite@buildingname: 69 | Power: 70 | Amount: -20 71 | GrantConditionOnPrerequisite: 72 | Prerequisites: upgrade.light 73 | Condition: stardecoration 74 | WithDecoration@upgraded: 75 | Image: pips 76 | Sequence: tag-upgraded 77 | RequiresCondition: stardecoration 78 | Offsets: 79 | stardecoration: -6, -6 80 | 81 | upgrade.light: 82 | AlwaysVisible: 83 | Interactable: 84 | ScriptTriggers: 85 | Tooltip: 86 | Name: Light Factory Upgrade 87 | Buildable: 88 | BuildPaletteOrder: 999 89 | Prerequisites: ~light.atreides_or_ordos 90 | Queue: Vehicle 91 | BuildLimit: 1 92 | BuildDuration: 250 93 | BuildDurationModifier: 40 94 | Description: Unlocks additional light units 95 | Valued: 96 | Cost: 200 97 | RenderSprites: 98 | Image: light 99 | ProvidesPrerequisite@upgradename: 100 | ProvidesPrerequisite@light.harkonnen_or_upgrade.light: 101 | Prerequisite: light.harkonnen_or_upgrade.light 102 | -------------------------------------------------------------------------------- /mods/d2/rules/light_inf.yaml: -------------------------------------------------------------------------------- 1 | light_inf: 2 | Inherits: ^Infantry 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Infantry 6 | BuildPaletteOrder: 10 7 | BuildDuration: 400 8 | BuildDurationModifier: 40 9 | Description: General-purpose infantry\n Strong vs Infantry\n Weak vs Vehicles, Artillery 10 | Valued: 11 | Cost: 60 12 | Tooltip: 13 | Name: Light Infantry 14 | Health: 15 | HP: 20 16 | Mobile: 17 | Speed: 43 18 | Armament: 19 | Weapon: LMG 20 | AttackFrontal: 21 | FacingTolerance: 0 22 | -------------------------------------------------------------------------------- /mods/d2/rules/light_squad.yaml: -------------------------------------------------------------------------------- 1 | light_squad: 2 | Inherits: ^Infantry_squad 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Infantry 6 | BuildPaletteOrder: 10 7 | BuildDuration: 400 8 | BuildDurationModifier: 40 9 | Prerequisites: upgrade.barracks, ~techlevel.medium 10 | Description: General-purpose infantry\n Strong vs Infantry\n Weak vs Vehicles, Artillery 11 | Valued: 12 | Cost: 100 13 | Tooltip: 14 | Name: Light Infantry Squad 15 | Health: 16 | HP: 50 17 | Mobile: 18 | Speed: 43 19 | Armament: 20 | Weapon: LMG_squad 21 | SpawnActorOnDeath: 22 | Actor: light_inf 23 | AttackFrontal: 24 | FacingTolerance: 0 25 | Selectable: 26 | Bounds: 1024, 1024, 0, 0 27 | -------------------------------------------------------------------------------- /mods/d2/rules/mcv.yaml: -------------------------------------------------------------------------------- 1 | mcv: 2 | Inherits: ^Vehicle 3 | -AttackMove: 4 | Buildable: 5 | Prerequisites: repair_pad, upgrade.heavy, ~techlevel.medium 6 | Queue: Armor 7 | BuildPaletteOrder: 110 8 | BuildDuration: 1000 9 | BuildDurationModifier: 40 10 | Description: Deploys into another Construction Yard\n Unarmed 11 | Valued: 12 | Cost: 900 13 | Tooltip: 14 | Name: Mobile Construction Vehicle 15 | Selectable: 16 | Class: mcv 17 | Priority: 3 18 | Health: 19 | HP: 150 20 | Armor: 21 | Type: light 22 | Mobile: 23 | Speed: 31 24 | Locomotor: tank 25 | D2RevealsShroud: 26 | Range: 2c0 27 | MovingRange: 1c768 28 | MustBeDestroyed: 29 | RequiredForShortGame: true 30 | BaseBuilding: 31 | Explodes: 32 | Weapon: UnitExplodeLarge 33 | EmptyWeapon: UnitExplodeLarge 34 | Transforms: 35 | Facing: 64 36 | IntoActor: construction_yard 37 | Offset: -1,-1 38 | TransformSounds: BUILD1.WAV 39 | NoTransformNotification: CannotDeploy 40 | SpawnActorOnDeath: 41 | Actor: mcv.husk 42 | OwnerType: InternalName 43 | EffectiveOwnerFromOwner: true 44 | AttractsWorms: 45 | Intensity: 700 46 | ChangesHealth: 47 | Step: 5 48 | Delay: 3 49 | StartIfBelow: 50 50 | -RevealOnFire: 51 | -------------------------------------------------------------------------------- /mods/d2/rules/misc.yaml: -------------------------------------------------------------------------------- 1 | mpspawn: 2 | Interactable: 3 | EditorOnlyTooltip: 4 | Name: (multiplayer player starting point) 5 | AlwaysVisible: 6 | Immobile: 7 | OccupiesSpace: false 8 | RenderSpritesEditorOnly: 9 | WithSpriteBody: 10 | BodyOrientation: 11 | QuantizedFacings: 1 12 | MapEditorData: 13 | Categories: System 14 | 15 | waypoint: 16 | Interactable: 17 | EditorOnlyTooltip: 18 | Name: (waypoint for scripted behavior) 19 | AlwaysVisible: 20 | Immobile: 21 | OccupiesSpace: false 22 | RenderSpritesEditorOnly: 23 | WithSpriteBody: 24 | BodyOrientation: 25 | QuantizedFacings: 1 26 | MapEditorData: 27 | Categories: System 28 | 29 | camera: 30 | Interactable: 31 | EditorOnlyTooltip: 32 | Name: (reveals area to owner) 33 | AlwaysVisible: 34 | RenderSpritesEditorOnly: 35 | WithSpriteBody: 36 | BodyOrientation: 37 | QuantizedFacings: 1 38 | Immobile: 39 | OccupiesSpace: false 40 | RevealsShroud: 41 | Range: 6c768 42 | Type: CenterPosition 43 | MapEditorData: 44 | Categories: System 45 | 46 | wormspawner: 47 | Interactable: 48 | EditorOnlyTooltip: 49 | Name: (worm spawning location) 50 | AlwaysVisible: 51 | Immobile: 52 | OccupiesSpace: false 53 | RenderSpritesEditorOnly: 54 | WithSpriteBody: 55 | BodyOrientation: 56 | QuantizedFacings: 1 57 | ActorSpawner: 58 | MapEditorData: 59 | Categories: System 60 | -------------------------------------------------------------------------------- /mods/d2/rules/missile_tank.yaml: -------------------------------------------------------------------------------- 1 | missile_tank: 2 | Inherits: ^Tank 3 | Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove 4 | Tooltip: 5 | Name: Missile Tank 6 | Buildable: 7 | Queue: Armor 8 | Prerequisites: ~heavy.missiletank, upgrade.heavy, research_centre, ~techlevel.high 9 | BuildPaletteOrder: 60 10 | BuildDuration: 900 11 | BuildDurationModifier: 40 12 | Description: Rocket Artillery\n Strong vs Vehicles, Buildings, Aircraft\n Weak vs Infantry 13 | Valued: 14 | Cost: 450 15 | Mobile: 16 | Speed: 64 17 | TurnSpeed: 20 18 | Health: 19 | HP: 100 20 | Armor: 21 | Type: wood 22 | D2RevealsShroud: 23 | Range: 4c768 24 | MovingRange: 1c768 25 | Armament: 26 | Weapon: mtank_pri 27 | LocalOffset: -128,128,171, -128,-128,171 28 | AttackFrontal: 29 | FacingTolerance: 0 30 | Turreted: 31 | TurnSpeed: 20 32 | RealignDelay: 0 33 | WithSpriteTurret: 34 | AutoTarget: 35 | InitialStanceAI: Defend 36 | Explodes: 37 | Weapon: UnitExplodeMed 38 | EmptyWeapon: UnitExplodeMed 39 | Selectable: 40 | Class: missiletank 41 | SpawnActorOnDeath: 42 | Actor: missile_tank.husk 43 | OwnerType: InternalName 44 | EffectiveOwnerFromOwner: true 45 | AttractsWorms: 46 | Intensity: 600 47 | -------------------------------------------------------------------------------- /mods/d2/rules/ornithopter.yaml: -------------------------------------------------------------------------------- 1 | ornithopter: 2 | Inherits: ^Plane 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | AutoTargetPriority@DEFAULT: 5 | ValidTargets: Infantry, Vehicle, Defense 6 | InvalidTargets: NoAutoTarget, Creep 7 | AutoTargetPriority@ATTACKANYTHING: 8 | ValidTargets: Infantry, Vehicle, Structure, Defense 9 | InvalidTargets: NoAutoTarget, Creep 10 | AutoTarget: 11 | ScanRadius: 1000 12 | InitialStance: AttackAnything 13 | Buildable: 14 | Queue: Aircraft 15 | BuildPaletteOrder: 130 16 | Prerequisites: research_centre, upgrade.hightech, ~aircraft.atreides_or_ordos, ~techlevel.high 17 | Description: Light aircraft armed with missiles.\nAutomatically attacks nearby targets, can't be manually controlled. 18 | AttackMove: 19 | AttackMoveBlockedCursor: 20 | AssaultMoveCursor: 21 | AssaultMoveBlockedCursor: 22 | AttackAircraft: 23 | TargetFrozenActors: true 24 | Armament: 25 | Weapon: OrniMissile 26 | Valued: 27 | Cost: 600 28 | Health: 29 | HP: 10 30 | Armor: 31 | Type: light 32 | Aircraft: 33 | CruiseAltitude: 192 34 | InitialFacing: 0 35 | Speed: 224 # 189 * ~1.2 for balance reasons 36 | TurnSpeed: 20 37 | LandableTerrainTypes: Sand, Spice, SpiceSand, Dune, Concrete 38 | Repulsable: False 39 | CanHover: False 40 | VTOL: False 41 | IdleTurnSpeed: 8 42 | CanSlide: False 43 | Tooltip: 44 | Name: Ornithopter 45 | SpawnActorOnDeath: 46 | Actor: ornithopter.husk 47 | OwnerType: InternalName 48 | EffectiveOwnerFromOwner: true 49 | RejectsOrders: 50 | RevealOnFire: 51 | 52 | ornithopter.husk: 53 | Inherits: ^AircraftHusk 54 | Tooltip: 55 | Name: Ornithopter 56 | Aircraft: 57 | TurnSpeed: 20 58 | Speed: 224 59 | InitialFacing: 768 60 | RenderSprites: 61 | Image: ornithopter 62 | -------------------------------------------------------------------------------- /mods/d2/rules/outpost.yaml: -------------------------------------------------------------------------------- 1 | outpost: 2 | Inherits: ^Building 3 | Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown 4 | Buildable: 5 | Prerequisites: wind_trap 6 | Queue: Building 7 | BuildPaletteOrder: 50 8 | BuildDuration: 1000 9 | BuildDurationModifier: 40 10 | Description: Provides a radar map of the battlefield\n Requires power to operate\n Cannot be captured. 11 | Selectable: 12 | Bounds: 2048, 2048 13 | Valued: 14 | Cost: 400 15 | Tooltip: 16 | Name: Outpost 17 | D2Building: 18 | Footprint: xx xx 19 | Dimensions: 2,2 20 | Health: 21 | HP: 500 22 | HitShape: 23 | Type: Rectangle 24 | TopLeft: -1024, -1024 25 | BottomRight: 1024, 1024 26 | Armor: 27 | Type: building 28 | RevealsShroud: 29 | Range: 9c768 30 | ProvidesRadar: 31 | RequiresCondition: !disabled 32 | WithTilesetBody: 33 | SkipFrames: 1,2 34 | RenderSprites: 35 | Image: outpost 36 | PlayerPalette: player 37 | WithIdleOverlay@DISH: 38 | Sequence: idle-dish 39 | PauseOnCondition: disabled 40 | WithIdleOverlay@FLAG: 41 | Sequence: idle-flag 42 | Power: 43 | Amount: -30 44 | ProvidesPrerequisite@buildingname: 45 | -Capturable: 46 | -CaptureNotification: 47 | -CaptureManager: 48 | -------------------------------------------------------------------------------- /mods/d2/rules/palettes.yaml: -------------------------------------------------------------------------------- 1 | ^Palettes: 2 | PaletteFromFile: 3 | Name: terrain 4 | Filename: IBM.PAL 5 | ShadowIndex: 1 6 | PaletteFromFile@d2: 7 | Name: d2 8 | Filename: IBM.PAL 9 | ShadowIndex: 1 10 | CursorPalette: true 11 | PaletteFromFile@chrome: 12 | Name: chrome 13 | Filename: IBM.PAL 14 | ShadowIndex: 3 15 | AllowModifiers: false 16 | PaletteFromFile@effect: 17 | Name: effect 18 | Filename: IBM.PAL 19 | ShadowIndex: 4 20 | AllowModifiers: false 21 | ColorPickerPalette@colorpicker: 22 | Name: colorpicker 23 | BasePalette: d2 24 | RemapIndex: 144, 145, 146, 147, 148, 149 25 | AllowModifiers: false 26 | PaletteFromFile@shroud: 27 | Name: shroud 28 | Filename: IBM.PAL 29 | PaletteFromFile@fog: 30 | Name: fog 31 | Filename: IBM.PAL 32 | PaletteFromRGBA@shadow: 33 | Name: shadow 34 | R: 0 35 | G: 0 36 | B: 0 37 | A: 140 38 | PaletteFromRGBA@highlight: 39 | Name: highlight 40 | R: 255 41 | G: 255 42 | B: 255 43 | A: 128 44 | PaletteFromRGBA@moveflash: 45 | Name: moveflash 46 | R: 255 47 | G: 255 48 | B: 255 49 | A: 64 50 | PaletteFromRGBA@disabled: 51 | Name: disabled 52 | R: 0 53 | G: 0 54 | B: 0 55 | A: 180 56 | PaletteFromPaletteWithAlpha@effect75alpha: 57 | Name: effect75alpha 58 | BasePalette: effect 59 | Alpha: 0.75 60 | PaletteFromPaletteWithAlpha@effect50alpha: 61 | Name: effect50alpha 62 | BasePalette: effect 63 | Alpha: 0.5 64 | PlayerColorPalette: 65 | BasePalette: d2 66 | RemapIndex: 144, 145, 146, 147, 148, 149 67 | PaletteFromPlayerPaletteWithAlpha@deviatorgas: 68 | BaseName: deviatorgas 69 | BasePalette: player 70 | Alpha: 0.68 71 | Premultiply: false 72 | FlashPaletteEffect: 73 | PaletteFromPlayerPaletteWithAlpha@cloak: 74 | BaseName: cloak 75 | BasePalette: player 76 | Alpha: 0.55 77 | PaletteFromPlayerPaletteWithAlpha@wind: 78 | BaseName: wind 79 | BasePalette: player 80 | D2WindtrapPaletteEffect@wind: 81 | PaletteName: wind 82 | -------------------------------------------------------------------------------- /mods/d2/rules/plane.yaml: -------------------------------------------------------------------------------- 1 | ^Plane: 2 | Inherits@1: ^ExistsInWorld 3 | Inherits@2: ^SpriteActor 4 | Interactable: 5 | Tooltip: 6 | GenericName: Unit 7 | Huntable: 8 | OwnerLostAction: 9 | Action: Kill 10 | AppearsOnRadar: 11 | UseLocation: true 12 | HiddenUnderFog: 13 | Type: GroundPosition 14 | AlwaysVisibleRelationships: None 15 | ActorLostNotification: 16 | WithFacingSpriteBody: 17 | WithShadow: 18 | HitShape: 19 | MapEditorData: 20 | Categories: Aircraft 21 | -------------------------------------------------------------------------------- /mods/d2/rules/player.yaml: -------------------------------------------------------------------------------- 1 | ^BasePlayer: 2 | AlwaysVisible: 3 | Shroud: 4 | PlayerResources: 5 | ResourceValues: 6 | Spice: 25 7 | 8 | EditorPlayer: 9 | Inherits: ^BasePlayer 10 | 11 | Player: 12 | Inherits: ^BasePlayer 13 | TechTree: 14 | PlaceBuilding: 15 | NewOptionsNotification: NewOptions 16 | CannotPlaceNotification: BuildingCannotPlaceAudio 17 | SupportPowerManager: 18 | ScriptTriggers: 19 | MissionObjectives: 20 | WinNotification: Win 21 | LoseNotification: Lose 22 | LeaveNotification: Leave 23 | ConquestVictoryConditions: 24 | PowerManager: 25 | AdviceInterval: 26000 26 | SpeechNotification: LowPower 27 | AllyRepair: 28 | PlayerResources: 29 | SelectableCash: 1000, 1500, 2000 30 | DefaultCash: 1500 31 | InsufficientFundsNotification: InsufficientFunds 32 | CashTickUpNotification: CashTickUp 33 | CashTickDownNotification: CashTickDown 34 | DeveloperMode: 35 | CheckboxDisplayOrder: 7 36 | BaseAttackNotifier: 37 | Shroud: 38 | FogCheckboxDisplayOrder: 3 39 | FrozenActorLayer: 40 | HarvesterAttackNotifier: 41 | PlayerStatistics: 42 | PlaceBeacon: 43 | ProvidesPrerequisite@atreides: 44 | Prerequisite: player.atreides 45 | Factions: atreides 46 | ProvidesPrerequisite@harkonnen: 47 | Prerequisite: player.harkonnen 48 | Factions: harkonnen 49 | ProvidesPrerequisite@ordos: 50 | Prerequisite: player.ordos 51 | Factions: ordos 52 | ProvidesPrerequisite@corrino: 53 | Prerequisite: player.corrino 54 | Factions: corrino 55 | ProvidesPrerequisite@fremen: 56 | Prerequisite: player.fremen 57 | Factions: fremen 58 | ProvidesPrerequisite@mercenary: 59 | Prerequisite: player.mercenary 60 | Factions: mercenary 61 | ProvidesPrerequisite@smuggler: 62 | Prerequisite: player.smuggler 63 | Factions: smuggler 64 | ProvidesTechPrerequisite@low: 65 | Name: Low 66 | Prerequisites: techlevel.low 67 | Id: low 68 | ProvidesTechPrerequisite@medium: 69 | Name: Medium 70 | Prerequisites: techlevel.low, techlevel.medium 71 | Id: medium 72 | ProvidesTechPrerequisite@nosuper: 73 | Name: No Powers 74 | Prerequisites: techlevel.low, techlevel.medium, techlevel.high 75 | Id: nopowers 76 | ProvidesTechPrerequisite@all: 77 | Name: Unrestricted 78 | Prerequisites: techlevel.low, techlevel.medium, techlevel.high, techlevel.superweapons 79 | Id: unrestricted 80 | EnemyWatcher: 81 | HarvesterInsurance: 82 | GrantConditionOnPrerequisiteManager: 83 | ResourceStorageWarning: 84 | AdviceInterval: 26000 85 | #PlayerExperience: 86 | GameSaveViewportManager: 87 | -------------------------------------------------------------------------------- /mods/d2/rules/powerdown.yaml: -------------------------------------------------------------------------------- 1 | ^DisableOnLowPower: 2 | GrantConditionOnPowerState@LOWPOWER: 3 | Condition: lowpower 4 | ValidPowerStates: Low, Critical 5 | GrantCondition@IDISABLE: 6 | RequiresCondition: lowpower 7 | Condition: disabled 8 | 9 | ^DisableOnLowPowerOrPowerDown: 10 | Inherits: ^DisableOnLowPower 11 | GrantCondition@IDISABLE: 12 | RequiresCondition: lowpower || powerdown 13 | Condition: disabled 14 | ToggleConditionOnOrder: 15 | DisabledSound: EnablePower 16 | EnabledSound: DisablePower 17 | Condition: powerdown 18 | OrderName: PowerDown 19 | WithDecoration@POWERDOWN: 20 | Image: poweroff 21 | Sequence: offline 22 | Palette: chrome 23 | RequiresCondition: powerdown 24 | Position: Center 25 | PowerMultiplier@POWERDOWN: 26 | RequiresCondition: powerdown 27 | Modifier: 0 28 | -------------------------------------------------------------------------------- /mods/d2/rules/quad.yaml: -------------------------------------------------------------------------------- 1 | quad: 2 | Inherits: ^Vehicle 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Vehicle 6 | Prerequisites: light.harkonnen_or_upgrade.light, ~techlevel.medium 7 | BuildPaletteOrder: 20 8 | BuildDuration: 600 9 | BuildDurationModifier: 40 10 | Description: Missile Scout\n Strong vs Vehicles\n Weak vs Infantry 11 | Valued: 12 | Cost: 200 13 | Tooltip: 14 | Name: Missile Quad 15 | Health: 16 | HP: 130 17 | Armor: 18 | Type: light 19 | Mobile: 20 | TurnSpeed: 32 21 | Speed: 96 22 | D2RevealsShroud: 23 | Range: 2c0 24 | MovingRange: 1c768 25 | Armament: 26 | Weapon: Rocket 27 | LocalOffset: 128,64,64, 128,-64,64 28 | AttackFrontal: 29 | FacingTolerance: 0 30 | Explodes: 31 | Weapon: UnitExplodeSmall 32 | EmptyWeapon: UnitExplodeSmall 33 | Selectable: 34 | Class: quad 35 | AttractsWorms: 36 | Intensity: 470 37 | -------------------------------------------------------------------------------- /mods/d2/rules/raider.yaml: -------------------------------------------------------------------------------- 1 | raider: 2 | Inherits: ^Vehicle 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Vehicle 6 | BuildPaletteOrder: 10 7 | BuildDuration: 500 8 | BuildDurationModifier: 40 9 | Prerequisites: ~light.ordos 10 | Description: Fast scout vehicle with low armor\n Strong vs Infantry\n Weak vs Tanks, Aircraft 11 | Valued: 12 | Cost: 150 13 | Tooltip: 14 | Name: Raider Trike 15 | Health: 16 | HP: 80 17 | Armor: 18 | Type: wood 19 | Mobile: 20 | TurnSpeed: 40 21 | Speed: 149 22 | D2RevealsShroud: 23 | Range: 2c0 24 | MovingRange: 1c768 25 | WithMuzzleOverlay: 26 | Armament@damage: 27 | Weapon: HMG 28 | LocalOffset: 170,0,0 29 | Armament@muzzle: 30 | Weapon: HMG_muzzle 31 | LocalOffset: 170,0,0 32 | MuzzleSequence: muzzle 33 | AttackFrontal: 34 | FacingTolerance: 0 35 | Explodes: 36 | Weapon: UnitExplodeSmall 37 | EmptyWeapon: UnitExplodeSmall 38 | AttractsWorms: 39 | Intensity: 420 40 | -------------------------------------------------------------------------------- /mods/d2/rules/refinery.yaml: -------------------------------------------------------------------------------- 1 | refinery: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: wind_trap 5 | Queue: Building 6 | BuildPaletteOrder: 30 7 | BuildDuration: 1000 8 | BuildDurationModifier: 40 9 | Description: Harvesters unload Spice here for processing 10 | Selectable: 11 | Bounds: 3072, 2048 12 | Valued: 13 | Cost: 400 14 | Tooltip: 15 | Name: Spice Refinery 16 | D2Building: 17 | Footprint: xx= xx= 18 | Dimensions: 3,2 19 | Health: 20 | HP: 450 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1536 24 | BottomRight: 1024, 1536 25 | Armor: 26 | Type: heavy 27 | RevealsShroud: 28 | Range: 4c0 29 | Refinery: 30 | DockAngle: 480 31 | DockOffset: 2,1 32 | TickRate: 20 33 | ShowTicks: false 34 | StoresResources: 35 | Capacity: 2000 36 | FreeActorWithDelivery: 37 | Actor: harvester 38 | DeliveryOffset: 2,1 39 | DeliveringActor: carryall.reinforce 40 | Facing: 120 41 | WithSpriteBody: 42 | WithTilesetBody: 43 | SkipFrames: 1,2,5 44 | RenderSprites: 45 | Image: refinery 46 | Power: 47 | Amount: -30 48 | WithIdleOverlay@FLAG: 49 | Sequence: idle-flag 50 | WithIdleOverlay@DOCK1: 51 | Sequence: idle-dock-top 52 | WithIdleOverlay@DOCK2: 53 | Sequence: idle-dock-bottom 54 | ProvidesPrerequisite@buildingname: 55 | WithResourceStoragePipsDecoration: 56 | Position: BottomLeft 57 | RequiresSelection: true 58 | PipCount: 10 59 | -------------------------------------------------------------------------------- /mods/d2/rules/repair_pad.yaml: -------------------------------------------------------------------------------- 1 | repair_pad: 2 | Inherits: ^Building 3 | Buildable: 4 | Queue: Building 5 | Prerequisites: light_factory, wind_trap, outpost, ~techlevel.medium 6 | BuildPaletteOrder: 160 7 | BuildDuration: 1000 8 | BuildDurationModifier: 40 9 | Description: Repairs vehicles\n Allows construction of MCVs 10 | Valued: 11 | Cost: 700 12 | Tooltip: 13 | Name: Repair Pad 14 | D2Building: 15 | Footprint: xxx xxx 16 | Dimensions: 3,2 17 | Health: 18 | HP: 200 19 | HitShape: 20 | Type: Rectangle 21 | TopLeft: -1024, -1536 22 | BottomRight: 1024, 1536 23 | Armor: 24 | Type: building 25 | RevealsShroud: 26 | Range: 3c0 27 | Selectable: 28 | Bounds: 3072, 2048 29 | Reservable: 30 | RepairsUnits: 31 | Interval: 10 32 | HpPerStep: 80 33 | FinishRepairingNotification: UnitRepaired 34 | RallyPoint: 35 | Path: 1,3 36 | WithTilesetBody: 37 | SkipFrames: 1 38 | RenderSprites: 39 | Image: repair_pad 40 | WithIdleOverlay@FLAG: 41 | Sequence: idle-flag 42 | WithRepairOverlay@ACTIVE1: 43 | Sequence: active-1 44 | WithRepairOverlay@ACTIVE2: 45 | Sequence: active-2 46 | Power: 47 | Amount: -20 48 | ProvidesPrerequisite@buildingname: 49 | -------------------------------------------------------------------------------- /mods/d2/rules/research_centre.yaml: -------------------------------------------------------------------------------- 1 | research_centre: 2 | Inherits: ^Building 3 | Buildable: 4 | Queue: Building 5 | Prerequisites: wind_trap, starport, refinery, ~techlevel.high 6 | BuildPaletteOrder: 150 7 | BuildDuration: 1500 8 | BuildDurationModifier: 40 9 | Description: Unlocks experimental tanks\n Cannot be captured. 10 | Selectable: 11 | Bounds: 2048, 2048 12 | Valued: 13 | Cost: 500 14 | Tooltip: 15 | Name: Ix Lab 16 | D2Building: 17 | Footprint: xx xx 18 | Dimensions: 2,2 19 | Health: 20 | HP: 400 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1024 24 | BottomRight: 1024, 1024 25 | Armor: 26 | Type: building 27 | RevealsShroud: 28 | Range: 3c0 29 | WithTilesetBody: 30 | SkipFrames: 3 31 | RenderSprites: 32 | Image: research 33 | WithIdleOverlay@FLAG: 34 | Sequence: idle-flag 35 | Power: 36 | Amount: -40 37 | ProvidesPrerequisite@buildingname: 38 | -Capturable: 39 | -CaptureNotification: 40 | -CaptureManager: 41 | -------------------------------------------------------------------------------- /mods/d2/rules/rocket_turret.yaml: -------------------------------------------------------------------------------- 1 | rocket_turret: 2 | Inherits: ^Defense 3 | Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown 4 | Inherits@AUTOTARGET: ^AutoTargetGround 5 | AttackTurreted: 6 | PauseOnCondition: disabled 7 | Buildable: 8 | Queue: Building 9 | Prerequisites: wind_trap, outpost, upgrade.conyard, ~techlevel.medium 10 | BuildPaletteOrder: 90 11 | BuildDuration: 1200 12 | BuildDurationModifier: 40 13 | Description: Defensive structure\n Strong vs Infantry, Aircraft\n Weak vs Tanks\n\n Requires power to operate 14 | Valued: 15 | Cost: 250 16 | Tooltip: 17 | Name: Rocket Turret 18 | D2Building: 19 | BuildSounds: CHUNG.WAV 20 | RequiresBuildableArea: 21 | Adjacent: 1 22 | Selectable: 23 | Bounds: 1024, 1024 24 | Priority: 3 25 | Health: 26 | HP: 200 27 | Armor: 28 | Type: heavy 29 | RevealsShroud: 30 | Range: 5c768 31 | BodyOrientation: 32 | QuantizedFacings: 8 33 | Armament: 34 | Weapon: TowerMissile 35 | LocalOffset: 256,384,768, 256,-384,768 36 | Turreted: 37 | TurnSpeed: 32 38 | InitialFacing: 512 39 | Power: 40 | Amount: -25 41 | RevealOnDeath: 42 | Radius: 5c768 43 | -------------------------------------------------------------------------------- /mods/d2/rules/saboteur.yaml: -------------------------------------------------------------------------------- 1 | saboteur: 2 | Inherits: ^Infantry 3 | Buildable: 4 | Queue: Infantry 5 | BuildPaletteOrder: 100 6 | Prerequisites: ~disabled 7 | Description: Sneaky infantry, armed with explosives\n Strong vs Buildings\n Weak vs Everything\n Special Ability: destroy buildings 8 | Valued: 9 | Cost: 300 ## actually 0, but spawns from support power at Palace 10 | Tooltip: 11 | Name: Saboteur 12 | Health: 13 | HP: 10 14 | Mobile: 15 | Speed: 43 16 | Demolition: 17 | DetonationDelay: 0 18 | Flashes: 0 19 | EnterBehaviour: Suicide 20 | Cloak: 21 | InitialDelay: 85 22 | CloakDelay: 85 23 | CloakSound: STEALTH1.WAV 24 | UncloakOn: Attack, Unload, Infiltrate, Demolish, Move, Damage, Heal 25 | IsPlayerPalette: true 26 | PauseOnCondition: cloak-force-disabled 27 | GrantConditionOnDamageState@UNCLOAK: 28 | Condition: cloak-force-disabled 29 | ValidDamageStates: Critical 30 | Voiced: 31 | VoiceSet: SaboteurVoice 32 | -------------------------------------------------------------------------------- /mods/d2/rules/sandworm.yaml: -------------------------------------------------------------------------------- 1 | sandworm: 2 | Inherits@1: ^SpriteActor 3 | Interactable: 4 | Tooltip: 5 | Name: Sandworm 6 | Health: 7 | HP: 1000 8 | HitShape: 9 | Type: Circle 10 | Radius: 256 11 | Armor: 12 | Type: heavy 13 | Mobile: 14 | Speed: 42 15 | Locomotor: worm 16 | Targetable: 17 | TargetTypes: Ground, Creep 18 | WithSpriteBody: 19 | WithAttackOverlay@mouth: 20 | Sequence: mouth 21 | HiddenUnderFog: 22 | AppearsOnRadar: 23 | UseLocation: true 24 | AttackSwallow: 25 | AttackRequiresEnteringCell: true 26 | AttackingCondition: attacking 27 | WormAttackSound: WORMET3P.VOC 28 | Armament: 29 | Weapon: WormJaw 30 | Sandworm: 31 | WanderMoveRadius: 5 32 | IgnoresCloak: 33 | AnnounceOnSeen: 34 | Notification: WormSign 35 | PingRadar: True 36 | RevealsShroud: 37 | Range: 5c0 38 | LeavesTrails: 39 | Image: sandtrail 40 | Sequences: traila, trailb, trailc 41 | Palette: effect 42 | Type: CenterPosition 43 | TerrainTypes: Sand, Dune, Spice 44 | MovingInterval: 3 45 | RequiresCondition: !attacking 46 | RevealOnFire: 47 | Duration: 50 48 | Radius: 2c512 49 | Buildable: 50 | Description: Attracted by vibrations in the sand.\nWill eat units whole and has a large appetite. 51 | -------------------------------------------------------------------------------- /mods/d2/rules/sardaukar.yaml: -------------------------------------------------------------------------------- 1 | sardaukar: 2 | Inherits: ^Infantry 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Infantry 6 | BuildPaletteOrder: 80 7 | BuildDuration: 700 8 | BuildDurationModifier: 40 9 | Prerequisites: ~barracks.harkonnen, palace, ~techlevel.high 10 | Description: Elite assault infantry\n Strong vs Infantry, Vehicles\n Weak vs Artillery 11 | Valued: 12 | Cost: 200 13 | Tooltip: 14 | Name: Sardaukar 15 | Health: 16 | HP: 1000 17 | Mobile: 18 | Speed: 31 19 | Armament@PRIMARY: 20 | Weapon: M_LMG 21 | Armament@SECONDARY: 22 | Weapon: M_HMG 23 | AttackFrontal: 24 | FacingTolerance: 0 25 | Voiced: 26 | VoiceSet: GenericVoice 27 | Explodes: 28 | Weapon: SardDeath 29 | EmptyWeapon: SardDeath 30 | Chance: 100 31 | -------------------------------------------------------------------------------- /mods/d2/rules/siege_tank.yaml: -------------------------------------------------------------------------------- 1 | siege_tank: 2 | Inherits: ^Tank 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Armor 6 | Prerequisites: upgrade.heavy, ~techlevel.medium 7 | BuildPaletteOrder: 50 8 | BuildDuration: 1200 9 | BuildDurationModifier: 40 10 | Description: Siege Artillery\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft 11 | Valued: 12 | Cost: 600 13 | Tooltip: 14 | Name: Siege Tank 15 | Health: 16 | HP: 300 17 | Armor: 18 | Type: light 19 | Mobile: 20 | Speed: 43 21 | TurnSpeed: 12 22 | D2RevealsShroud: 23 | Range: 4c0 24 | MovingRange: 1c768 25 | Turreted: 26 | TurnSpeed: 12 27 | Offset: 0,0,-32 28 | Armament: 29 | Weapon: 155mm 30 | Recoil: 150 31 | RecoilRecovery: 19 32 | LocalOffset: 512,0,320 33 | MuzzleSequence: muzzle 34 | AttackFrontal: 35 | FacingTolerance: 0 36 | WithMuzzleOverlay: 37 | WithSpriteTurret: 38 | Explodes: 39 | Weapon: UnitExplodeMed 40 | EmptyWeapon: UnitExplodeMed 41 | AutoTarget: 42 | InitialStanceAI: Defend 43 | Selectable: 44 | Class: siegetank 45 | SpawnActorOnDeath: 46 | Actor: siege_tank.husk 47 | OwnerType: InternalName 48 | EffectiveOwnerFromOwner: true 49 | AttractsWorms: 50 | Intensity: 600 51 | -------------------------------------------------------------------------------- /mods/d2/rules/silo.yaml: -------------------------------------------------------------------------------- 1 | silo: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: wind_trap, refinery 5 | Queue: Building 6 | BuildPaletteOrder: 60 7 | BuildDuration: 600 8 | BuildDurationModifier: 40 9 | Description: Stores excess harvested Spice 10 | Selectable: 11 | Bounds: 2048, 2048 12 | Valued: 13 | Cost: 150 14 | Tooltip: 15 | Name: Silo 16 | RequiresBuildableArea: 17 | Adjacent: 1 18 | D2Building: 19 | Health: 20 | HP: 150 21 | Armor: 22 | Type: building 23 | RevealsShroud: 24 | Range: 2c0 25 | WithTilesetBody: 26 | SkipFrames: 1 27 | RenderSprites: 28 | Image: silo 29 | PlayerPalette: player 30 | StoresResources: 31 | Capacity: 2000 32 | WithIdleOverlay@FLAG: 33 | Sequence: idle-flag 34 | Power: 35 | Amount: -5 36 | MustBeDestroyed: 37 | RequiredForShortGame: false 38 | RevealOnDeath: 39 | Radius: 2c768 40 | WithResourceStoragePipsDecoration: 41 | Position: BottomLeft 42 | RequiresSelection: true 43 | PipCount: 5 44 | -------------------------------------------------------------------------------- /mods/d2/rules/sonic_tank.yaml: -------------------------------------------------------------------------------- 1 | sonic_tank: 2 | Inherits: ^Vehicle 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Armor 6 | BuildPaletteOrder: 100 7 | BuildDuration: 1300 8 | BuildDurationModifier: 40 9 | Prerequisites: ~heavy.atreides, research_centre, ~techlevel.high 10 | Description: Fires sonic shocks\n Strong vs Infantry, Vehicles\n Weak vs Artillery, Aircraft 11 | Valued: 12 | Cost: 600 13 | Tooltip: 14 | Name: Sonic Tank 15 | Health: 16 | HP: 110 17 | Armor: 18 | Type: light 19 | Mobile: 20 | TurnSpeed: 12 21 | Speed: 31 22 | D2RevealsShroud: 23 | Range: 4c0 24 | MovingRange: 1c768 25 | Armament: 26 | Weapon: Sound 27 | LocalOffset: 600,0,427 28 | AttackFrontal: 29 | FacingTolerance: 0 30 | Turreted: 31 | TurnSpeed: 20 32 | RealignDelay: 0 33 | WithSpriteTurret: 34 | Explodes: 35 | Weapon: UnitExplodeLarge 36 | EmptyWeapon: UnitExplodeLarge 37 | SpawnActorOnDeath: 38 | Actor: sonic_tank.husk 39 | AttractsWorms: 40 | Intensity: 600 41 | -------------------------------------------------------------------------------- /mods/d2/rules/spicebloom.yaml: -------------------------------------------------------------------------------- 1 | spicebloom.spawnpoint: 2 | Interactable: 3 | EditorOnlyTooltip: 4 | Name: Spice Bloom spawnpoint 5 | AlwaysVisible: 6 | RenderSpritesEditorOnly: 7 | Image: spicebloom 8 | Palette: effect50alpha 9 | WithSpriteBody: 10 | BodyOrientation: 11 | QuantizedFacings: 1 12 | GrantConditionOnTerrain: 13 | Condition: clearsand 14 | TerrainTypes: SpiceSand 15 | KillsSelf: 16 | RequiresCondition: clearsand 17 | Delay: 1750, 3250 18 | SpawnActorOnDeath: 19 | Actor: spicebloom 20 | Health: 21 | HP: 9999 22 | Immobile: 23 | OccupiesSpace: false 24 | HitShape: 25 | Type: Circle 26 | Radius: 1 27 | MapEditorData: 28 | Categories: System 29 | 30 | spicebloom: 31 | HiddenUnderShroud: 32 | BodyOrientation: 33 | QuantizedFacings: 1 34 | RenderSprites: 35 | AppearsOnRadar: 36 | UseLocation: true 37 | WithSpriteBody: 38 | Tooltip: 39 | Name: Spice Bloom 40 | Explodes: 41 | Weapon: BloomExplosion 42 | EmptyWeapon: BloomExplosion 43 | Crushable: 44 | CrushClasses: spicebloom 45 | CrushedByFriendlies: true 46 | RadarColorFromTerrain: 47 | Terrain: Spice 48 | Immobile: 49 | Health: 50 | HP: 1 51 | Targetable: 52 | TargetTypes: Ground 53 | RequiresForceFire: true 54 | Armor: 55 | Type: none 56 | SpawnActorOnDeath: 57 | Actor: spicebloom.spawnpoint 58 | HitShape: 59 | Type: Circle 60 | Radius: 512 61 | MapEditorData: 62 | Categories: System 63 | Interactable: 64 | -------------------------------------------------------------------------------- /mods/d2/rules/starport.yaml: -------------------------------------------------------------------------------- 1 | starport: 2 | Inherits: ^Building 3 | Tooltip: 4 | Name: Starport 5 | Buildable: 6 | Prerequisites: wind_trap, refinery, ~techlevel.high 7 | Queue: Building 8 | BuildPaletteOrder: 120 9 | BuildDuration: 1500 10 | BuildDurationModifier: 40 11 | Description: Dropzone for quick reinforcements, at a price.\n Requires power to operate 12 | Valued: 13 | Cost: 500 14 | D2Building: 15 | Footprint: xxx ==x ==x 16 | Dimensions: 3,3 17 | Selectable: 18 | Bounds: 3072, 3072 19 | Health: 20 | HP: 500 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1536, -1536 24 | BottomRight: 1536, 1536 25 | Armor: 26 | Type: heavy 27 | RevealsShroud: 28 | Range: 5c768 29 | RallyPoint: 30 | Path: 1,3 31 | Exit@1: 32 | SpawnOffset: 0,-480,0 33 | ExitCell: 2,2 34 | Exit@2: 35 | SpawnOffset: 0,-480,0 36 | ExitCell: 0,2 37 | ProductionAirdrop: 38 | Produces: Starport 39 | ActorType: frigate 40 | ProductionBar: 41 | ProductionType: Starport 42 | ProductionQueue: 43 | Type: Starport 44 | Group: Starport 45 | BlockedAudio: NoRoom 46 | BuildDurationModifier: 212 47 | WithTilesetBody: 48 | SkipFrames: 0 49 | RenderSprites: 50 | Image: starport 51 | PlayerPalette: player 52 | WithIdleOverlay@FLAG: 53 | Sequence: idle-flag 54 | ProvidesPrerequisite@atreides: 55 | Prerequisite: starport.atreides 56 | Factions: atreides 57 | ProvidesPrerequisite@ordos: 58 | Prerequisite: starport.ordos 59 | Factions: ordos 60 | ProvidesPrerequisite@harkonnen: 61 | Prerequisite: starport.harkonnen 62 | Factions: harkonnen 63 | ProvidesPrerequisite@atreides_combat: 64 | Prerequisite: starport.atreides_combat 65 | Factions: atreides, fremen 66 | ProvidesPrerequisite@ordos_combat: 67 | Prerequisite: starport.ordos_combat 68 | Factions: ordos, smuggler, mercenary 69 | ProvidesPrerequisite@harkonnen_combat: 70 | Prerequisite: starport.harkonnen_combat 71 | Factions: harkonnen, corrino 72 | Power: 73 | Amount: -50 74 | ProvidesPrerequisite@buildingname: 75 | -------------------------------------------------------------------------------- /mods/d2/rules/starport_items.yaml: -------------------------------------------------------------------------------- 1 | mcv.starport: 2 | Inherits: mcv 3 | Buildable: 4 | Prerequisites: starport 5 | Queue: Starport 6 | Valued: 7 | Cost: 1500 8 | RenderSprites: 9 | Image: mcv 10 | 11 | harvester.starport: 12 | Inherits: harvester 13 | Buildable: 14 | Prerequisites: starport 15 | Queue: Starport 16 | Valued: 17 | Cost: 700 18 | RenderSprites: 19 | Image: harvester 20 | 21 | trike.starport: 22 | Inherits: trike 23 | Buildable: 24 | Prerequisites: starport 25 | Queue: Starport 26 | Valued: 27 | Cost: 400 28 | RenderSprites: 29 | Image: trike 30 | 31 | quad.starport: 32 | Inherits: quad 33 | Buildable: 34 | Prerequisites: starport 35 | Queue: Starport 36 | Valued: 37 | Cost: 600 38 | RenderSprites: 39 | Image: quad 40 | 41 | siege_tank.starport: 42 | Inherits: siege_tank 43 | Buildable: 44 | Prerequisites: starport 45 | Queue: Starport 46 | Valued: 47 | Cost: 1000 48 | RenderSprites: 49 | Image: siege_tank 50 | 51 | missile_tank.starport: 52 | Inherits: missile_tank 53 | Buildable: 54 | Prerequisites: starport 55 | Queue: Starport 56 | Valued: 57 | Cost: 1700 58 | RenderSprites: 59 | Image: missile_tank 60 | 61 | combat_tank.starport: 62 | Inherits: combat_tank 63 | Buildable: 64 | Prerequisites: starport 65 | Queue: Starport 66 | Valued: 67 | Cost: 1300 68 | RenderSprites: 69 | Image: combat_tank 70 | 71 | carryall.starport: 72 | Inherits: carryall 73 | Buildable: 74 | Prerequisites: starport 75 | Queue: Starport 76 | Valued: 77 | Cost: 1500 78 | -------------------------------------------------------------------------------- /mods/d2/rules/tank.yaml: -------------------------------------------------------------------------------- 1 | ^Tank: 2 | Inherits: ^Vehicle 3 | Mobile: 4 | Locomotor: tank 5 | TurnSpeed: 20 6 | -------------------------------------------------------------------------------- /mods/d2/rules/trike.yaml: -------------------------------------------------------------------------------- 1 | trike: 2 | Inherits: ^Vehicle 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Vehicle 6 | BuildPaletteOrder: 10 7 | BuildDuration: 500 8 | BuildDurationModifier: 40 9 | Prerequisites: ~light.atreides 10 | Description: Scout vehicle with decent armor\n Strong vs Infantry\n Weak vs Tanks, Aircraft 11 | Valued: 12 | Cost: 150 13 | Tooltip: 14 | Name: Trike 15 | Selectable: 16 | Class: trike 17 | Health: 18 | HP: 100 19 | Armor: 20 | Type: wood 21 | Mobile: 22 | TurnSpeed: 40 23 | Speed: 128 24 | D2RevealsShroud: 25 | Range: 2c0 26 | MovingRange: 1c768 27 | WithMuzzleOverlay: 28 | Armament@damage: 29 | Weapon: HMG 30 | LocalOffset: -416,0,0 31 | Armament@muzzle: 32 | Weapon: HMG_muzzle 33 | LocalOffset: -416,0,0 34 | MuzzleSequence: muzzle 35 | AttackFrontal: 36 | FacingTolerance: 0 37 | Explodes: 38 | Weapon: UnitExplodeSmall 39 | EmptyWeapon: UnitExplodeSmall 40 | AttractsWorms: 41 | Intensity: 420 42 | -------------------------------------------------------------------------------- /mods/d2/rules/trooper.yaml: -------------------------------------------------------------------------------- 1 | trooper: 2 | Inherits: ^Infantry 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Trooper 6 | BuildPaletteOrder: 20 7 | BuildDuration: 700 8 | BuildDurationModifier: 40 9 | Description: Anti-tank/Anti-aircraft infantry\n Strong vs Tanks, Aircraft\n Weak vs Infantry, Artillery 10 | Valued: 11 | Cost: 100 12 | Tooltip: 13 | Name: Trooper 14 | Health: 15 | HP: 45 16 | Mobile: 17 | Speed: 31 18 | Armament: 19 | Weapon: Bazooka 20 | LocalOffset: 128,0,256 21 | AttackFrontal: 22 | FacingTolerance: 0 23 | -------------------------------------------------------------------------------- /mods/d2/rules/trooper_squad.yaml: -------------------------------------------------------------------------------- 1 | trooper_squad: 2 | Inherits: ^Infantry_squad 3 | Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove 4 | Buildable: 5 | Queue: Trooper 6 | BuildPaletteOrder: 20 7 | BuildDuration: 700 8 | BuildDurationModifier: 40 9 | Prerequisites: upgrade.wor, ~techlevel.medium 10 | Description: Anti-tank/Anti-aircraft infantry\n Strong vs Tanks, Aircraft\n Weak vs Infantry, Artillery 11 | Valued: 12 | Cost: 200 13 | Tooltip: 14 | Name: Trooper 15 | Health: 16 | HP: 110 17 | Mobile: 18 | Speed: 31 19 | Armament: 20 | Weapon: Bazooka_squad 21 | LocalOffset: 128,0,256 22 | AttackFrontal: 23 | FacingTolerance: 0 24 | SpawnActorOnDeath: 25 | Actor: trooper 26 | Selectable: 27 | Bounds: 1024, 1024, 0, 0 28 | -------------------------------------------------------------------------------- /mods/d2/rules/vechicle.yaml: -------------------------------------------------------------------------------- 1 | ^Vehicle: 2 | Inherits@1: ^ExistsInWorld 3 | Inherits@3: ^SpriteActor 4 | Tooltip: 5 | GenericName: Unit 6 | Huntable: 7 | Mobile: 8 | Locomotor: vehicle 9 | TurnSpeed: 20 10 | PauseOnCondition: notmobile 11 | SelectionDecorations: 12 | Selectable: 13 | Bounds: 1024, 1024 14 | Targetable: 15 | TargetTypes: Ground, Vehicle, C4 16 | Passenger: 17 | CargoType: Vehicle 18 | AttackMove: 19 | AttackMoveBlockedCursor: 20 | AssaultMoveCursor: 21 | AssaultMoveBlockedCursor: 22 | HiddenUnderFog: 23 | ActorLostNotification: 24 | Repairable: 25 | RepairActors: repair_pad 26 | Guard: 27 | Voice: Guard 28 | Guardable: 29 | WithFacingSpriteBody: 30 | Demolishable: 31 | TemporaryOwnerManager: 32 | MustBeDestroyed: 33 | Voiced: 34 | VoiceSet: VehicleVoice 35 | AutoCarryable: 36 | CarriedCondition: notmobile 37 | ReservedCondition: carryall-reserved 38 | WithDecoration@CARRYALL: 39 | Image: pips 40 | Sequence: pickup-indicator 41 | RequiresCondition: carryall-reserved 42 | Offsets: 43 | carryall-reserved: -12, -12 44 | RevealOnFire: 45 | RevealOnDeath: 46 | Duration: 100 47 | Radius: 2c512 48 | WithDamageOverlay: 49 | D2LeavesTracks: 50 | Image: track 51 | Palette: d2 52 | TerrainTypes: Sand, Dune, Spice 53 | WithSpriteControlGroupDecoration: 54 | HitShape: 55 | MapEditorData: 56 | Categories: Vehicle 57 | -------------------------------------------------------------------------------- /mods/d2/rules/vechiclehusk.yaml: -------------------------------------------------------------------------------- 1 | ^VehicleHusk: 2 | Inherits: ^Husk 3 | Husk: 4 | AllowedTerrain: Sand, Rock, Transition, Concrete, Spice, SpiceSand, SpiceBlobs, Dune 5 | Targetable: 6 | TargetTypes: Ground, Vehicle 7 | RequiresForceFire: true 8 | WithColoredOverlay@IDISABLE: 9 | Explodes: 10 | Weapon: UnitExplodeMed 11 | EmptyWeapon: UnitExplodeMed 12 | WithIdleOverlay@Burns: 13 | Image: fire 14 | Sequence: 1 15 | IsDecoration: True 16 | ChangesHealth: 17 | Step: -10 18 | StartIfBelow: 101 19 | Delay: 4 20 | -------------------------------------------------------------------------------- /mods/d2/rules/wall.yaml: -------------------------------------------------------------------------------- 1 | wall: 2 | Inherits@1: ^SpriteActor 3 | Interactable: 4 | CombatDebugOverlay: 5 | FrozenUnderFog: 6 | ScriptTriggers: 7 | Buildable: 8 | Queue: Building 9 | Prerequisites: wind_trap, outpost 10 | BuildPaletteOrder: 70 11 | BuildDuration: 500 12 | BuildDurationModifier: 40 13 | Description: Stop units and blocks enemy fire. 14 | SoundOnDamageTransition: 15 | DamagedSounds: 16 | DestroyedSounds: EXPLSML4.WAV 17 | Valued: 18 | Cost: 50 19 | Tooltip: 20 | Name: Concrete Wall 21 | GenericName: Structure 22 | AppearsOnRadar: 23 | D2Building: 24 | BuildSounds: CHUNG.WAV 25 | TerrainTypes: Rock, Concrete 26 | D2PlaceBuildingPreview: 27 | RequiresBuildableArea: 28 | AreaTypes: building 29 | Adjacent: 1 30 | GivesBuildableArea: 31 | AreaTypes: building 32 | Health: 33 | HP: 50 34 | Armor: 35 | Type: wall 36 | RevealsShroud: 37 | Range: 1c0 38 | Crushable: 39 | CrushClasses: wall 40 | BlocksProjectiles: 41 | Height: 512 42 | Targetable: 43 | TargetTypes: Ground, Wall 44 | WithWallSpriteBody: 45 | Guardable: 46 | Explodes: 47 | Weapon: WallExplode 48 | EmptyWeapon: WallExplode 49 | HitShape: 50 | Type: Rectangle 51 | TopLeft: -512, -512 52 | BottomRight: 512, 512 53 | MapEditorData: 54 | Categories: Defense 55 | -------------------------------------------------------------------------------- /mods/d2/rules/wind_trap.yaml: -------------------------------------------------------------------------------- 1 | wind_trap: 2 | Inherits: ^Building 3 | Buildable: 4 | Queue: Building 5 | BuildPaletteOrder: 20 6 | BuildDuration: 600 7 | BuildDurationModifier: 40 8 | Description: Provides power for other structures 9 | Selectable: 10 | Bounds: 2048, 2048 11 | Valued: 12 | Cost: 300 13 | Tooltip: 14 | Name: Wind Trap 15 | D2Building: 16 | Footprint: xx xx 17 | Dimensions: 2,2 18 | Health: 19 | HP: 200 20 | HitShape: 21 | Type: Rectangle 22 | TopLeft: -1024, -1024 23 | BottomRight: 1024, 1024 24 | Armor: 25 | Type: building 26 | RevealsShroud: 27 | Range: 2c0 28 | WithTilesetBody: 29 | SkipFrames: 3 30 | RenderSprites: 31 | Image: wind_trap 32 | PlayerPalette: wind 33 | WithIdleOverlay@FLAG: 34 | Sequence: idle-flag 35 | Power: 36 | Amount: 100 37 | ScalePowerWithHealth: 38 | ProvidesPrerequisite@buildingname: 39 | RevealOnDeath: 40 | Radius: 3c768 41 | -------------------------------------------------------------------------------- /mods/d2/rules/wor.yaml: -------------------------------------------------------------------------------- 1 | wor: 2 | Inherits: ^Building 3 | Buildable: 4 | Prerequisites: ~structure.ordos_or_harkonnen, wind_trap, har_conyard_or_barracks, outpost 5 | Queue: Building 6 | BuildPaletteOrder: 100 7 | BuildDuration: 1300 8 | BuildDurationModifier: 40 9 | Description: Trains heavy infantry\n Cannot be captured. 10 | Selectable: 11 | Bounds: 2048, 2048 12 | Valued: 13 | Cost: 400 14 | Tooltip: 15 | Name: WOR 16 | D2Building: 17 | Footprint: xx xx 18 | Dimensions: 2,2 19 | Health: 20 | HP: 400 21 | HitShape: 22 | Type: Rectangle 23 | TopLeft: -1024, -1024 24 | BottomRight: 1024, 1024 25 | Armor: 26 | Type: wood 27 | RevealsShroud: 28 | Range: 3c0 29 | RallyPoint: 30 | Path: 1,2 31 | Exit@1: 32 | SpawnOffset: 352,576,0 33 | ExitCell: 0,2 34 | Exit@2: 35 | SpawnOffset: 512,480,0 36 | ExitCell: 1,2 37 | Production: 38 | Produces: Trooper 39 | ProductionBar: 40 | ProductionType: Trooper 41 | ProductionQueue: 42 | Type: Trooper 43 | Group: Trooper 44 | LowPowerModifier: 300 45 | BlockedAudio: NoRoom 46 | BuildDurationModifier: 250 47 | ProvidesPrerequisite@atreides: 48 | Prerequisite: wor.atreides 49 | Factions: atreides 50 | ProvidesPrerequisite@ordos: 51 | Prerequisite: wor.ordos 52 | Factions: ordos 53 | ProvidesPrerequisite@harkonnen: 54 | Prerequisite: wor.harkonnen 55 | Factions: harkonnen 56 | Power: 57 | Amount: -20 58 | RenderSprites: 59 | Image: wor 60 | PlayerPalette: player 61 | WithTilesetBody: 62 | SkipFrames: 0, 2 63 | WithIdleOverlay@FLAG: 64 | Sequence: idle-flag 65 | WithIdleOverlay@TOP-FLAG: 66 | Sequence: idle-top-flag 67 | ProvidesPrerequisite@buildingname: 68 | GrantConditionOnPrerequisite: 69 | Prerequisites: upgrade.wor 70 | Condition: stardecoration 71 | WithDecoration@upgraded: 72 | Image: pips 73 | Sequence: tag-upgraded 74 | RequiresCondition: stardecoration 75 | Offsets: 76 | stardecoration: -6, -6 77 | -Capturable: 78 | -CaptureNotification: 79 | -CaptureManager: 80 | 81 | upgrade.wor: 82 | AlwaysVisible: 83 | Interactable: 84 | ScriptTriggers: 85 | Tooltip: 86 | Name: WOR Upgrade 87 | Buildable: 88 | BuildPaletteOrder: 999 89 | Queue: Trooper 90 | BuildLimit: 1 91 | BuildDuration: 250 92 | BuildDurationModifier: 40 93 | Description: Unlocks troopers squads 94 | Valued: 95 | Cost: 150 96 | RenderSprites: 97 | Image: wor 98 | ProvidesPrerequisite@upgradename: 99 | -------------------------------------------------------------------------------- /mods/d2/sequences/atomic.yaml: -------------------------------------------------------------------------------- 1 | atomic: 2 | up: UNITS.SHP 3 | Start: 40 4 | ZOffset: 1023 5 | down: UNITS.SHP 6 | Start: 40 7 | FlipY: true 8 | ZOffset: 1023 9 | -------------------------------------------------------------------------------- /mods/d2/sequences/barracks.yaml: -------------------------------------------------------------------------------- 1 | barracks: 2 | idle: ICON.ICN 3 | Start: 299 4 | Offset: 0,0 5 | idle-tileset: ICON.ICN 6 | Frames: 299, 300, 301, 302 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 302, 303 12 | Length: 2 13 | Offset: 8,8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 62 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/bombs.yaml: -------------------------------------------------------------------------------- 1 | bombs: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 30 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 31 9 | Length: 3 10 | FlipY: true 11 | UNITS.SHP 12 | Start: 30 13 | Length: 5 14 | FlipY: true 15 | FlipX: true 16 | UNITS.SHP 17 | Start: 31 18 | Length: 3 19 | FlipX: true 20 | UNITS.SHP: 21 | Start: 25 22 | Length: 5 23 | UNITS.SHP: 24 | Start: 26 25 | Length: 3 26 | FlipY: true 27 | UNITS.SHP 28 | Start: 25 29 | Length: 5 30 | FlipY: true 31 | FlipX: true 32 | UNITS.SHP 33 | Start: 26 34 | Length: 3 35 | FlipX: true 36 | Frames: 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 7, 23, 6, 22, 5, 21, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 15, 31, 14, 30, 13, 29 37 | Length: 2 38 | Facings: -16 39 | Tick: 100 40 | ZOffset: 1023 41 | 42 | -------------------------------------------------------------------------------- /mods/d2/sequences/carryall.yaml: -------------------------------------------------------------------------------- 1 | carryall: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 45 6 | Length: 3 7 | UNITS.SHP: 8 | Start: 45 9 | Length: 2 10 | FlipY: true 11 | UNITS.SHP: 12 | Start: 46 13 | FlipX: true 14 | FlipY: true 15 | UNITS.SHP: 16 | Start: 46 17 | Length: 2 18 | FlipX: true 19 | Frames: 0, 1, 2, 4, 3, 5, 7, 6 20 | Facings: -8 21 | icon: SHAPES.SHP 22 | Start: 77 23 | Offset: 0,0 24 | unload: 25 | Combine: 26 | UNITS.SHP: 27 | Start: 45 28 | Length: 3 29 | UNITS.SHP: 30 | Start: 45 31 | Length: 2 32 | FlipY: true 33 | UNITS.SHP: 34 | Start: 46 35 | FlipX: true 36 | FlipY: true 37 | UNITS.SHP: 38 | Start: 46 39 | Length: 2 40 | FlipX: true 41 | Frames: 0, 1, 2, 4, 3, 5, 7, 6 42 | Facings: -8 43 | -------------------------------------------------------------------------------- /mods/d2/sequences/colorpicker.yaml: -------------------------------------------------------------------------------- 1 | harvester.colorpicker: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 10 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 11 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | Offset: 8,-8 14 | -------------------------------------------------------------------------------- /mods/d2/sequences/combat_tank.yaml: -------------------------------------------------------------------------------- 1 | combat_tank: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 0 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 1 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 5 17 | Length: 5 18 | UNITS2.SHP: 19 | Start: 6 20 | Length: 3 21 | FlipX: true 22 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 23 | Facings: -8 24 | muzzle: DATA.R8 25 | Start: 3418 26 | Length: 3 27 | BlendMode: Additive 28 | icon: SHAPES.SHP 29 | Start: 78 30 | Offset: 0,0 31 | 32 | combat_tank.husk: 33 | idle: 34 | Combine: 35 | UNITS2.SHP: 36 | Start: 0 37 | Length: 5 38 | UNITS2.SHP: 39 | Start: 1 40 | Length: 3 41 | FlipX: true 42 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 43 | Facings: -8 44 | turret: 45 | Combine: 46 | UNITS2.SHP: 47 | Start: 5 48 | Length: 5 49 | UNITS2.SHP: 50 | Start: 6 51 | Length: 3 52 | FlipX: true 53 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 54 | Facings: -8 55 | -------------------------------------------------------------------------------- /mods/d2/sequences/concrete.yaml: -------------------------------------------------------------------------------- 1 | concretea: 2 | idle: ICON.ICN 3 | Start: 126 4 | Offset: 0,0 5 | icon: SHAPES.SHP 6 | Start: 53 7 | Offset: 0,0 8 | 9 | concreteb: 10 | idle: ICON.ICN 11 | Start: 126 12 | Offset: -8,-8 13 | idle-tileset: ICON.ICN 14 | Frames: 126, 126, 126, 126 15 | Length 4: 16 | Offset: 0,0 17 | icon: SHAPES.SHP 18 | Start: 71 19 | Offset: 0,0 20 | -------------------------------------------------------------------------------- /mods/d2/sequences/conyard.yaml: -------------------------------------------------------------------------------- 1 | conyard: 2 | idle: ICON.ICN 3 | Start: 292 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 292, 293, 297, 298 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 292, 294 12 | Length: 2 13 | Offset: -8,-8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 60 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/craters.yaml: -------------------------------------------------------------------------------- 1 | rockcraters: 2 | rockcrater1: ICON.ICN 3 | Frames: 1,3,5 4 | Length: 3 5 | Offset: 0,0 6 | rockcrater2: ICON.ICN 7 | Frames: 2,4,6 8 | Length: 3 9 | Offset: 0,0 10 | 11 | sandcraters: 12 | sandcrater1: ICON.ICN 13 | Frames: 7,9,11 14 | Length: 3 15 | Offset: 0,0 16 | sandcrater2: ICON.ICN 17 | Frames: 8,10,12 18 | Length: 3 19 | Offset: 0,0 20 | -------------------------------------------------------------------------------- /mods/d2/sequences/devastator.yaml: -------------------------------------------------------------------------------- 1 | devastator: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 20 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 21 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 25 17 | Length: 1 18 | Offset: 0,-3 19 | UNITS2.SHP: 20 | Start: 26 21 | Length: 1 22 | Offset: -2,-3 23 | UNITS2.SHP: 24 | Start: 27 25 | Length: 1 26 | Offset: 1,-4 27 | UNITS2.SHP: 28 | Start: 28 29 | Length: 1 30 | Offset: 0,-3 31 | UNITS2.SHP: 32 | Start: 29 33 | Length: 1 34 | Offset: -1,-3 35 | UNITS2.SHP: 36 | Start: 28 37 | Length: 1 38 | FlipX: true 39 | Offset: 1,-4 40 | UNITS2.SHP: 41 | Start: 27 42 | Length: 1 43 | FlipX: true 44 | Offset: -1,-4 45 | UNITS2.SHP: 46 | Start: 26 47 | Length: 1 48 | FlipX: true 49 | Offset: 2,-3 50 | Facings: -8 51 | muzzle: DATA.R8 52 | Start: 3418 53 | Length: 3 54 | BlendMode: Additive 55 | icon: SHAPES.SHP 56 | Start: 75 57 | Offset: 0,0 58 | 59 | devastator.husk: 60 | idle: 61 | Combine: 62 | UNITS2.SHP: 63 | Start: 20 64 | Length: 5 65 | UNITS2.SHP: 66 | Start: 21 67 | Length: 3 68 | FlipX: true 69 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 70 | Facings: -8 71 | turret: 72 | Combine: 73 | UNITS2.SHP: 74 | Start: 25 75 | Length: 1 76 | Offset: 0,-3 77 | UNITS2.SHP: 78 | Start: 26 79 | Length: 1 80 | Offset: -2,-3 81 | UNITS2.SHP: 82 | Start: 27 83 | Length: 1 84 | Offset: 1,-4 85 | UNITS2.SHP: 86 | Start: 28 87 | Length: 1 88 | Offset: 0,-3 89 | UNITS2.SHP: 90 | Start: 29 91 | Length: 1 92 | Offset: -1,-3 93 | UNITS2.SHP: 94 | Start: 28 95 | Length: 1 96 | FlipX: true 97 | Offset: 1,-4 98 | UNITS2.SHP: 99 | Start: 27 100 | Length: 1 101 | FlipX: true 102 | Offset: -1,-4 103 | UNITS2.SHP: 104 | Start: 26 105 | Length: 1 106 | FlipX: true 107 | Offset: 2,-3 108 | Facings: -8 109 | -------------------------------------------------------------------------------- /mods/d2/sequences/deviator.yaml: -------------------------------------------------------------------------------- 1 | deviator: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 0 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 1 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 35 17 | Length: 5 18 | UNITS2.SHP: 19 | Start: 36 20 | Length: 3 21 | FlipX: true 22 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 23 | Facings: -8 24 | Offset: 0,-4 25 | muzzle: DATA.R8 26 | Start: 3418 27 | Length: 3 28 | BlendMode: Additive 29 | icon: SHAPES.SHP 30 | Start: 86 31 | Offset: 0,0 32 | 33 | deviator.husk: 34 | idle: 35 | Combine: 36 | UNITS2.SHP: 37 | Start: 0 38 | Length: 5 39 | UNITS2.SHP: 40 | Start: 1 41 | Length: 3 42 | FlipX: true 43 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 44 | Facings: -8 45 | turret: 46 | Combine: 47 | UNITS2.SHP: 48 | Start: 35 49 | Length: 5 50 | UNITS2.SHP: 51 | Start: 36 52 | Length: 3 53 | FlipX: true 54 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 55 | Facings: -8 56 | Offset: 0,-4 57 | -------------------------------------------------------------------------------- /mods/d2/sequences/explosion.yaml: -------------------------------------------------------------------------------- 1 | explosion: 2 | Defaults: 3 | Tick: 80 4 | ZOffset: 511 5 | piff: UNITS1.SHP 6 | Start: 23 7 | Length: 2 8 | piffs: UNITS1.SHP 9 | Start: 23 10 | Length: 3 11 | small_explosion: UNITS1.SHP 12 | Start: 32 13 | Length: 5 14 | med_explosion: UNITS1.SHP 15 | Start: 37 16 | Length: 5 17 | nuke: UNITS1.SHP 18 | Start: 8 19 | Length: 3 20 | self_destruct: UNITS1.SHP 21 | Start: 0 22 | Length: 2 23 | building: UNITS1.SHP 24 | Start: 42 25 | Length: 5 26 | large_explosion: UNITS1.SHP 27 | Start: 47 28 | Length: 5 29 | small_napalm: UNITS1.SHP 30 | Start: 52 31 | Length: 5 32 | rocket_explosion: UNITS1.SHP 33 | Start: 0 34 | Length: 1 35 | tiny_explosion: UNITS1.SHP 36 | Start: 0 37 | Length: 1 38 | shockwave: UNITS1.SHP 39 | Start: 8 40 | Length: 3 41 | deviator: UNITS1.SHP 42 | Start: 57 43 | Length: 5 44 | Tick: 120 45 | bloomspawn: UNITS1.SHP 46 | Start: 2 47 | Length: 6 48 | Tick: 120 49 | corpse: DATA.R8 50 | ZOffset: -511 51 | Start: 430 52 | Length: 12 53 | Tick: 1600 54 | -------------------------------------------------------------------------------- /mods/d2/sequences/fire.yaml: -------------------------------------------------------------------------------- 1 | fire: 2 | 1: UNITS1.SHP 3 | Start: 17 4 | Length: 6 5 | Tick: 300 6 | ZOffset: 1023 7 | -------------------------------------------------------------------------------- /mods/d2/sequences/fremen.yaml: -------------------------------------------------------------------------------- 1 | fremen: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 73 6 | UNITS.SHP: 7 | Start: 76 8 | UNITS.SHP: 9 | Start: 79 10 | UNITS.SHP: 11 | Start: 76 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 73 18 | Length: 3 19 | UNITS.SHP: 20 | Start: 76 21 | Length: 3 22 | UNITS.SHP: 23 | Start: 79 24 | Length: 3 25 | UNITS.SHP: 26 | Start: 76 27 | Length: 3 28 | FlipX: true 29 | Length: 3 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 19, 20 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 19, 20 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 19, 20 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 19, 20 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 23 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -1024 53 | icon: SHAPES.SHP 54 | Start: 82 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/frigate.yaml: -------------------------------------------------------------------------------- 1 | frigate: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 60 6 | Length: 3 7 | UNITS.SHP: 8 | Start: 60 9 | Length: 2 10 | FlipY: true 11 | UNITS.SHP: 12 | Start: 61 13 | FlipX: true 14 | FlipY: true 15 | UNITS.SHP: 16 | Start: 61 17 | Length: 2 18 | FlipX: true 19 | Frames: 0, 1, 2, 4, 3, 5, 7, 6 20 | Facings: -8 21 | icon: SHAPES.SHP 22 | Start: 77 23 | Offset: 0,0 24 | unload: 25 | Combine: 26 | UNITS.SHP: 27 | Start: 60 28 | Length: 3 29 | UNITS.SHP: 30 | Start: 60 31 | Length: 2 32 | FlipY: true 33 | UNITS.SHP: 34 | Start: 61 35 | FlipX: true 36 | FlipY: true 37 | UNITS.SHP: 38 | Start: 61 39 | Length: 2 40 | FlipX: true 41 | Frames: 0, 1, 2, 4, 3, 5, 7, 6 42 | Facings: -8 43 | -------------------------------------------------------------------------------- /mods/d2/sequences/gun_turret.yaml: -------------------------------------------------------------------------------- 1 | gun_turret: 2 | idle: ICON.ICN 3 | Start: 356 4 | Length: 1 5 | Offset: 0,0 6 | damaged-idle: ICON.ICN 7 | Start: 356 8 | Length: 1 9 | Offset: 0,0 10 | turret: ICON.ICN 11 | Start: 356 12 | Facings: -8 13 | Offset: 0,0 14 | muzzle: DATA.R8 15 | Start: 3775 16 | Tick: 60 17 | Facings: -32 18 | Offset: 0,2 19 | BlendMode: Additive 20 | icon: SHAPES.SHP 21 | Start: 67 22 | Offset: 0,0 23 | -------------------------------------------------------------------------------- /mods/d2/sequences/guns_fire.yaml: -------------------------------------------------------------------------------- 1 | 120mm: 2 | idle: UNITS1.SHP 3 | Start: 23 4 | BlendMode: Additive 5 | ZOffset: 1023 6 | 7 | 155mm: 8 | idle: UNITS1.SHP 9 | Start: 24 10 | BlendMode: Additive 11 | ZOffset: 1023 12 | 13 | doubleblastbullet: 14 | idle: UNITS1.SHP 15 | Start: 25 16 | BlendMode: Additive 17 | ZOffset: 1023 18 | 19 | rpg: 20 | idle: 21 | Combine: 22 | UNITS.SHP: 23 | Start: 30 24 | Length: 5 25 | UNITS.SHP: 26 | Start: 31 27 | Length: 3 28 | FlipY: true 29 | UNITS.SHP: 30 | Start: 30 31 | Length: 5 32 | FlipY: true 33 | FlipX: true 34 | UNITS.SHP: 35 | Start: 31 36 | Length: 3 37 | FlipX: true 38 | UNITS.SHP: 39 | Start: 35 40 | Length: 5 41 | UNITS.SHP: 42 | Start: 36 43 | Length: 3 44 | FlipY: true 45 | UNITS.SHP: 46 | Start: 35 47 | Length: 5 48 | FlipY: true 49 | FlipX: true 50 | UNITS.SHP: 51 | Start: 36 52 | Length: 3 53 | FlipX: true 54 | Frames: 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 7, 23, 6, 22, 5, 21, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 15, 31, 14, 30, 13, 29 55 | Length: 2 56 | Facings: -16 57 | Tick: 100 58 | ZOffset: 1023 59 | 60 | missile: 61 | idle: 62 | Combine: 63 | UNITS.SHP: 64 | Start: 20 65 | Length: 5 66 | UNITS.SHP: 67 | Start: 21 68 | Length: 3 69 | FlipY: true 70 | UNITS.SHP: 71 | Start: 20 72 | Length: 5 73 | FlipY: true 74 | FlipX: true 75 | UNITS.SHP: 76 | Start: 21 77 | Length: 3 78 | FlipX: true 79 | UNITS.SHP: 80 | Start: 25 81 | Length: 5 82 | UNITS.SHP: 83 | Start: 26 84 | Length: 3 85 | FlipY: true 86 | UNITS.SHP: 87 | Start: 25 88 | Length: 5 89 | FlipY: true 90 | FlipX: true 91 | UNITS.SHP: 92 | Start: 26 93 | Length: 3 94 | FlipX: true 95 | Frames: 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 7, 23, 6, 22, 5, 21, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 15, 31, 14, 30, 13, 29 96 | Length: 2 97 | Facings: -16 98 | Tick: 120 99 | ZOffset: 1023 100 | -------------------------------------------------------------------------------- /mods/d2/sequences/harvester.yaml: -------------------------------------------------------------------------------- 1 | harvester: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 10 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 11 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | harvest: 14 | Combine: 15 | UNITS1.SHP: 16 | Start: 72 17 | Length: 3 18 | Offset: 0,7 19 | UNITS1.SHP: 20 | Start: 75 21 | Length: 3 22 | Offset: -8,6 23 | UNITS1.SHP: 24 | Start: 78 25 | Length: 3 26 | Offset: -15,1 27 | UNITS1.SHP: 28 | Start: 81 29 | Length: 3 30 | Offset: -9,-6 31 | UNITS1.SHP: 32 | Start: 84 33 | Length: 3 34 | Offset: 0,-9 35 | UNITS1.SHP: 36 | Start: 81 37 | Length: 3 38 | FlipX: true 39 | Offset: 9,-6 40 | UNITS1.SHP: 41 | Start: 78 42 | Length: 3 43 | FlipX: true 44 | Offset: 15,1 45 | UNITS1.SHP: 46 | Start: 75 47 | Length: 3 48 | FlipX: true 49 | Offset: 8,7 50 | Length: 3 51 | Facings: -8 52 | Tick: 160 53 | ZOffset: 1 54 | BlendMode: Alpha 55 | dock: UNITS.SHP 56 | Start: 14 57 | Offset: 0,-8 58 | dock-loop: UNITS.SHP 59 | Start: 14 60 | Offset: 0,-8 61 | icon: SHAPES.SHP 62 | Start: 88 63 | Offset: 0,0 64 | 65 | harvester.husk: 66 | idle: UNITS1.SHP 67 | Start: 14 68 | Length: 3 69 | Tick: 4000 70 | ZOffset: -1023 71 | -------------------------------------------------------------------------------- /mods/d2/sequences/heavy_factory.yaml: -------------------------------------------------------------------------------- 1 | heavy: 2 | idle: ICON.ICN 3 | Start: 254 4 | Offset: -16,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 254, 255, 256, 261, 262, 263 7 | Length: 6 8 | Offset: -8,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 254, 257 12 | Length: 2 13 | Offset: -16,-8 14 | ZOffset: -2047 15 | Tick: 1000 16 | production-welding-1: ICON.ICN 17 | Frames: 262, 264, 266 18 | Length: 3 19 | Offset: 0,8 20 | ZOffset: 0 21 | Tick: 2000 22 | production-welding-2: ICON.ICN 23 | Frames: 263, 265, 267 24 | Length: 3 25 | Offset: 16,8 26 | ZOffset: 0 27 | Tick: 2000 28 | icon: SHAPES.SHP 29 | Start: 56 30 | Offset: 0,0 31 | -------------------------------------------------------------------------------- /mods/d2/sequences/high_tech_factory.yaml: -------------------------------------------------------------------------------- 1 | hightech: 2 | idle: ICON.ICN 3 | Start: 254 4 | Offset: -16,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 270, 271, 272, 276, 277, 278 7 | Length: 6 8 | Offset: -8,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 276, 279 12 | Length: 2 13 | Offset: -16,8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 57 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/icon.yaml: -------------------------------------------------------------------------------- 1 | icon: 2 | ornistrike: SHAPES.SHP 3 | Start: 85 4 | Offset: 0,0 5 | fremen: SHAPES.SHP 6 | Start: 82 7 | Offset: 0,0 8 | saboteur: SHAPES.SHP 9 | Start: 84 10 | Offset: 0,0 11 | deathhand: SHAPES.SHP 12 | Start: 18 13 | Offset: 0,0 14 | -------------------------------------------------------------------------------- /mods/d2/sequences/light_factory.yaml: -------------------------------------------------------------------------------- 1 | light: 2 | idle: ICON.ICN 3 | Start: 241 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 241, 242, 248, 249 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Start: 242 12 | Length: 2 13 | Offset: 8,-8 14 | ZOffset: -2047 15 | Tick: 1000 16 | production-welding: ICON.ICN 17 | Start: 249 18 | Length: 2 19 | Offset: 8,8 20 | ZOffset: 0 21 | Tick: 500 22 | icon: SHAPES.SHP 23 | Start: 55 24 | Offset: 0,0 25 | -------------------------------------------------------------------------------- /mods/d2/sequences/light_inf.yaml: -------------------------------------------------------------------------------- 1 | light_inf: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 73 6 | UNITS.SHP: 7 | Start: 76 8 | UNITS.SHP: 9 | Start: 79 10 | UNITS.SHP: 11 | Start: 76 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 73 18 | Length: 3 19 | UNITS.SHP: 20 | Start: 76 21 | Length: 3 22 | UNITS.SHP: 23 | Start: 79 24 | Length: 3 25 | UNITS.SHP: 26 | Start: 76 27 | Length: 3 28 | FlipX: true 29 | Length: 3 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 19, 20 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 19, 20 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 19, 20 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 19, 20 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 23 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -1024 53 | icon: SHAPES.SHP 54 | Start: 90 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/light_squad.yaml: -------------------------------------------------------------------------------- 1 | light_squad: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 91 6 | UNITS.SHP: 7 | Start: 95 8 | UNITS.SHP: 9 | Start: 99 10 | UNITS.SHP: 11 | Start: 95 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 91 18 | Length: 4 19 | UNITS.SHP: 20 | Start: 95 21 | Length: 4 22 | UNITS.SHP: 23 | Start: 99 24 | Length: 4 25 | UNITS.SHP: 26 | Start: 95 27 | Length: 4 28 | FlipX: true 29 | Length: 4 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 21, 22 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 21, 22 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 21, 22 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 21, 22 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 24 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -511 53 | icon: SHAPES.SHP 54 | Start: 81 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/mcv.yaml: -------------------------------------------------------------------------------- 1 | mcv: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 15 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 16 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | icon: SHAPES.SHP 14 | Start: 89 15 | Offset: 0,-0 16 | 17 | mcv.husk: 18 | idle: 19 | Combine: 20 | UNITS.SHP: 21 | Start: 15 22 | Length: 5 23 | UNITS.SHP: 24 | Start: 16 25 | Length: 3 26 | FlipX: true 27 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 28 | Facings: -8 29 | ZOffset: -1023 30 | -------------------------------------------------------------------------------- /mods/d2/sequences/misc.yaml: -------------------------------------------------------------------------------- 1 | pips: 2 | groups: DATA.R8 3 | Start: 17 4 | Length: 10 5 | pickup-indicator: DATA.R8 6 | Start: 112 7 | tag-primary: transparent.shp 8 | Offset: 0, 2 9 | pip-empty: DATA.R8 10 | Start: 15 11 | pip-green: DATA.R8 12 | Start: 16 13 | tag-upgraded: DATA.R8 14 | Start: 110 15 | Offset: -8,-8 16 | 17 | clock: 18 | idle: clock.shp 19 | Length: * 20 | 21 | powerdown: 22 | disabled: speed.shp 23 | Start: 3 24 | ZOffset: 2047 25 | 26 | poweroff: 27 | offline: poweroff.shp 28 | Length: * 29 | Tick: 160 30 | ZOffset: 2047 31 | 32 | editor-overlay: 33 | Defaults: DATA.R8 34 | Offset: -16,-16 35 | copy: 36 | paste: 37 | Start: 1 38 | 39 | rallypoint: 40 | flag: flagfly.shp 41 | Length: * 42 | Offset: 11,-5 43 | ZOffset: 2535 44 | circles: fpls.shp 45 | Length: * 46 | ZOffset: 2047 47 | 48 | beacon: 49 | arrow: MOUSE.R8 50 | Start: 148 51 | Offset: -24,-24 52 | ZOffset: 2535 53 | circles: fpls.shp 54 | Length: * 55 | ZOffset: 2047 56 | 57 | allyrepair: 58 | repair: DATA.R8 59 | Frames: 3, 39 60 | Length: 2 61 | Tick: 300 62 | Offset: -11,-10 63 | ZOffset: 2047 64 | 65 | mpspawn: 66 | idle: mpspawn.shp 67 | Length: * 68 | 69 | waypoint: 70 | idle: waypoint.shp 71 | Length: * 72 | 73 | camera: 74 | idle: camera.shp 75 | Length: * 76 | 77 | wormspawner: 78 | idle: wormspawner.shp 79 | Length: * 80 | 81 | sietch: 82 | idle: DATA.R8 83 | Start: 2998 84 | Offset: -32,32 85 | 86 | doubleblast: 87 | idle: DATA.R8 88 | Start: 3279 89 | Facings: -16 90 | BlendMode: Additive 91 | ZOffset: 511 92 | 93 | moveflsh: 94 | idle: DATA.R8 95 | Start: 3304 96 | # idle: DATA.R8 97 | # Start: 3621 98 | # Length: 5 99 | # Tick: 80 100 | # BlendMode: Multiply 101 | # ZOffset: 2047 102 | 103 | null: 104 | idle: DATA.R8 105 | Start: 3304 106 | 107 | buildable: 108 | invalid: concfoot.shp 109 | Scale: 0.5 110 | -------------------------------------------------------------------------------- /mods/d2/sequences/missile_tank.yaml: -------------------------------------------------------------------------------- 1 | missile_tank: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 0 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 1 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 35 17 | Length: 5 18 | UNITS2.SHP: 19 | Start: 36 20 | Length: 3 21 | FlipX: true 22 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 23 | Facings: -8 24 | Offset: 0,-4 25 | muzzle: DATA.R8 26 | Start: 3418 27 | Length: 3 28 | BlendMode: Additive 29 | icon: SHAPES.SHP 30 | Start: 73 31 | Offset: 0,0 32 | 33 | missile_tank.husk: 34 | idle: 35 | Combine: 36 | UNITS2.SHP: 37 | Start: 0 38 | Length: 5 39 | UNITS2.SHP: 40 | Start: 1 41 | Length: 3 42 | FlipX: true 43 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 44 | Facings: -8 45 | turret: 46 | Combine: 47 | UNITS2.SHP: 48 | Start: 35 49 | Length: 5 50 | UNITS2.SHP: 51 | Start: 36 52 | Length: 3 53 | FlipX: true 54 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 55 | Facings: -8 56 | Offset: 0,-4 57 | -------------------------------------------------------------------------------- /mods/d2/sequences/ornithopter.yaml: -------------------------------------------------------------------------------- 1 | ornithopter: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 51 6 | Length: 3 7 | UNITS.SHP: 8 | Start: 54 9 | Length: 3 10 | UNITS.SHP: 11 | Start: 57 12 | Length: 3 13 | UNITS.SHP: 14 | Start: 54 15 | Length: 3 16 | FlipY: true 17 | UNITS.SHP: 18 | Start: 51 19 | Length: 3 20 | FlipY: true 21 | UNITS.SHP: 22 | Start: 54 23 | Length: 3 24 | FlipX: true 25 | FlipY: true 26 | UNITS.SHP: 27 | Start: 57 28 | Length: 3 29 | FlipX: true 30 | UNITS.SHP: 31 | Start: 54 32 | Length: 3 33 | FlipX: true 34 | Length: 3 35 | Facings: -8 36 | Tick: 200 37 | ZOffset: 2047 38 | icon: SHAPES.SHP 39 | Start: 85 40 | Offset: 0,0 41 | -------------------------------------------------------------------------------- /mods/d2/sequences/outpost.yaml: -------------------------------------------------------------------------------- 1 | outpost: 2 | idle: ICON.ICN 3 | Start: 379 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 379, 380, 388, 387 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 388, 386 12 | Length: 2 13 | Offset: -8,8 14 | ZOffset: -2047 15 | Tick: 1000 16 | idle-dish: ICON.ICN 17 | Frames: 383, 382, 381, 380 18 | Length: 4 19 | Offset: 8,-8 20 | ZOffset: -2047 21 | Tick: 400 22 | icon: SHAPES.SHP 23 | Start: 70 24 | Offset: 0,0 25 | -------------------------------------------------------------------------------- /mods/d2/sequences/overlay.yaml: -------------------------------------------------------------------------------- 1 | overlay: 2 | Defaults: transparent.shp 3 | build-valid-arrakis2: 4 | build-invalid: 5 | target-select: 6 | target-valid-arrakis2: 7 | target-invalid: 8 | -------------------------------------------------------------------------------- /mods/d2/sequences/palace.yaml: -------------------------------------------------------------------------------- 1 | palace: 2 | idle: ICON.ICN 3 | Start: 216 4 | ZOffset: -1c511 5 | Offset: -16,-16 6 | idle-tileset: ICON.ICN 7 | Frames: 216, 217, 218, 226, 227, 228, 235, 236, 237 8 | Length: 9 9 | Offset: -8,-8 10 | ZOffset: -2047 11 | idle-flag: ICON.ICN 12 | Frames: 216, 219 13 | Length: 2 14 | Offset: -16,-16 15 | ZOffset: -2047 16 | Tick: 1000 17 | icon: SHAPES.SHP 18 | Start: 54 19 | Offset: 0,0 20 | -------------------------------------------------------------------------------- /mods/d2/sequences/quad.yaml: -------------------------------------------------------------------------------- 1 | quad: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 0 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 1 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | icon: SHAPES.SHP 14 | Start: 74 15 | Offset: 0,0 16 | -------------------------------------------------------------------------------- /mods/d2/sequences/raider.yaml: -------------------------------------------------------------------------------- 1 | raider: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 5 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 6 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | muzzle: DATA.R8 14 | Start: 3839 15 | Tick: 50 16 | Facings: -32 17 | BlendMode: Additive 18 | icon: SHAPES.SHP 19 | Start: 87 20 | Offset: 0,0 21 | -------------------------------------------------------------------------------- /mods/d2/sequences/refinery.yaml: -------------------------------------------------------------------------------- 1 | refinery: 2 | idle: ICON.ICN 3 | Start: 332 4 | Offset: -16,-8 5 | ZOffset: -2047 6 | idle-tileset: ICON.ICN 7 | Frames: 332, 333, 334, 337, 338, 339 8 | Length: 6 9 | Offset: -8,0 10 | ZOffset: -2047 11 | idle-flag: ICON.ICN 12 | Frames: 333, 335 13 | Length: 2 14 | Offset: 0,-8 15 | ZOffset: -2047 16 | Tick: 1000 17 | idle-dock-top: ICON.ICN 18 | Frames: 334, 336, 341 19 | Length: 3 20 | Offset: 16,-8 21 | ZOffset: -2047 22 | Tick: 500 23 | idle-dock-bottom: ICON.ICN 24 | Frames: 339, 340, 343 25 | Length: 3 26 | Offset: 16,8 27 | ZOffset: -2047 28 | Tick: 500 29 | icon: SHAPES.SHP 30 | Start: 64 31 | Offset: 0,0 32 | -------------------------------------------------------------------------------- /mods/d2/sequences/repair_pad.yaml: -------------------------------------------------------------------------------- 1 | repair_pad: 2 | idle: ICON.ICN 3 | Start: 345 4 | Offset: -16,-8 5 | ZOffset: -2047 6 | idle-tileset: ICON.ICN 7 | Frames: 345, 346, 347, 349, 350, 351 8 | Length: 6 9 | Offset: -8,0 10 | ZOffset: -2047 11 | idle-flag: ICON.ICN 12 | Frames: 346, 348 13 | Length: 2 14 | Offset: 0,-8 15 | ZOffset: -2047 16 | Tick: 1000 17 | active-1: ICON.ICN 18 | Frames: 350, 352 19 | Length: 2 20 | Offset: 0,8 21 | ZOffset: 0 22 | Tick: 50 23 | active-2: ICON.ICN 24 | Frames: 351, 353 25 | Length: 2 26 | Offset: 16,8 27 | ZOffset: 0 28 | Tick: 50 29 | icon: SHAPES.SHP 30 | Start: 65 31 | Offset: 0,0 32 | -------------------------------------------------------------------------------- /mods/d2/sequences/research.yaml: -------------------------------------------------------------------------------- 1 | research: 2 | idle: ICON.ICN 3 | Start: 280 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 280, 281, 282, 283 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Start: 283 12 | Length: 2 13 | Offset: 8,8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 58 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/rocket_turret.yaml: -------------------------------------------------------------------------------- 1 | rocket_turret: 2 | idle: ICON.ICN 3 | Start: 364 4 | Length: 1 5 | Offset: 0,0 6 | damaged-idle: ICON.ICN 7 | Start: 364 8 | Length: 1 9 | Offset: 0,0 10 | turret: ICON.ICN 11 | Start: 364 12 | Facings: -8 13 | Offset: 0,0 14 | muzzle: DATA.R8 15 | Start: 3775 16 | Tick: 60 17 | Facings: -32 18 | Offset: 0,2 19 | BlendMode: Additive 20 | icon: SHAPES.SHP 21 | Start: 68 22 | Offset: 0,0 23 | -------------------------------------------------------------------------------- /mods/d2/sequences/saboteur.yaml: -------------------------------------------------------------------------------- 1 | saboteur: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 63 6 | UNITS.SHP: 7 | Start: 66 8 | UNITS.SHP: 9 | Start: 69 10 | UNITS.SHP: 11 | Start: 66 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 63 18 | Length: 3 19 | UNITS.SHP: 20 | Start: 66 21 | Length: 3 22 | UNITS.SHP: 23 | Start: 69 24 | Length: 3 25 | UNITS.SHP: 26 | Start: 66 27 | Length: 3 28 | FlipX: true 29 | Length: 3 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 19, 20 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 19, 20 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 19, 20 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 19, 20 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 23 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -1024 53 | icon: SHAPES.SHP 54 | Start: 84 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/sandworm.yaml: -------------------------------------------------------------------------------- 1 | sandworm: 2 | mouth: UNITS1.SHP 3 | Start: 67 4 | Length: 5 5 | Tick: 200 6 | idle: UNITS1.SHP 7 | Start: 66 8 | icon: SHAPES.SHP 9 | Start: 93 10 | 11 | sandtrail: 12 | Defaults: 13 | Length: 8 14 | Tick: 200 15 | ZOffset: -512 16 | traila: sandtrail.shp 17 | trailb: sandtrail.shp 18 | Frames: 2, 6, 4, 5, 0, 1, 3, 7 19 | trailc: sandtrail.shp 20 | Frames: 7, 4, 6, 5, 2, 0, 3, 1 21 | -------------------------------------------------------------------------------- /mods/d2/sequences/sardaukar.yaml: -------------------------------------------------------------------------------- 1 | sardaukar: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 82 6 | UNITS.SHP: 7 | Start: 85 8 | UNITS.SHP: 9 | Start: 88 10 | UNITS.SHP: 11 | Start: 85 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 82 18 | Length: 3 19 | UNITS.SHP: 20 | Start: 85 21 | Length: 3 22 | UNITS.SHP: 23 | Start: 88 24 | Length: 3 25 | UNITS.SHP: 26 | Start: 85 27 | Length: 3 28 | FlipX: true 29 | Length: 3 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 19, 20 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 19, 20 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 19, 20 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 19, 20 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 23 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -1024 53 | icon: SHAPES.SHP 54 | Start: 83 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/shroud.yaml: -------------------------------------------------------------------------------- 1 | shroud: 2 | fog: ICON.ICN 3 | Start: 108 4 | Length: 16 5 | -------------------------------------------------------------------------------- /mods/d2/sequences/sides.yaml: -------------------------------------------------------------------------------- 1 | sides: 2 | rock: ICON.ICN 3 | Frames: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 4 | Length: 16 5 | Offset: 0,0 6 | dune: ICON.ICN 7 | Frames: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159 8 | Length: 16 9 | Offset: 0,0 10 | rough: ICON.ICN 11 | Frames: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175 12 | Length: 16 13 | Offset: 0,0 14 | -------------------------------------------------------------------------------- /mods/d2/sequences/siege_tank.yaml: -------------------------------------------------------------------------------- 1 | siege_tank: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 10 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 11 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 15 17 | Length: 1 18 | Offset: 0,-5 19 | UNITS2.SHP: 20 | Start: 16 21 | Length: 1 22 | Offset: 1,-5 23 | UNITS2.SHP: 24 | Start: 17 25 | Length: 1 26 | Offset: 2,-4 27 | UNITS2.SHP: 28 | Start: 18 29 | Length: 1 30 | Offset: 1,-3 31 | UNITS2.SHP: 32 | Start: 19 33 | Length: 1 34 | Offset: -1,-4 35 | UNITS2.SHP: 36 | Start: 16 37 | Length: 1 38 | FlipX: true 39 | Offset: -1,-5 40 | UNITS2.SHP: 41 | Start: 17 42 | Length: 1 43 | FlipX: true 44 | Offset: -2,-4 45 | UNITS2.SHP: 46 | Start: 18 47 | Length: 1 48 | FlipX: true 49 | Offset: -1,-3 50 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 51 | Facings: -8 52 | muzzle: DATA.R8 53 | Start: 3418 54 | Length: 3 55 | BlendMode: Additive 56 | icon: SHAPES.SHP 57 | Start: 72 58 | Offset: 0,0 59 | 60 | siege_tank.husk: 61 | idle: 62 | Combine: 63 | UNITS2.SHP: 64 | Start: 10 65 | Length: 5 66 | UNITS2.SHP: 67 | Start: 11 68 | Length: 3 69 | FlipX: true 70 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 71 | Facings: -8 72 | turret: 73 | Combine: 74 | UNITS2.SHP: 75 | Start: 15 76 | Length: 1 77 | Offset: 0,-5 78 | UNITS2.SHP: 79 | Start: 16 80 | Length: 1 81 | Offset: 1,-5 82 | UNITS2.SHP: 83 | Start: 17 84 | Length: 1 85 | Offset: 2,-4 86 | UNITS2.SHP: 87 | Start: 18 88 | Length: 1 89 | Offset: 1,-3 90 | UNITS2.SHP: 91 | Start: 19 92 | Length: 1 93 | Offset: -1,-4 94 | UNITS2.SHP: 95 | Start: 16 96 | Length: 1 97 | FlipX: true 98 | Offset: -1,-5 99 | UNITS2.SHP: 100 | Start: 17 101 | Length: 1 102 | FlipX: true 103 | Offset: -2,-4 104 | UNITS2.SHP: 105 | Start: 18 106 | Length: 1 107 | FlipX: true 108 | Offset: -1,-3 109 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 110 | Facings: -8 111 | -------------------------------------------------------------------------------- /mods/d2/sequences/silo.yaml: -------------------------------------------------------------------------------- 1 | silo: 2 | idle: ICON.ICN 3 | Start: 372 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 372, 373, 375, 376 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Start: 373 12 | Length: 2 13 | Offset: 8,-8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 69 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/smoke.yaml: -------------------------------------------------------------------------------- 1 | smoke_m: 2 | Defaults: 3 | ZOffset: 511 4 | idle: UNITS1.SHP 5 | Start: 29 6 | Length: 3 7 | Tick: 500 8 | Offset: 0,-12 9 | loop: UNITS1.SHP 10 | Start: 29 11 | Length: 3 12 | Tick: 500 13 | Offset: 0,-12 14 | end: UNITS1.SHP 15 | Start: 29 16 | Length: 3 17 | Tick: 500 18 | Offset: 0,-12 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/sonic_tank.yaml: -------------------------------------------------------------------------------- 1 | sonic_tank: 2 | idle: 3 | Combine: 4 | UNITS2.SHP: 5 | Start: 0 6 | Length: 5 7 | UNITS2.SHP: 8 | Start: 1 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | turret: 14 | Combine: 15 | UNITS2.SHP: 16 | Start: 30 17 | Length: 5 18 | UNITS2.SHP: 19 | Start: 31 20 | Length: 3 21 | FlipX: true 22 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 23 | Facings: -8 24 | Offset: 0,-4 25 | icon: SHAPES.SHP 26 | Start: 79 27 | Offset: 0,0 28 | 29 | sonic_tank.husk: 30 | idle: 31 | Combine: 32 | UNITS2.SHP: 33 | Start: 0 34 | Length: 5 35 | UNITS2.SHP: 36 | Start: 1 37 | Length: 3 38 | FlipX: true 39 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 40 | Facings: -8 41 | turret: 42 | Combine: 43 | UNITS2.SHP: 44 | Start: 30 45 | Length: 5 46 | UNITS2.SHP: 47 | Start: 31 48 | Length: 3 49 | FlipX: true 50 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 51 | Facings: -8 52 | Offset: 0,-4 53 | -------------------------------------------------------------------------------- /mods/d2/sequences/spice.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | spice: ICON.ICN 3 | Frames: 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207 4 | Length: 62 5 | Offset: 0,0 6 | -------------------------------------------------------------------------------- /mods/d2/sequences/spicebloom.yaml: -------------------------------------------------------------------------------- 1 | spicebloom: 2 | idle: ICON.ICN 3 | Start: 208 4 | Length: 1 5 | ZOffset: -1023 6 | -------------------------------------------------------------------------------- /mods/d2/sequences/starport.yaml: -------------------------------------------------------------------------------- 1 | starport: 2 | idle: ICON.ICN 3 | Start: 309 4 | ZOffset: -1c511 5 | Offset: -16,-16 6 | idle-tileset: ICON.ICN 7 | Frames: 309, 310, 311, 314, 315, 316, 319, 320, 321 8 | Length: 9 9 | Offset: -8,-8 10 | ZOffset: -2047 11 | idle-flag: ICON.ICN 12 | Frames: 309, 312 13 | Length: 2 14 | Offset: -16,-16 15 | ZOffset: -2047 16 | Tick: 1000 17 | active: DATA.R8 18 | Start: 4723 19 | Length: 23 20 | ZOffset: -1c511 21 | Offset: -48,48 22 | BlendMode: Additive 23 | Tick: 200 24 | icon: SHAPES.SHP 25 | Start: 63 26 | Offset: 0,0 27 | -------------------------------------------------------------------------------- /mods/d2/sequences/tracks.yaml: -------------------------------------------------------------------------------- 1 | track: 2 | idle: ICON.ICN 3 | Start: 25 4 | Length: 1 5 | Facings: -8 6 | Tick: 12000 7 | BlendMode: Alpha 8 | ZOffset: -1023 9 | -------------------------------------------------------------------------------- /mods/d2/sequences/trails.yaml: -------------------------------------------------------------------------------- 1 | large_trail: 2 | idle: UNITS1.SHP 3 | Start: 32 4 | Length: 4 5 | Tick: 80 6 | BlendMode: Additive 7 | ZOffset: 1023 8 | 9 | small_trail: 10 | idle: UNITS1.SHP 11 | Start: 32 12 | Length: 4 13 | Tick: 80 14 | ZOffset: 1023 15 | 16 | bazooka_trail: 17 | idle: UNITS1.SHP 18 | Start: 32 19 | Length: 4 20 | Tick: 80 21 | ZOffset: 1023 22 | 23 | deviator_trail: 24 | idle: UNITS1.SHP 25 | Start: 32 26 | Length: 4 27 | Tick: 80 28 | ZOffset: 1023 29 | -------------------------------------------------------------------------------- /mods/d2/sequences/trike.yaml: -------------------------------------------------------------------------------- 1 | trike: 2 | idle: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 5 6 | Length: 5 7 | UNITS.SHP: 8 | Start: 6 9 | Length: 3 10 | FlipX: true 11 | Frames: 0, 1, 2, 3, 4, 7, 6, 5 12 | Facings: -8 13 | muzzle: DATA.R8 14 | Start: 3839 15 | Tick: 50 16 | Facings: -32 17 | BlendMode: Additive 18 | icon: SHAPES.SHP 19 | Start: 80 20 | Offset: 0,0 21 | -------------------------------------------------------------------------------- /mods/d2/sequences/trooper.yaml: -------------------------------------------------------------------------------- 1 | trooper: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 82 6 | UNITS.SHP: 7 | Start: 85 8 | UNITS.SHP: 9 | Start: 88 10 | UNITS.SHP: 11 | Start: 85 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 82 18 | Length: 3 19 | UNITS.SHP: 20 | Start: 85 21 | Length: 3 22 | UNITS.SHP: 23 | Start: 88 24 | Length: 3 25 | UNITS.SHP: 26 | Start: 85 27 | Length: 3 28 | FlipX: true 29 | Length: 3 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 19, 20 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 19, 20 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 19, 20 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 19, 20 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 23 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -1024 53 | icon: SHAPES.SHP 54 | Start: 76 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/trooper_squad.yaml: -------------------------------------------------------------------------------- 1 | trooper_squad: 2 | stand: 3 | Combine: 4 | UNITS.SHP: 5 | Start: 103 6 | UNITS.SHP: 7 | Start: 107 8 | UNITS.SHP: 9 | Start: 111 10 | UNITS.SHP: 11 | Start: 107 12 | FlipX: true 13 | Facings: -4 14 | run: 15 | Combine: 16 | UNITS.SHP: 17 | Start: 103 18 | Length: 4 19 | UNITS.SHP: 20 | Start: 107 21 | Length: 4 22 | UNITS.SHP: 23 | Start: 111 24 | Length: 4 25 | UNITS.SHP: 26 | Start: 107 27 | Length: 4 28 | FlipX: true 29 | Length: 4 30 | Facings: -4 31 | Tick: 110 32 | die1: ICON.ICN 33 | Frames: 21, 22 34 | Length: 2 35 | Tick: 5000 36 | die2: ICON.ICN 37 | Frames: 21, 22 38 | Length: 2 39 | Tick: 5000 40 | die3: ICON.ICN 41 | Frames: 21, 22 42 | Length: 2 43 | Tick: 5000 44 | die4: ICON.ICN 45 | Frames: 21, 22 46 | Length: 2 47 | Tick: 5000 48 | die-crushed: ICON.ICN 49 | Frames: 24 50 | Length: 1 51 | Tick: 10000 52 | ZOffset: -511 53 | icon: SHAPES.SHP 54 | Start: 91 55 | Offset: 0,0 56 | -------------------------------------------------------------------------------- /mods/d2/sequences/wall.yaml: -------------------------------------------------------------------------------- 1 | wall: 2 | idle: ICON.ICN 3 | Frames: 35, 34, 35, 36, 37, 37, 38, 39, 35, 40, 35, 41, 42, 43, 44, 45 4 | Length: 16 5 | Offset: 0,0 6 | damaged-idle: ICON.ICN 7 | Frames: 35, 34, 35, 36, 37, 37, 38, 39, 35, 40, 35, 41, 42, 43, 44, 45 8 | Length: 16 9 | Offset: 0,0 10 | icon: SHAPES.SHP 11 | Start: 66 12 | Offset: 0,0 13 | -------------------------------------------------------------------------------- /mods/d2/sequences/wind_trap.yaml: -------------------------------------------------------------------------------- 1 | wind_trap: 2 | idle: ICON.ICN 3 | Start: 304 4 | Offset: -8,-8 5 | idle-tileset: ICON.ICN 6 | Frames: 304, 305, 306, 307 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Start: 307 12 | Length: 2 13 | Offset: 8,8 14 | ZOffset: -2047 15 | Tick: 1000 16 | icon: SHAPES.SHP 17 | Start: 61 18 | Offset: 0,0 19 | -------------------------------------------------------------------------------- /mods/d2/sequences/wor.yaml: -------------------------------------------------------------------------------- 1 | wor: 2 | idle: ICON.ICN 3 | Start: 285 4 | Offset: 0,0 5 | idle-tileset: ICON.ICN 6 | Frames: 285, 286, 288, 289 7 | Length: 4 8 | Offset: 0,0 9 | ZOffset: -2047 10 | idle-flag: ICON.ICN 11 | Frames: 285, 287 12 | Length: 2 13 | Offset: -8,-8 14 | ZOffset: -2047 15 | Tick: 1000 16 | idle-top-flag: ICON.ICN 17 | Frames: 288, 290 18 | Length: 2 19 | Offset: -8,8 20 | ZOffset: -2047 21 | Tick: 1000 22 | icon: SHAPES.SHP 23 | Start: 59 24 | Offset: 0,0 25 | -------------------------------------------------------------------------------- /mods/d2/weapons/largeguns.yaml: -------------------------------------------------------------------------------- 1 | 110mm_Gun: 2 | ReloadDelay: 35 3 | Range: 5c0 4 | Report: TURRET1.WAV 5 | Projectile: Bullet 6 | Speed: 875 7 | Blockable: false 8 | Shadow: false 9 | Inaccuracy: 380 10 | Image: 120mm 11 | Warhead@1Dam: SpreadDamage 12 | Spread: 256 13 | Falloff: 100, 50, 25, 0 14 | Damage: 20 15 | DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath 16 | Warhead@2Smu: LeaveSmudge 17 | SmudgeType: SandCrater, RockCrater 18 | Warhead@3Eff: CreateEffect 19 | Explosions: small_napalm 20 | ImpactSounds: EXPLSML4.WAV 21 | 22 | 80mm: 23 | ReloadDelay: 50 24 | Range: 4c0 25 | Report: MEDTANK1.WAV 26 | Projectile: Bullet 27 | Speed: 562 28 | Inaccuracy: 380 29 | Image: 120mm 30 | Warhead@1Dam: SpreadDamage 31 | Spread: 256 32 | Falloff: 100, 50, 25, 0 33 | Damage: 25 34 | DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath 35 | Warhead@2Smu: LeaveSmudge 36 | SmudgeType: SandCrater, RockCrater 37 | Warhead@3Eff: CreateEffect 38 | Explosions: small_napalm 39 | 40 | DevBullet: 41 | ReloadDelay: 75 42 | Range: 4c0 43 | Report: TANKHVY1.WAV 44 | Projectile: Bullet 45 | Speed: 281 46 | Blockable: true 47 | Image: doubleblastbullet 48 | Warhead@1Dam: SpreadDamage 49 | Spread: 384 50 | Falloff: 100, 50, 25, 0 51 | Damage: 30 52 | DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath 53 | Warhead@2Smu: LeaveSmudge 54 | SmudgeType: SandCrater, RockCrater 55 | Warhead@3Eff: CreateEffect 56 | Explosions: shockwave 57 | ImpactSounds: EXPLMD1.WAV 58 | 59 | 155mm: 60 | ReloadDelay: 80 61 | Range: 5c512 62 | Report: MORTAR1.WAV 63 | Projectile: Bullet 64 | Speed: 192 65 | Blockable: false 66 | Shadow: true 67 | LaunchAngle: 62 68 | Inaccuracy: 768 69 | #ContrailLength: 20 70 | Image: 155mm 71 | Warhead@1Dam: SpreadDamage 72 | Spread: 416 73 | Falloff: 100, 65, 35, 20, 0 74 | Damage: 40 75 | DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath 76 | Warhead@2Smu: LeaveSmudge 77 | SmudgeType: SandCrater, RockCrater 78 | Warhead@3Eff: CreateEffect 79 | Explosions: med_explosion 80 | ImpactSounds: EXPLMD2.WAV 81 | -------------------------------------------------------------------------------- /mods/d2/weapons/smallguns.yaml: -------------------------------------------------------------------------------- 1 | LMG: 2 | ReloadDelay: 30 3 | Range: 2c512 4 | Report: MGUN2.WAV 5 | Projectile: Bullet 6 | Speed: 1c256 7 | Warhead@1Dam: SpreadDamage 8 | Spread: 128 9 | Falloff: 100, 50, 25, 0 10 | Damage: 3 11 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 12 | Warhead@2Eff: CreateEffect 13 | Explosions: piffs 14 | 15 | Fremen_S: 16 | ReloadDelay: 40 17 | Range: 2c512 18 | Report: FREMODD1.WAV 19 | Projectile: Bullet 20 | Speed: 1c256 21 | Warhead@1Dam: SpreadDamage 22 | Spread: 128 23 | Falloff: 100, 50, 25, 0 24 | Damage: 125 25 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 26 | Warhead@2Eff: CreateEffect 27 | Explosions: small_explosion 28 | ImpactSounds: EXPLSML2.WAV 29 | 30 | M_LMG: 31 | ReloadDelay: 40 32 | Range: 2c512 33 | Report: MGUN2.WAV 34 | Projectile: Bullet 35 | Speed: 1c256 36 | Warhead@1Dam: SpreadDamage 37 | Spread: 128 38 | Falloff: 100, 50, 25, 0 39 | Damage: 125 40 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 41 | Warhead@2Eff: CreateEffect 42 | Explosions: piffs 43 | 44 | M_HMG: 45 | ReloadDelay: 40 46 | Range: 3c512 47 | Report: 20MMGUN1.WAV 48 | Projectile: Bullet 49 | Speed: 1c256 50 | Warhead@1Dam: SpreadDamage 51 | Spread: 192 52 | Falloff: 100, 50, 25, 0 53 | Damage: 250 54 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 55 | Warhead@2Eff: CreateEffect 56 | Explosions: piffs 57 | 58 | Fremen_L: 59 | ReloadDelay: 40 60 | BurstDelays: 5 61 | Range: 3c512 62 | Report: BAZOOK2.WAV 63 | Projectile: Bullet 64 | Speed: 1c256 65 | Warhead@1Dam: SpreadDamage 66 | Spread: 192 67 | Falloff: 100, 50, 25, 0 68 | Damage: 250 69 | DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath 70 | Warhead@2Eff: CreateEffect 71 | Explosions: small_explosion 72 | 73 | HMG: 74 | ReloadDelay: 20 75 | Range: 3c0 76 | Report: 20MMGUN1.WAV 77 | Projectile: Bullet 78 | Speed: 1c256 79 | Warhead@1Dam: SpreadDamage 80 | Spread: 160 81 | Falloff: 100, 60, 30, 0 82 | Damage: 5 83 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 84 | Warhead@2Eff: CreateEffect 85 | Explosions: piffs 86 | 87 | HMG_muzzle: 88 | ReloadDelay: 16 89 | Range: 3c0 90 | Burst: 3 91 | BurstDelays: 2 92 | Warhead@TargetValidation: SpreadDamage 93 | -------------------------------------------------------------------------------- /mods/d2/weapons/spicebloom.yaml: -------------------------------------------------------------------------------- 1 | SpiceExplosion: 2 | Projectile: Bullet 3 | Speed: 50, 75 4 | Blockable: false 5 | LaunchAngle: 60, 90 6 | Image: 120mm 7 | Warhead@1Dam: SpreadDamage 8 | Spread: 320 9 | Falloff: 100, 60, 30, 15, 0 10 | Damage: 75 11 | DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath 12 | AffectsParent: true 13 | Warhead@2Res: CreateResource 14 | AddsResourceType: Spice 15 | Size: 2 16 | Warhead@3Eff: CreateEffect 17 | Explosions: med_explosion 18 | 19 | BloomExplosion: 20 | Report: EXPLMD1.WAV 21 | Range: 0c8 22 | Projectile: Bullet 23 | Speed: 1c0 24 | Blockable: false 25 | Image: null 26 | Warhead@1Dam: SpreadDamage 27 | Spread: 256 28 | Falloff: 100, 60, 30, 15, 0 29 | Damage: 750 30 | DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath 31 | AffectsParent: true 32 | Warhead@2Res: CreateResource 33 | AddsResourceType: Spice 34 | Size: 5 35 | 36 | BloomSpawn: 37 | Range: 0c1 38 | Projectile: Bullet 39 | Speed: 1c0 40 | Blockable: false 41 | Image: null 42 | Warhead@1Eff: CreateEffect 43 | Explosions: bloomspawn 44 | -------------------------------------------------------------------------------- /mods/d2/weapons/squads.yaml: -------------------------------------------------------------------------------- 1 | Bazooka_squad: 2 | ReloadDelay: 18 3 | Range: 3c0 4 | Report: ROCKET1.WAV 5 | Projectile: Missile 6 | Speed: 281 7 | Inaccuracy: 256 8 | Image: RPG 9 | HorizontalRateOfTurn: 4 10 | #TrailImage: bazooka_trail 11 | #TrailPalette: effect75alpha 12 | #TrailInterval: 1 13 | RangeLimit: 3c614 14 | Warhead@1Dam: SpreadDamage 15 | Spread: 192 16 | Falloff: 100, 50, 25, 0 17 | Damage: 5 18 | DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath 19 | Warhead@2Smu: LeaveSmudge 20 | SmudgeType: SandCrater, RockCrater 21 | Warhead@3Eff: CreateEffect 22 | Explosions: tiny_explosion 23 | ImpactSounds: EXPLSML1.WAV 24 | 25 | LMG_squad: 26 | ReloadDelay: 20 27 | Range: 2c512 28 | Report: MGUN2.WAV 29 | Projectile: Bullet 30 | Speed: 1c256 31 | Warhead@1Dam: SpreadDamage 32 | Spread: 128 33 | Falloff: 100, 50, 25, 0 34 | Damage: 3 35 | DamageTypes: Prone50Percent, TriggerProne, BulletDeath 36 | Warhead@2Eff: CreateEffect 37 | Explosions: piffs 38 | -------------------------------------------------------------------------------- /omnisharp.json: -------------------------------------------------------------------------------- 1 | { 2 | "RoslynExtensionsOptions": { 3 | "enableAnalyzersSupport": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packaging/artwork/icon_1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_1024x1024.png -------------------------------------------------------------------------------- /packaging/artwork/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_128x128.png -------------------------------------------------------------------------------- /packaging/artwork/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_16x16.png -------------------------------------------------------------------------------- /packaging/artwork/icon_24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_24x24.png -------------------------------------------------------------------------------- /packaging/artwork/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_256x256.png -------------------------------------------------------------------------------- /packaging/artwork/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_32x32.png -------------------------------------------------------------------------------- /packaging/artwork/icon_48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_48x48.png -------------------------------------------------------------------------------- /packaging/artwork/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_512x512.png -------------------------------------------------------------------------------- /packaging/artwork/icon_64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/icon_64x64.png -------------------------------------------------------------------------------- /packaging/artwork/macos-background-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/macos-background-2x.png -------------------------------------------------------------------------------- /packaging/artwork/macos-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenRA/d2/b181f1d43b621adfe4804fbd698f0e08206ad69b/packaging/artwork/macos-background.png -------------------------------------------------------------------------------- /packaging/functions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Helper functions for packaging and installing projects using the OpenRA Mod SDK 3 | 4 | #### 5 | # This file must stay /bin/sh and POSIX compliant for macOS and BSD portability. 6 | # Copy-paste the entire script into http://shellcheck.net to check. 7 | #### 8 | 9 | # Compile and publish any mod assemblies to the target directory 10 | # Arguments: 11 | # SRC_PATH: Path to the root SDK directory 12 | # DEST_PATH: Path to the root of the install destination (will be created if necessary) 13 | # TARGETPLATFORM: Platform type (win-x86, win-x64, osx-x64, osx-arm64, linux-x64, linux-arm64, unix-generic) 14 | # RUNTIME: Runtime type (net6, mono) 15 | # ENGINE_PATH: Path to the engine root directory 16 | install_mod_assemblies() { 17 | SRC_PATH="${1}" 18 | DEST_PATH="${2}" 19 | TARGETPLATFORM="${3}" 20 | RUNTIME="${4}" 21 | ENGINE_PATH="${5}" 22 | 23 | ORIG_PWD=$(pwd) 24 | cd "${SRC_PATH}" || exit 1 25 | 26 | if [ "${RUNTIME}" = "mono" ]; then 27 | echo "Building assemblies" 28 | 29 | rm -rf "${ENGINE_PATH:?}/bin" 30 | 31 | find . -maxdepth 1 -name '*.sln' -exec msbuild -verbosity:m -nologo -t:Build -restore -p:Configuration=Release -p:TargetPlatform="${TARGETPLATFORM}" -p:Mono=true \; 32 | 33 | cd "${ORIG_PWD}" || exit 1 34 | for LIB in "${ENGINE_PATH}/bin/"*.dll "${ENGINE_PATH}/bin/"*.dll.config; do 35 | install -m644 "${LIB}" "${DEST_PATH}" 36 | done 37 | 38 | if [ "${TARGETPLATFORM}" = "linux-x64" ] || [ "${TARGETPLATFORM}" = "linux-arm64" ]; then 39 | for LIB in "${ENGINE_PATH}/bin/"*.so; do 40 | install -m755 "${LIB}" "${DEST_PATH}" 41 | done 42 | fi 43 | 44 | if [ "${TARGETPLATFORM}" = "osx-x64" ] || [ "${TARGETPLATFORM}" = "osx-arm64" ]; then 45 | for LIB in "${ENGINE_PATH}/bin/"*.dylib; do 46 | install -m755 "${LIB}" "${DEST_PATH}" 47 | done 48 | fi 49 | else 50 | find . -maxdepth 1 -name '*.sln' -exec dotnet publish -c Release -p:TargetPlatform="${TARGETPLATFORM}" -r "${TARGETPLATFORM}" -p:PublishDir="${DEST_PATH}" --self-contained true \; 51 | cd "${ORIG_PWD}" || exit 1 52 | fi 53 | } 54 | -------------------------------------------------------------------------------- /packaging/package-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ $# -eq "0" ]; then 5 | echo "Usage: `basename $0` version [outputdir]" 6 | exit 1 7 | fi 8 | 9 | TAG="$1" 10 | if [ $# -eq "1" ]; then 11 | OUTPUTDIR=$(pwd) 12 | else 13 | OUTPUTDIR=$2 14 | fi 15 | 16 | command -v python3 >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK packaging requires python 3."; exit 1; } 17 | command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK packaging requires make."; exit 1; } 18 | 19 | if [[ "$OSTYPE" != "darwin"* ]]; then 20 | command -v curl >/dev/null 2>&1 || command -v wget > /dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK packaging requires curl or wget."; exit 1; } 21 | command -v makensis >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK packaging requires makensis."; exit 1; } 22 | fi 23 | 24 | PACKAGING_DIR=$(python3 -c "import os; print(os.path.dirname(os.path.realpath('$0')))") 25 | 26 | if [[ "$OSTYPE" == "darwin"* ]]; then 27 | echo "Windows packaging requires a Linux host." 28 | echo "Linux AppImage packaging requires a Linux host." 29 | echo "Building macOS package" 30 | ${PACKAGING_DIR}/macos/buildpackage.sh "${TAG}" "${OUTPUTDIR}" 31 | if [ $? -ne 0 ]; then 32 | echo "macOS package build failed." 33 | fi 34 | else 35 | echo "Building Windows package" 36 | ${PACKAGING_DIR}/windows/buildpackage.sh "${TAG}" "${OUTPUTDIR}" 37 | if [ $? -ne 0 ]; then 38 | echo "Windows package build failed." 39 | fi 40 | 41 | echo "Building Linux AppImage package" 42 | ${PACKAGING_DIR}/linux/buildpackage.sh "${TAG}" "${OUTPUTDIR}" 43 | if [ $? -ne 0 ]; then 44 | echo "Linux AppImage package build failed." 45 | fi 46 | 47 | echo "macOS packaging requires a macOS host." 48 | fi 49 | 50 | echo "Package build done." 51 | -------------------------------------------------------------------------------- /utility.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal EnableDelayedExpansion 3 | 4 | FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) 5 | if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) 6 | set MOD_SEARCH_PATHS=%~dp0mods,./mods 7 | set ENGINE_DIR=.. 8 | if "!MOD_ID!" == "" goto badconfig 9 | if "!ENGINE_VERSION!" == "" goto badconfig 10 | if "!ENGINE_DIRECTORY!" == "" goto badconfig 11 | 12 | title OpenRA.Utility.exe %MOD_ID% 13 | 14 | set TEMPLATE_DIR=%CD% 15 | if not exist %ENGINE_DIRECTORY%\bin\OpenRA.exe goto noengine 16 | >nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine 17 | cd %ENGINE_DIRECTORY% 18 | 19 | set argC=0 20 | for %%x in (%*) do set /A argC+=1 21 | 22 | if %argC% == 0 goto choosemod 23 | 24 | if %argC% == 1 ( 25 | set MOD_ID=%1 26 | goto loop 27 | ) 28 | 29 | if %argC% GEQ 2 ( 30 | @REM This option is for use by other scripts so we don't want any extra output here - before or after. 31 | call bin\OpenRA.Utility.exe %* 32 | EXIT /B 0 33 | ) 34 | 35 | :choosemod 36 | echo ---------------------------------------- 37 | echo. 38 | call bin\OpenRA.Utility.exe 39 | echo Enter --exit to exit 40 | set /P mod="Please enter a modname: OpenRA.Utility.exe " 41 | if /I "%mod%" EQU "--exit" (exit /b) 42 | set MOD_ID=%mod% 43 | echo. 44 | 45 | :loop 46 | echo. 47 | echo ---------------------------------------- 48 | echo. 49 | echo Enter a utility command or --exit to exit. 50 | echo Press enter to view a list of valid utility commands. 51 | echo. 52 | 53 | set /P command="Please enter a command: OpenRA.Utility.exe %MOD_ID% " 54 | if /I "%command%" EQU "--exit" (cd %TEMPLATE_DIR% & exit /b) 55 | echo. 56 | echo ---------------------------------------- 57 | echo. 58 | echo Starting OpenRA.Utility.exe %MOD_ID% %command% 59 | call bin\OpenRA.Utility.exe %MOD_ID% %command% 60 | goto loop 61 | 62 | :noengine 63 | echo Required engine files not found. 64 | echo Run `make all` in the mod directory to fetch and build the required files, then try again. 65 | pause 66 | exit /b 67 | 68 | :badconfig 69 | echo Required mod.config variables are missing. 70 | echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are 71 | echo defined in your mod.config (or user.config) and try again. 72 | pause 73 | exit /b 74 | -------------------------------------------------------------------------------- /utility.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Usage: 3 | # $ ./utility.sh # Launch the OpenRA.Utility with the default mod 4 | # $ Mod="" ./launch-utility.sh # Launch the OpenRA.Utility with a specific mod 5 | 6 | set -e 7 | command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires make."; exit 1; } 8 | 9 | if ! command -v mono >/dev/null 2>&1; then 10 | command -v dotnet >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires dotnet or mono."; exit 1; } 11 | fi 12 | 13 | if command -v python3 >/dev/null 2>&1; then 14 | PYTHON="python3" 15 | else 16 | command -v python >/dev/null 2>&1 || { echo >&2 "The OpenRA mod SDK requires python."; exit 1; } 17 | PYTHON="python" 18 | fi 19 | 20 | require_variables() { 21 | missing="" 22 | for i in "$@"; do 23 | eval check="\$$i" 24 | [ -z "${check}" ] && missing="${missing} ${i}\n" 25 | done 26 | if [ ! -z "${missing}" ]; then 27 | echo "Required mod.config variables are missing:\n${missing}Repair your mod.config (or user.config) and try again." 28 | exit 1 29 | fi 30 | } 31 | 32 | TEMPLATE_LAUNCHER=$(${PYTHON} -c "import os; print(os.path.realpath('$0'))") 33 | TEMPLATE_ROOT=$(dirname "${TEMPLATE_LAUNCHER}") 34 | MOD_SEARCH_PATHS="${TEMPLATE_ROOT}/mods,./mods" 35 | 36 | # shellcheck source=mod.config 37 | . "${TEMPLATE_ROOT}/mod.config" 38 | 39 | if [ -f "${TEMPLATE_ROOT}/user.config" ]; then 40 | # shellcheck source=user.config 41 | . "${TEMPLATE_ROOT}/user.config" 42 | fi 43 | 44 | require_variables "MOD_ID" "ENGINE_VERSION" "ENGINE_DIRECTORY" 45 | 46 | LAUNCH_MOD="${Mod:-"${MOD_ID}"}" 47 | 48 | cd "${TEMPLATE_ROOT}" 49 | if [ ! -f "${ENGINE_DIRECTORY}/bin/OpenRA.Utility.dll" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then 50 | echo "Required engine files not found." 51 | echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; 52 | exit 1 53 | fi 54 | 55 | if command -v mono >/dev/null 2>&1 && [ "$(grep -c .NETCoreApp,Version= ${ENGINE_DIRECTORY}/bin/OpenRA.Utility.dll)" = "0" ]; then 56 | RUNTIME_LAUNCHER="mono --debug" 57 | else 58 | RUNTIME_LAUNCHER="dotnet" 59 | fi 60 | 61 | cd "${ENGINE_DIRECTORY}" 62 | MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" ENGINE_DIR=".." ${RUNTIME_LAUNCHER} bin/OpenRA.Utility.dll "${LAUNCH_MOD}" "$@" 63 | --------------------------------------------------------------------------------