From 5426a5fd3ccb3b97c3fc3f8843494b491a1b181e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 20 May 2012 15:50:39 +0200 Subject: [PATCH 01/36] put d2k mod stuff into it's own branch --- Makefile | 14 +- OpenRA.FileFormats/Graphics/R8Reader.cs | 138 ++++++ OpenRA.FileFormats/OpenRA.FileFormats.csproj | 1 + OpenRA.Mods.D2k/D2kLoadScreen.cs | 81 ++++ OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj | 88 ++++ OpenRA.Mods.D2k/Properties/AssemblyInfo.cs | 39 ++ OpenRA.Utility/Command.cs | 112 ++++- OpenRA.Utility/Program.cs | 17 +- doc/d2k formatspecs.txt | 99 ++++ mods/d2k/bits/clock.shp | Bin 7334 -> 0 bytes mods/d2k/bits/mcv.shp | Bin 24731 -> 75230 bytes mods/d2k/bits/mouse.shp | Bin 38287 -> 0 bytes mods/d2k/bits/moveflsh.shp | Bin 387 -> 0 bytes mods/d2k/bits/nopower.shp | Bin 572 -> 0 bytes mods/d2k/bits/pips.shp | Bin 1225 -> 0 bytes mods/d2k/bits/rank.shp | Bin 259 -> 0 bytes mods/d2k/bits/shadow.shp | Bin 6687 -> 0 bytes mods/d2k/bits/temperat.pal | Bin 768 -> 0 bytes mods/d2k/bits/units.pal | Bin 768 -> 0 bytes mods/d2k/chrome.yaml | 174 +++++++ mods/d2k/chrome/gamelobby.yaml | 455 ------------------- mods/d2k/chrome/ingame.yaml | 247 ---------- mods/d2k/chrome/mainmenu.yaml | 374 ++++++++------- mods/d2k/chrome/serverbrowser.yaml | 325 ------------- mods/d2k/chrome/settings.yaml | 178 -------- mods/d2k/chrome/videoplayer.yaml | 67 --- mods/d2k/cursors.xml | 68 --- mods/d2k/maps/blank.oramap | Bin 0 -> 572 bytes mods/d2k/maps/test.oramap | Bin 0 -> 752 bytes mods/d2k/maps/test/map.bin | Bin 81925 -> 0 bytes mods/d2k/maps/test/map.yaml | 44 -- mods/d2k/mod.yaml | 120 ++++- mods/d2k/rules/aircraft.yaml | 35 ++ mods/d2k/rules/defaults.yaml | 16 - mods/d2k/rules/structures.yaml | 232 ++++++++++ mods/d2k/rules/system.yaml | 101 ++-- mods/d2k/rules/vehicles.yaml | 70 ++- mods/d2k/sequences.yaml | 100 ++-- mods/d2k/uibits/chrome-atreides.png | Bin 0 -> 30753 bytes mods/d2k/uibits/chrome-harkonnen.png | Bin 0 -> 30747 bytes mods/d2k/uibits/chrome-ordos.png | Bin 0 -> 41036 bytes mods/d2k/uibits/dialog.png | Bin 0 -> 19234 bytes mods/d2k/uibits/loadscreen.png | Bin 0 -> 35500 bytes mods/d2k/voices.yaml | 13 + mods/default/bogus.tem | Bin 619 -> 0 bytes mods/default/chrome.xml | 35 -- mods/default/cursors.xml | 6 - mods/default/dialog.png | Bin 19241 -> 0 bytes mods/default/maps/shellmap/map.bin | Bin 81925 -> 0 bytes mods/default/maps/shellmap/map.yaml | 15 - mods/default/maps/shellmap/preview.png | Bin 971 -> 0 bytes mods/default/menus.yaml | 15 - mods/default/mod.yaml | 24 - mods/default/mouse.shp | Bin 38287 -> 0 bytes mods/default/system.yaml | 9 - mods/default/temperat.pal | Bin 768 -> 0 bytes mods/default/tileset-dummy.yaml | 15 - mods/palettetest/d2k.pal | Bin 768 -> 0 bytes mods/palettetest/mcv.shp | Bin 24731 -> 0 bytes mods/palettetest/mcv.yaml | 13 - mods/palettetest/mod.yaml | 11 - ripD2kGameFiles.sh | 267 +++++++++++ 62 files changed, 1768 insertions(+), 1850 deletions(-) create mode 100644 OpenRA.FileFormats/Graphics/R8Reader.cs create mode 100644 OpenRA.Mods.D2k/D2kLoadScreen.cs create mode 100644 OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj create mode 100644 OpenRA.Mods.D2k/Properties/AssemblyInfo.cs create mode 100644 doc/d2k formatspecs.txt delete mode 100644 mods/d2k/bits/clock.shp delete mode 100644 mods/d2k/bits/mouse.shp delete mode 100644 mods/d2k/bits/moveflsh.shp delete mode 100644 mods/d2k/bits/nopower.shp delete mode 100644 mods/d2k/bits/pips.shp delete mode 100644 mods/d2k/bits/rank.shp delete mode 100644 mods/d2k/bits/shadow.shp delete mode 100644 mods/d2k/bits/temperat.pal delete mode 100755 mods/d2k/bits/units.pal create mode 100644 mods/d2k/chrome.yaml delete mode 100644 mods/d2k/chrome/gamelobby.yaml delete mode 100644 mods/d2k/chrome/ingame.yaml delete mode 100644 mods/d2k/chrome/serverbrowser.yaml delete mode 100644 mods/d2k/chrome/settings.yaml delete mode 100644 mods/d2k/chrome/videoplayer.yaml delete mode 100644 mods/d2k/cursors.xml create mode 100644 mods/d2k/maps/blank.oramap create mode 100644 mods/d2k/maps/test.oramap delete mode 100644 mods/d2k/maps/test/map.bin delete mode 100644 mods/d2k/maps/test/map.yaml create mode 100644 mods/d2k/rules/aircraft.yaml delete mode 100644 mods/d2k/rules/defaults.yaml create mode 100644 mods/d2k/rules/structures.yaml create mode 100644 mods/d2k/uibits/chrome-atreides.png create mode 100644 mods/d2k/uibits/chrome-harkonnen.png create mode 100644 mods/d2k/uibits/chrome-ordos.png create mode 100644 mods/d2k/uibits/dialog.png create mode 100644 mods/d2k/uibits/loadscreen.png create mode 100644 mods/d2k/voices.yaml delete mode 100644 mods/default/bogus.tem delete mode 100644 mods/default/chrome.xml delete mode 100644 mods/default/cursors.xml delete mode 100644 mods/default/dialog.png delete mode 100644 mods/default/maps/shellmap/map.bin delete mode 100644 mods/default/maps/shellmap/map.yaml delete mode 100644 mods/default/maps/shellmap/preview.png delete mode 100644 mods/default/menus.yaml delete mode 100644 mods/default/mod.yaml delete mode 100644 mods/default/mouse.shp delete mode 100644 mods/default/system.yaml delete mode 100644 mods/default/temperat.pal delete mode 100644 mods/default/tileset-dummy.yaml delete mode 100755 mods/palettetest/d2k.pal delete mode 100644 mods/palettetest/mcv.shp delete mode 100644 mods/palettetest/mcv.yaml delete mode 100644 mods/palettetest/mod.yaml create mode 100755 ripD2kGameFiles.sh diff --git a/Makefile b/Makefile index 66109770b7..6e44e59f3a 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,10 @@ COMMON_LIBS = System.dll System.Core.dll System.Drawing.dll System.Xml.dll third PHONY = core tools package all mods clean distclean .SUFFIXES: -core: game renderers mod_ra mod_cnc utility +core: game renderers mod_ra mod_cnc mod_d2k utility tools: editor ralint tsbuild package: core editor -mods: mod_ra mod_cnc +mods: mod_ra mod_cnc mod_d2k all: core tools clean: @-rm -f *.exe *.dll *.mdb mods/**/*.dll mods/**/*.mdb *.resources @@ -97,6 +97,16 @@ mod_cnc_EXTRA_CMDS = mono --debug RALint.exe cnc PROGRAMS += mod_cnc mod_cnc: $(mod_cnc_TARGET) +# Dune 2000 +mod_d2k_SRCS := $(shell find OpenRA.Mods.D2k/ -iname '*.cs') +mod_d2k_TARGET = mods/d2k/OpenRA.Mods.D2k.dll +mod_d2k_KIND = library +mod_d2k_DEPS = $(STD_MOD_DEPS) $(mod_ra_TARGET) +mod_d2k_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(mod_ra_TARGET) +mod_d2k_EXTRA_CMDS = mono --debug RALint.exe d2k +PROGRAMS += mod_d2k +mod_d2k: $(mod_d2k_TARGET) + # # Tools # diff --git a/OpenRA.FileFormats/Graphics/R8Reader.cs b/OpenRA.FileFormats/Graphics/R8Reader.cs new file mode 100644 index 0000000000..d7a9be4b47 --- /dev/null +++ b/OpenRA.FileFormats/Graphics/R8Reader.cs @@ -0,0 +1,138 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see LICENSE. + */ +#endregion + +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System; + +namespace OpenRA.FileFormats +{ + public class R8Image + { + public int Width; + public int Height; + + public byte FrameWidth; + public byte FrameHeight; + + public int ImageHandle; + public int PaletteHandle; + + public byte[] Image; + + public int OffsetX; + public int OffsetY; + + public R8Image(BinaryReader reader, int Frame) + { + var offset = reader.BaseStream.Position; + var ID = reader.ReadByte(); // 0 = no data, 1 = picture with palette, 2 = picture with current palette + while (ID == 0) + ID = reader.ReadByte(); + Width = reader.ReadInt32(); //Width of picture + Height = reader.ReadInt32(); //Height of picture + OffsetX = reader.ReadInt32(); //Offset on X axis from left border edge of virtual frame + OffsetY = reader.ReadInt32(); //Offset on Y axis from top border edge of virtual frame + ImageHandle = reader.ReadInt32(); // 0 = no picture + PaletteHandle = reader.ReadInt32(); // 0 = no palette + var Bpp = reader.ReadByte(); // Bits per Pixel + FrameHeight = reader.ReadByte(); // Height of virtual frame + FrameWidth = reader.ReadByte(); // Width of virtual frame + var Align = reader.ReadByte(); //Alignment on even border + + Console.WriteLine("Offset: {0}",offset); + Console.WriteLine("ID: {0}",ID); + Console.WriteLine("Width: {0}",Width); + Console.WriteLine("Height: {0}",Height); + Console.WriteLine("OffsetX: {0}",OffsetX); + Console.WriteLine("OffsetY: {0}",OffsetY); + Console.WriteLine("ImageHandle: {0}",ImageHandle); + Console.WriteLine("PaletteHandle: {0}",PaletteHandle); + Console.WriteLine("Bpp: {0}",Bpp); + Console.WriteLine("FrameWidth: {0}",FrameWidth); + Console.WriteLine("FrameHeight: {0}",FrameHeight); + Console.WriteLine("Align: {0}",Align); + + // Load image + if (Bpp == 8) + Image = new byte[Width*Height]; + else + throw new InvalidDataException("Error: {0} bits per pixel are not supported.".F(Bpp)); + + + if (ID == 1 && PaletteHandle != 0) + { + // read and ignore custom palette + reader.ReadInt32(); //Memory + reader.ReadInt32(); //Handle + + for (int i = 0; i < Width*Height; i++) + Image[i] = reader.ReadByte(); + for (int i = 0; i < 256; i++) + reader.ReadUInt16(); + } + else if (ID == 2 && PaletteHandle != 0) + { + // ignore image with custom palette + for (int i = 0; i < Width*Height; i++) + reader.ReadByte(); + } + else //standard palette or 16 Bpp + { + for (int i = 0; i < Width*Height; i++) + Image[i] = reader.ReadByte(); + } + } + } + + public class R8Reader : IEnumerable + { + private readonly List headers = new List(); + + public readonly int Frames; + public R8Reader( Stream stream ) + { + BinaryReader reader = new BinaryReader( stream ); + + Frames = 0; + while (reader.BaseStream.Position < stream.Length) + { + try + { + Console.WriteLine("Frame {0}: {1}",Frames, reader.BaseStream.Position); + headers.Add( new R8Image( reader, Frames ) ); + Frames++; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + break; + } + } + } + + public R8Image this[ int index ] + { + get { return headers[ index ]; } + } + + public IEnumerator GetEnumerator() + { + return headers.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj index f97116332b..0b4c08eacf 100644 --- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj +++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj @@ -81,6 +81,7 @@ + diff --git a/OpenRA.Mods.D2k/D2kLoadScreen.cs b/OpenRA.Mods.D2k/D2kLoadScreen.cs new file mode 100644 index 0000000000..2136ae8a04 --- /dev/null +++ b/OpenRA.Mods.D2k/D2kLoadScreen.cs @@ -0,0 +1,81 @@ +#region Copyright & License Information +/* + * Copyright 2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Network; +using OpenRA.Support; +using OpenRA.Widgets; + +namespace OpenRA.Mods.D2k +{ + public class D2kLoadScreen : ILoadScreen + { + Dictionary Info; + static string[] Comments = new[] {"Filling Crates...", "Breeding Sandworms..."}; + + Stopwatch lastLoadScreen = new Stopwatch(); + Rectangle StripeRect; + Sprite Stripe, Logo; + float2 LogoPos; + + Renderer r; + public void Init(Dictionary info) + { + Info = info; + // Avoid standard loading mechanisms so we + // can display loadscreen as early as possible + r = Game.Renderer; + if (r == null) return; + + var s = new Sheet("mods/d2k/uibits/loadscreen.png"); + Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); + Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); + StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); + LogoPos = new float2(Renderer.Resolution.Width/2 - 128, Renderer.Resolution.Height/2 - 128); + } + + public void Display() + { + if (r == null) + return; + + // Update text at most every 0.5 seconds + if (lastLoadScreen.ElapsedTime() < 0.5) + return; + + lastLoadScreen.Reset(); + var text = Comments.Random(Game.CosmeticRandom); + var textSize = r.Fonts["Bold"].Measure(text); + + r.BeginFrame(float2.Zero, 1f); + WidgetUtils.FillRectWithSprite(StripeRect, Stripe); + r.RgbaSpriteRenderer.DrawSprite(Logo, LogoPos); + r.Fonts["Bold"].DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); + r.EndFrame( new NullInputHandler() ); + } + + public void StartGame() + { + TestAndContinue(); + Game.JoinExternalGame(); + } + + void TestAndContinue() + { + Ui.ResetAll(); + Game.LoadShellMap(); + Ui.ResetAll(); + Ui.OpenWindow("MAINMENU_BG"); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj new file mode 100644 index 0000000000..47617a3870 --- /dev/null +++ b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj @@ -0,0 +1,88 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {C0B0465C-6BE2-409C-8770-3A9BF64C4344} + Library + Properties + OpenRA.Mods.D2k + OpenRA.Mods.D2k + v3.5 + 512 + + + true + full + false + DEBUG;TRACE + prompt + 4 + bin\Debug + + + + + + + DEBUG; + prompt + 4 + false + + + none + true + bin\Release + prompt + 4 + false + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + {BDAEAB25-991E-46A7-AF1E-4F0E03358DAA} + OpenRA.FileFormats + False + + + {0DFB103F-2962-400F-8C6D-E2C28CCBA633} + OpenRA.Game + False + + + {4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E} + OpenRA.Mods.RA + False + + + {2881135D-4D62-493E-8F83-5EEE92CCC6BE} + OpenRA.Mods.Cnc + False + + + + + + + \ No newline at end of file diff --git a/OpenRA.Mods.D2k/Properties/AssemblyInfo.cs b/OpenRA.Mods.D2k/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..d76af3c9e2 --- /dev/null +++ b/OpenRA.Mods.D2k/Properties/AssemblyInfo.cs @@ -0,0 +1,39 @@ +#region Copyright & License Information +/* + * Copyright 2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("OpenRA.Mods.D2k")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenRA.Mods.D2k")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index 0c7475cb11..f398117cb1 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -104,6 +104,116 @@ namespace OpenRA.Utility } } + public static void ConvertR8ToPng(string[] args) + { + var srcImage = new R8Reader(File.OpenRead(args[1])); + var shouldRemap = args.Contains("--transparent"); + var palette = Palette.Load(args[2], shouldRemap); + var startFrame = int.Parse(args[3]); + var endFrame = int.Parse(args[4]) + 1; + var filename = args[5]; + var FrameCount = endFrame - startFrame; + + var frame = srcImage[startFrame]; + var bitmap = new Bitmap(frame.FrameWidth * FrameCount, frame.FrameHeight, PixelFormat.Format8bppIndexed); + bitmap.Palette = palette.AsSystemPalette(); + + int OffsetX = 0; + int OffsetY = 0; + + int x = 0; + + if (args.Contains("--vehicle")) //complex resorting to RA/CnC compatible frame order + { + endFrame = endFrame - (FrameCount / 2); + startFrame--; + for (int f = endFrame; f > startFrame; f--) + { + frame = srcImage[f]; + + OffsetX = frame.FrameWidth/2 - frame.OffsetX; + OffsetY = frame.FrameHeight/2 - frame.OffsetY; + + Console.WriteLine("calculated OffsetX: {0}", OffsetX); + Console.WriteLine("calculated OffsetY: {0}", OffsetY); + + var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, + PixelFormat.Format8bppIndexed); + + for (var i = 0; i < frame.Height; i++) + Marshal.Copy(frame.Image, i * frame.Width, + new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); + + bitmap.UnlockBits(data); + + x += frame.FrameWidth; + } + endFrame = endFrame + (FrameCount / 2) - 1; + startFrame = startFrame + (FrameCount / 2) + 1; + for (int f = endFrame; f > startFrame; f--) + { + frame = srcImage[f]; + + OffsetX = frame.FrameWidth/2 - frame.OffsetX; + OffsetY = frame.FrameHeight/2 - frame.OffsetY; + + Console.WriteLine("calculated OffsetX: {0}", OffsetX); + Console.WriteLine("calculated OffsetY: {0}", OffsetY); + + var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, + PixelFormat.Format8bppIndexed); + + for (var i = 0; i < frame.Height; i++) + Marshal.Copy(frame.Image, i * frame.Width, + new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); + + bitmap.UnlockBits(data); + + x += frame.FrameWidth; + } + } + else + { + for (int f = startFrame; f < endFrame; f++) + { + frame = srcImage[f]; + + if (args.Contains("--infrantry")) + { + OffsetX = frame.FrameWidth/2 - frame.Width/2; + OffsetY = frame.FrameHeight/2 - frame.Height/2; + } + else if (args.Contains("--projectile")) + { + OffsetX = frame.FrameWidth/2 - frame.OffsetX; + OffsetY = frame.FrameHeight/2 - frame.OffsetY; + } + else if (args.Contains("--building")) + { + if (frame.OffsetX < 0) { frame.OffsetX = 0 - frame.OffsetX; } + if (frame.OffsetY < 0) { frame.OffsetY = 0 - frame.OffsetY; } + OffsetX = 0 + frame.OffsetX; + OffsetY = frame.FrameHeight - frame.OffsetY; + } + Console.WriteLine("calculated OffsetX: {0}", OffsetX); + Console.WriteLine("calculated OffsetY: {0}", OffsetY); + + var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, + PixelFormat.Format8bppIndexed); + + for (var i = 0; i < frame.Height; i++) + Marshal.Copy(frame.Image, i * frame.Width, + new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); + + bitmap.UnlockBits(data); + + x += frame.FrameWidth; + } + } + bitmap.Save(filename+".png"); + Console.WriteLine(filename+".png saved"); + } + public static void ConvertTmpToPng(string[] args) { var mods = args[1].Split(','); diff --git a/OpenRA.Utility/Program.cs b/OpenRA.Utility/Program.cs index 7b5a0d0573..b544a88f94 100644 --- a/OpenRA.Utility/Program.cs +++ b/OpenRA.Utility/Program.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -27,6 +27,7 @@ namespace OpenRA.Utility { "--extract", Command.ExtractFiles }, { "--tmp-png", Command.ConvertTmpToPng }, { "--remap", Command.RemapShp }, + { "--r8", Command.ConvertR8ToPng }, }; if (args.Length == 0) { PrintUsage(); return; } @@ -53,12 +54,14 @@ namespace OpenRA.Utility { Console.WriteLine("Usage: OpenRA.Utility.exe [OPTION] [ARGS]"); Console.WriteLine(); - Console.WriteLine(" --settings-value KEY Get value of KEY from settings.yaml"); - Console.WriteLine(" --shp PNGFILE FRAMEWIDTH Convert a PNG containing one or more frames to a SHP"); - Console.WriteLine(" --png SHPFILE PALETTE [--transparent] Convert a SHP to a PNG containing all of its frames, optionally setting up transparency"); - Console.WriteLine(" --extract MOD[,MOD]* FILES Extract files from mod packages"); - Console.WriteLine(" --tmp-png MOD[,MOD]* THEATER FILES Extract terrain tiles to PNG"); - Console.WriteLine(" --remap SRCMOD:PAL DESTMOD:PAL SRCSHP DESTSHP Remap SHPs to another palette"); + Console.WriteLine(" --settings-value KEY Get value of KEY from settings.yaml"); + Console.WriteLine(" --shp PNGFILE FRAMEWIDTH Convert a single PNG with multiple frames appended after another to a SHP"); + Console.WriteLine(" --png SHPFILE PALETTE [--transparent] Convert a SHP to a PNG containing all of its frames, optionally setting up transparency"); + Console.WriteLine(" --extract MOD[,MOD]* FILES Extract files from mod packages"); + Console.WriteLine(" --tmp-png MOD[,MOD]* THEATER FILES Extract terrain tiles to PNG"); + Console.WriteLine(" --remap SRCMOD:PAL DESTMOD:PAL SRCSHP DESTSHP Remap SHPs to another palette"); + Console.WriteLine(" --r8 R8FILE PALETTE STARTFRAME ENDFRAME FILENAME [--transparent] "); + Console.WriteLine(" [--infrantry] [--vehicle] [--projectile] [--building] Convert Dune 2000 DATA.R8 to PNGs choosing start- and endframe as well as unit type for correct offset to append multiple frames to one PNG named by filename optionally setting up transparency"); } static string GetNamedArg(string[] args, string arg) diff --git a/doc/d2k formatspecs.txt b/doc/d2k formatspecs.txt new file mode 100644 index 0000000000..2c4d747a70 --- /dev/null +++ b/doc/d2k formatspecs.txt @@ -0,0 +1,99 @@ +Dune 2000 File Formats Specs. Specially for Programmers, who want make editor(s) for Dune 2000 + +Date: June 8, 2004 + +Author: Roman "Siberian GRemlin" Lotchenov +E-Mail #1: slos@scn.ru +E-Mail #2: SibGRem@rambler.ru +***************************************************************************** +Graphics Resources - .R8 and .R16 + +ImageHeader: Record +ID: Byte; //0 - no data, 1 - picture with pallete, +//2 - picture with current pallete. +Width: LongInt; //Width of picture +Height: LongInt; //Height of picture +X_Offset: LongInt; //Pictures offset on an axis X (from left border(edge) of virtual frame) +Y_Offset: LongInt; //Pictures offset on an axis Y (from top border(edge) of virtual frame) +ImageHandle: LongInt; //Handle to picture (in memory), 0 - image not have picture +PaletteHandle: LongInt; //Handle to pallete (in memory), 0 - image not have pallete, +//and using pallete from palette.bin filr. format - 256*RGB +Bpp: Byte; //Bpp of picture +FrameHeight: Byte; //Height of virtual frame, in which is displayed the picture +FrameWidth: Byte; //Width of virtual frame, in which is displayed the picture +Align: Byte; //Alignment on even border +End; + +There is a matrix(array) of pixels by the size further: +For ImageHeader.Bpp = 8: ImageHeader.Width*ImageHeader.Height +For ImageHeader.Bpp = 16: ImageHeader.Width*ImageHeader.Height*2, +������� � ���� ������ �� ������������. + +If PaletteOffset <> 0 and ImageHeader.ID = 1, then there is Pallete Header and Pallete + +PalHeader: Record +Memory: LongInt; //The memory under a palette was allocated (There is no importance in a file) +PalHandle:LongInt; //Handle to colors array (in memory), if 0 - then game showe error message +End; + +Palette: array[0..511] of byte; //Pallete: 256 records of colors +//Color record: 2 bytes - 5 bit red component, 6 bit green component, +//5 bit blue component + +Warning: In files UI_ENG.R16 and UI_ENG.R8, cuted ImageHeader.ID +Warning: Files UIBB.R8 and UIBB.R16 is only picture(pixels array) without any headers. Width=640, Height=400 + +***************************************************************************** +Sound Resources - [Dune2000 Folder]\Data\GameSFX\SOUND.RS + +HeaderSize: LongInt; //Size of RSoundHeader +RSoundBody: array[0..56] of record +FileName: Char[0..12]; //File name +Zero: Byte; //Always $00 +FileOffset: DWord; //Offfset of WAVE +FileSize: DWord; //Size of Wave file +end; + +***************************************************************************** +Text Resources - [Dune2000 Folder]\Data\UI_Data\TEXT.UIB + +STUIBHeader: record +Strs: DWord; //Count of strings +end; + +STUIBBody: array[0..STUIHeader.Strs] of record +NameCount: Word; //Count of symbols(chars) in string name +StrName: array[0..STUIBBody.NameCount] of char; //String name +StrCount: word; //Count of symbols(chars) in string +Str: array[0..STUIBBody.StrCount] of char; //String +end; + +***************************************************************************** +Fonts Resources - .FNT and .FPL + +FontHeader of record +FontLoadedFlag: byte; //Must be $00 +SpaceSize: byte; //Size of space (in pixels) +FirstSymbol: byte; //Code of first symbol in font +Interval: byte; //Size of interval between symbols (in pixels) +MaxHeight: byte; //Maximum height of symbol +Reserve: array[0..2] of byte; //not used +SymbolsHandle array[0..255] of LongInt; //Handle table to symbols in memory (There is no importance in a file) +end; + +Symbols: array[0..255] of record +Width: LongInt; //Width of symbol +Heigth: LongInt; //Heigth of symvol +Pixels: array[1..(Symbols.Width*Symbols.Heigth)] of byte; +end; + +Warning: FONTCOL.FNT using pallete from FONTCOL.FPL, Format - 256*RGBF, F=Junk! +Warning: [Dune2000 Folder]\Data\BIN\Font.BIN - is sybmol code(index) table(map) + +***************************************************************************** +Thanks to: +Michail Beschetnov for begins in R8 file format description +Magic Team for help with R8 file format and for Dune 2000 Image Converter +be-lam0r for help with FNT, R16 and R8 +-=*************=- +Please sorry for my english... \ No newline at end of file diff --git a/mods/d2k/bits/clock.shp b/mods/d2k/bits/clock.shp deleted file mode 100644 index d55ae3cf3cd734ef0438a6adb83a7ec953ef1827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7334 zcmc&&S&tP}5U!pxb7$XYn1Nwwc0>e36htL6kq2LV@ySHr_zga}&-(xsovyox@M)*{ zv?L%pA5a9ls)*Wg{(KRIJp9BDvEA+{bZo!q^!f$1OW1BNR(nq|g{5p$iQ3CcC@g2Y zC$=YKbbLjue~I5ri#K=wqK}HdvUeuzhZr;hQjfDy{1;jzpABhBHLwkYM-s6Fl2j5z1joy6i#7# zNrT!~8YrB`_LGfjmp4&3gYEVvwXd^1i|wXnwZCtsa5mdFV*BD43g@srxkdGJEqdSj zRto3w`1x2*9INAV$5FU|$2-TVy`hc5g>3)XruIGt<9}BDx@ygpB3ip_Sy$I8_fH3P zcCESAK`X0ov{yv5a@ma)l&x6Vb*-avb!%5w_1|AqcDA-g1I3O%z4?x~*f;W_$hrP} z61da$jV5Ozq6l#^%&W*?wxca*B!F{*T*i&VJd1SxkX zM9SPrf|R;$k&HVkdNMBh7HXV%B31u-rWK`dDD}F%J1gKjpe^5Qfu$HPP)7NC*+&AT)r2kN^fCAgkDY zxWEt56IV1_?sh7WTrQRPs{q*g{jF;QMPE5ec#E;Y&S2nz0}6}IF|FVh08@VSHecF zg7tz0Oac!oH8ACP7{J5mw@l!&@;$>CO->8eGeNRM9@h#usGPZ4s%rwKU%@##Xo_>>`UeA3N&%YjJs&?=$h2;Z5MnQ}=pE_h1=<_MGZ1ZU}Dv^Cc)kLOB$jMdA z2{H{=l#`(+;6_tY&LpeEj`>NAemlxcS#bqpK5IU6#-7ihv50kQYc)xR`B5%`uZUfB~d5h+`H)*~i-^w|`7zgDTgSD4`11&bv z!E1S>NTqGRN4i`fW{?YD#o}&kAjUomKyS$3p!?nHw7|Va54cxpp?ifMbT89Gu8S7A z^|V--`B9kxCvg)L$K2?VzQP;x*ht9o8PW5r1>(gx0UyQ%vH_U@9*hIS5A5scVYil+ zxYhKiTSbq#PFk8HQbnF+UeHT1a%r=mfmgdP$qT@M-@Z<=4DIw@3Pza{qzKXj ziv%g*Qvmn~J)p0lM}~!+rop#`lBdxs^guvFw{QTQzpNS zXuivLdM=QIjJzYELB*de+_){d+l^Z%zqfDXHoBAF^Vf;a&Bi;$G2HJ3Th{R=paqUy zI4M1GJqNMIosrRK@2z&nodMS3uk0pdqlYn-BOl&so$l$?+EzUJfb&v?W52b zx0aYa)q3JL)|GPW!4qQ6-I!Ava-mS>*hCIza@|f2O BbRPf! diff --git a/mods/d2k/bits/mcv.shp b/mods/d2k/bits/mcv.shp index 0d132744f86cbca95a4fdc17968d8139f550a695..68b0a1fb47be211963192777b7c4861dfe6c90c9 100644 GIT binary patch literal 75230 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 e^j^zfU|Bve*%hu(?PN*- literal 24731 zcmYJb3wR@Ec{cpMI(VUBK%2;f64p|H1d@arq!3@<_GY}1|Lpsxb z&6EJ8y`&kd)ybC6+CxqxAmHOG?O*8Wr|sXgrLkz`NLHNlVb{BB?{2aQP-tUGK3nOg~0yf zSFYQC{Ofn`KmPca_aCpmZ~yW7@c!dRKd}EO-Ms&J^p;=z{I>naf4Kb@KNt2N|M`wz zd>!3?{O`N=AHV;x{l}?a-+vqz_aFcE*#6^F^8Vwizq$YD`_%s9uYY>~F@1dh@vpS~ z$0t9#|5!8jA0IuzKK=jypYH!6WZcp;RZS$ix8UElq79px#r|DV;_BhLrpDM8W2&Nt zEaUaRVE+m=jKu3_$(W(44dYn%R{Ypj5_Q97|12e=cP@$&rQHt@a#D7QB-zn;T}(?3 zC9c~YAmp?;tUC?Oi5;J9I4(QF9biv@N5N zuyxK=>mq+{hn~{Ssw}#)tSwps$GMuRFF)a#;qY z34%2os__m_WzJpRrriUC7OZ+R*nJzJ?0p5oW0c-$j%tx#y0k+}L{S@~A$gq&1ORWu`z@;1ey6?a}dybGl?S7Mxq9|%=qI(zttR+;{ z)U?;XONtfMY=mBaiHxg>m~3iBFOCgWk*(p^qZH3nY`H1EZqYGYwQRE&^y7l0sa8W} zkvuIKLzWoiG7cw8-S-nR=Ww=oU$QaIR4NrojgaK#+Xb=b?Cp&4Cw1eXQ0U9Y)L%5mwr zpLHXY?#b&70-hQjw?OY7_rX<0zWZTr%+Z*J~mEZ7{ zscR{stEo!6v)*a1tzC4ybE2(Sf|W?L+iUGkyLHjy&l;XDlhb2zyS3I?Uyb-DT}P5! z*Ot}xWy3#9s9>YIXv$D$t=(QZ>7OFhvSQJpSVFY|KU-P#lC^O)X~pfd6}UYoxT|aa zS)R8mamvXx&Jj(adm|yUoUYsPqtp?Hx%t}ga=b5ae5N)myXsLYxple9c^~cGKuDRF zhfQ8WoNLioyvhmQZ{@1|D{uN|94;ivjxI=6TuHD{E%HuvK6UoBzLT!(I*wbF#EN1g zo)O&q**E)`7^q-M?S~{tZHMqS1?P%R+n`TCY4CYC;iNt^P2} zS2d=(^@e!Wi@;VjK@JVG?@yRE;$5;97rP(ASFU8K33t%EyZ04mk65ZEn*-$0oa0=2 zgwEKudZ%TF5Qw5Fv-&-4+v1(7urRP7iNhy#CXQ}b?$T@1kz zE!jjAWw>*b$N*V)oJL3zL^+B3;5d@A{J7_&HY`h~DLA(4@LUj=ZF$mD#tjmyt}ZyT zWjT7i-V5^^yjhq0fQ(I1bQgJ{(Hun;KwM`#FMrCL=Q)?%k7-J6*^&%%G)nh+QNPpf zz6V!~roy+A!YqoOtPhMHYVUOS_SU<Z6+HU+P`N+5_I&NcFxOm!64o@edN2%LrIFeX%FIN4toXjPoQRX0Yz+nKij2O0GfIR$f)o+cuZfK+LYS5L zf^A=N$vtD1U9ZdB>N=g1?GdC##j

S=YJMhbiL96^9H#Fc<40M|;JFy11FRp@LpB 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 diff --git a/mods/d2k/bits/mouse.shp b/mods/d2k/bits/mouse.shp deleted file mode 100644 index 4bd614a27eadcd80b69b90e4d6c8f9c7efa82802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38287 zcmd4433yx8nK%AkNw&6or6X^Nose7;_VtE9Agl_7vJ|LnMb_Hj3`>DBU^+mVX>4=v z)nX}96t)D~03pF-BW)p$n07i#r=1xmfdqG<4bV)dA>QMBozAq+_ssvB{(t9Q*^!a} zrDggIJXf|A>7Mufop(FuyzhGt(&JX5U*YPp5!KcZ6>-(q5`7)lX?CJ-;9BG$y2MGe z!bS9qn`pmC^dAz@7rjL9;|egMUAUN!=u5c1iR(Y=h|X#tN;DF^*hKW}Sw!bH6ScPx z#pV$0!FBmu^XEqVY&nJKLR`Pa_53`d`{(1nGSPXhM3z&DhH$M~Ky<}v7!z0VbbS5{ zqTRUK&m{UKuCJU$RChMfYq)~v5ZTTJt++OyN2H#QaW5cx3s>8PL_fo|Tp>D)>)wS# z6S$%m5xtJqF*G4nwJBE+lgMlbqLqJoxls%k`+XoaLxHMqNj1y+(FcZ>kV9V zC(#YKzKrV^xc=)dq8)c*-oFS8?jhQWYtg;H6xR#5KEM^ak7x|n>MvnF?L$KIb2h?VowqM z0N0gIW4>{n@eEM`m-*l9c{Kaa=^09SM4IcR8f}i3)oLwX*{(K|ojKIm%)y-MEZNCi zYLnt(Zne?xW@4s66h)8MOSL5GWEGY3G_tV<=1_ckBh|=0a*z*SuVoAI_q@F+0-O9l zK46vxNuzn4mghXGNFI_@FNT*${J`t=9ui3;H#tdAGvw0Ar7BX!n-a-I&VZ-S>wQ?n zKRVdO0fCf^gB3YTZ8tHD)v*!|0Q-OK% zHL5Fcil3>@&Z`1GwV>4LhonQwQhJEhr4ET=LG?dGKJunW5T#AZm$gEUyqZ-6#tv9J zT_kVU_bcc~(Lb7?q`Uw{qS`)Sf)9P*B}Wo?sEUyDdhs>jkOEa1Q0OG*rcTDLNrKcv zUA~l863I^2?hcY%*L9j&!1$M_k}RkXD~vi+5x;q4Z_)*-*kziVgCwDm?v$}Bd{7B<10S=i3v=}K26N}>vXR- zD=*Rj+viDjcQP5Yi=N$G5cEBrlvA@(p&;d?d|tV{OCax{P$?lv6AaL>%6;gAdk%eY z=pHT{hFx8Pp*{ShXn91p1veIR>Rr83z(r_LefWX1$7FS0t_DP{-n zr<9XiVye@Va*lMx}Wm|p+O@ zRJ~Q=q0;xt`l34zseT~|JRnf2*Dt6Auncw8a|Lnt+0@6i7Lxlx;5^LlCQC8$+F?Du~Gv}DMki5@?ri^!8Ci}G$0w&ijAQBu?lN-t@CemCePjyaV4s>CJ3KNrJ~=r)Hgb53&d}{t%No=% zx+ZCxni`iIvb9uuWbE+a(MeLMPCY_CwFZW7G*G{4e2QwQW^#07YRccBj=<#Ar^iRf zFtpN`s+}4e9jC^OZEAF6oUHyveSBn;?qiMG;YqocEzu?q4}O!>8l_RSbv4p8YAt@V z`ma&$^*5@5|6chC%CpA66Uq)5tpZc57)$VQ6_XE5Q+7_uP-=c+%q(_rhKeR}bG&WnU5wdEI z9I8vM)oWq&YE{dM%_`W&%(_>+qPi=vQcSFRdzg^#t-#7}F#O>_r7hhyo2{EpKLIMe zx3`yF4Kw<2Sg~_5Q~}nbP^ekZf(F){CTkCj2HiD{mA@`&fG2a5WbwbY6HAzo$)eK2 z&Vp3_2{Bs?%ye@1D#EHyfLO}X+tbrSi!l+^(iQN3q-;GkEnD3-2=g>xx+M0JDPLhO zC#qF;L8@%3$M5jhsXdU=B_>#Vw-W~sz`gws^rLSRvrQw{)xvS}HxYt@6J?E>*&Dd) zrz&l&e-Lu2#s7&>%T1%!+e6hlc}&cXA!h30;A=Ga4FYy8239})c3Caogj#+CP=BCO zDp$%^pHw9u6c$>l#H)`Rud+g>x#j9hBjz!++Xly)PScs{`=*KVP_quZ#b)Qz`S;)b z+33i~=+EALpIEAoTP|hMlYQ?S*50u7@Avg_^VO2%V9{)C?0u$c?~jvH=N9Z1)lQB2 z;nDZyv?|E6DXUuP<&@>!!(*e=qQN>g>F>f+)TZ3n)gV}{K ztd;HlI*mMv3#$>ACaDPeb@S3T<>7Cy^|$*Y>L!xaJZl=fhPtlqYNrRZyu==W$k~;; zx11!mSD4-|b5Oq}Z!ZsOEf4B|N5PCp1*kg{_^|Hsuz6!xK0Y6N6Pt$tUH*22kO*nz z)7WKry{zk&&U-W|AGqf&Hw9j)a*ZqKS1Al$iEp?P0X{xLf<_9!~X}Jg&yA5s~4>h-=dYM4wVY7Sjk6tOeYK zPU{r+oI-N@jcnWU@`jCDtvgs#*1lt-cgwczaDhu!3EQ`MH*VVjKhD+h zRTy%wx*dk2wtoX6IoGxgTS$7|R!hRhm$#Al(#EZ|2Vwke!-qF)-A>}m8x9Z4EHg4( zyN#q*=<8T&jE;_AnIyt8jLK})*x2~CqaTDD_sbi$>^OQ9tEaCgw~@17`I=_m$~-Ci%ifJ!`*4l$Ska;9MqfI)I~&lWUrkizuD0@~N zG(p=0(6BUl+Qh7AV3xIx93_i^+d$gHjef3g?cczD&PsGh-@avIt3A1uBPX;vbRf6% ze85&~VCK6@xV6HTD8j8KW}5g42~Th4i)2IE%7VD960l8W6gO7`1`rQc0+xN1EF47G z_(nk1U_jQO+6ciIq>lOeY7L32-AdPIYhD>X3~@U=tVkwgF6vdhs~~G52g$)9!|n%% z?8cPCfXt_F9-n|;avhx*-_EvZ!0#5|_bL5xHZ_jV^ZX+9Dvi5uX+0z`h zI+*b9W{#3z0Qa{k12}nD+uF~D*{d`Od0WbK4w|dgXNViD_jWFCUf&H>a(0dI#gk*U zaRY4QhK(m^=(cTJUMg#7S;!1&ti){9t0WxdK!QM;1=N}h)S7hb(GhA$S~+g@DK2a^ z#F918R=Ran%_|$W9zII0!<#n%GVeAnagN&IE#81HYv5N4{JQGl3cr}F1$h4YPQ~#-}ox?Xqz|CBN>2Zd-w=o(<_@dZ+@kJqmS4>3bh=2dZ ztpY$F2hc$EH~{mOGOQL3VPl3vXalB@MGoTUA%L)VKoR<#vK~JA@&=`GH5eB-n6vmT1m46J#hV<|CQUfVgfgnXE$g#zt=hkE9{YuG8prfT1Ji3; zZ>qxd248O#rWXre`jjy}sncN6Y6C+EDkS zotLz7{C))df*SnCKNz;K>_2`!joVqk&BoplTpYIx4BXCYy|4-Al;UM7qxPj zUgI#W$R0chqk)M4Sbfu;R{joPx`D&Axe}%yOvB`b^i9Ca{))rYXu#xcZK{H)!FNj) zOg7=dKRHaMa`IpV-T??nuXsB}y>{dvb9OQ9;L%P7RBlO19F3wv>0 z9EW5j4lhl+%}L-e$i7DVfP??vISw=_|GE+f`B%QPt8loVa)c-Yk>rc+EY)DA&W-(B zY~R|v*s$dLprWJ3+x{No^%%Pz7*7|m{lPR5rxi(%U<`-={S%FM=g0GhjT)0bUBoZu zczm(S3X?*gZUq(}n{h89mc?J&(I3t!nvh|8e7uq9uAJBjM-gU;tgJn>pmL=EfWB2F+c-XG)zeEDp_|Mf}7+sbT<^ z|4N(=oTcH*f?gyyYfnpsVgV;DBD2#z++WnhJmIB47xa-R7O{_8xr4cpCUNjIk6cB* z_GeX7u$PV)RJ!pwYl+W0cFMD$awl`IEqSsnHPqh|qbX)l)bBK{$ZKeCFe&twXBa{ySr0YYEF{9v9`j(q`h zQNqI5S!4@2@K>gt`HWPM*lZ@!>zV~@sYRNPU*t~g=##Z5Vu!2}^k2}g>1BW}mLND5 zLyU`_*SX|oN*L8$&^bpXeJ7LpN;>C9-$i0t%y@L&Lvv*}_8?t!1psqtp1k~7PEIDp z*>mS1_qQ5soQ=bwMf6Y#`|={V*LI0GHsl}76dIMee7WWj={$Oyp3Qk6SC|xUm0SXYQO&}MEV6a3&=JgVE!jqA7j)hjlN?7#-PSpg9uMR1l>GcvQsfkv5Hkw?N|sWol<|*%CYLXPMn@sT-^zK(4n`r< z1AZ*Lp_f_c3=YcZyJ|@}y${S;3R%pYJL4`Eu?Vf4zaP>s=>^d25e@yFOC4z7%oqrG=v=N@Ny+2M zP-EKUPR2Vp*=)>U)-oQCB)ecoQXcsx%#f7wu$waA3QC${7wh1Pxmi<=VW%St<=k12 z-Kl(0%4G3VEQ*qZu!xaMqAjYA4pvF!UiuMj1Xm1u7%!J0J|nFpum^zC)H_^+4W9_b{c*gF9VRc^~5-coe6@ipQ%})^wC#N3A#{~(SeO|DC9(H3v zG&W^(oK|NEoZ@Cs_j5ri)P%0j)R6;1R75;(hZmWx*JDp;t=b@Os6zUA7&9P^Jxw21 zb{DZy7KY4`_DZl_AZU#Tju0ffxi#Q4GS^y+2B`wXU=G>?TshG+7ug0S{Jbd%X-75$ z@PWmZO?)p*V;54SSOah-a0riTa zi6}JJlTqAR0Oo;e6+~G~W;2C6j0F_41R)2FAhIzj8B(s5GSmcb2m!`U1Py=a$=o9Fw0_e$NUZp-)sZ_{&q!Mce4IDP0ccIDyLMP@E?*Hf4lj>rNVP8Ij zX-vS`a#ICIfyuoC*G)LAI7hP<FddSh6-o@4vssAxuI+>5 zA~+B+#X1vM9^~ z#JusK5pgXSsOz{GsG?Gzgl#Uus!1d%b7B6uOMtJ%*TIW3=Pl+Xutz z-yx6WgDDk@+}R`6D;dc+lG03bU|sN+D#|Tu;6=qOUlqW}LwxxseMR~lV5}4A6jp6^ zcbLacgd?C5Xy5{uB?osZDJ=z0ygJMMFGmrMYZu5WI$^+e@g)j$p;Xv~^CHZt<7sYF zT_U7mmjNSu8HB`%-3vHr4rCsF!U>Y)I@klre*uKf1LF$GMv_(`3lr#ARq~`HlWYm= zNHAOk8f;q?r2j&184-{Zq6lgYw~N^Zq*;6yB3aNfdOw2ZG(yK*ZWptbq%H@eWxa7Y#VmE3pQcQn*UF zf#zc!>%khZV2Du4^EwaMy|e)zIwj@hHiQ%ntB&tMvUgXp@?&}*Q3PL~;xj;81jV}y z77#sUUgHGYB~Q+yzgA*y_>0#Od+%cICvne#-0Lt@+=~@zu9ZrlYd zBV2Sz3K?2_lLQOz`P=}e3t1#>ab6$kgM~Ea3)!Ud zaF{fCzKnlTuz=*OCJpWy>0&LP$6^Jm7${UpEMb*fpmUOz5~4<9f5D*%B2zR^k!`JF z>_J+`4HZu#^jK}kG9t-pv%$q;D0nruu>&(F+1+jJfe+>zH?uWlRC&m&BUzA6qq)qh z+8CCXNDJ_&>y&wPc?tw4wO2T!5SyZw(Ie|Y;iy}^g9iyX-8ST}*7J-?x)?ju-BzU@B-G1ifP^}AUEmD)W|IW}&4D`x=TK+P z|Fy2|Rcz}f4gL?I0UCQs(q+W}IHk^EpU))1LUS;xgU&$yU6}|w{#^XAM5yz2&!*1R z{uct(fuv@VA%7?taNgj$XvHWFfMGT1K*lgX20klE)-oA9zw5FpGO(%8a~u@x!NFP7 z`J{iN^39WhK_5W{6dkFOpabKA4qKUy`A96Qg`APCOh*m=bX3uCvN=&68f>J_wfU_cfjjGAG4-W82q$XO|a$Q`9?7DTZ)bo(3u(oC$z&A#;ufuS*wKlSM+iEm*`GZ@MR+GtKPID}8kN;FcXQAiVg>oJ8LLp8`01!mfE7J9JHC+bJ za2eTEK{+!85JCgAL~}$smnS<&Xjg9420G~0zMa{c&_DsBZlY86YB^-t zC!OSuD31enyM}z`8|euRWb_a+RU`73wMc}0S!V-z3Uq$2LVR|bn*x5z4k-ef-JmxQ zzv}|aL)l!2`^xsAN8SecaC_wH7|Oj3RB||5a(4{9J&=7HKtMEdZ|}^#9SLF4%lA}; zfwx1Ex5<)a-o8+7;O%Va?E!X8HWJFdJ&=35eSj{`xg)?P_jbq70G*K)BSXQCxAW~G z?EXn1)`Bf`36#cGUQta%dh<@hXl z{k4JntA@##5s%;UB;x~kQDDKr&*!6&D03#INK~TPNhz9tkjc6@5b-6T#n9;Ng2y!2g6 zOQDLC&C`qiEhZ^a&>$r|5QbHRh?6+b5$aeb4RBcw2L~YdXJp)=;Ie#f8J03G2nn{C zgSiLUd1+TiumeJ01MQMMeW74`M|fGj18GS4`~W;Oj7FYyXn8Kn9ma1#x`RF1=aRy? zV5lR)B7Natco`JYgE%usth0J6;BT<{GJ>`jy#tU;M2F$_d~OI*l7~)k{S0-$mWR0n z85RaM5GLlV6t^TDT^{)?7?+Nr4uq+wJ{SnnVl5D&h58UA9%nSUj$nI$PRry%a1k)0 z_ox9x%#ne2*nCY4v(F`i;n0J0)oN!Rx)C1ALkBr1x9E{zfNn%MdY?9sr3_~3Zmh6H zcnellI`p^LJ~zmJLmb#iLcXJevk=6MxCOzyLhnP|xNrr8^@GB;aSqyd=CasghT)Pm zSj2iYM3-aVP{wlF3ybO1BJFgA29vo|55g!cUF8~x47FupEZc{OAy`D&7q{O*@^>+P zpgjbB93eWhFw~aMwui#pGC2mQ6Win=1V5WKeC>7cAtE5J5|tY$N~!*e3bei!p1CO! zYS31Dy&}yP`@P;A{oJ8(ti>F6A+(bV6)M*w8*?>guddiT-F ze?Cl6qj1FSQUvUb02@V8-6$gRFiCTJAn|t8q9G~L_mmsuZ76ZWfOg62@!+i2O}3=R zH~Bj>KV@-~)k8yaNtFiA zA*=%@RF`}^yBB+-&b>$u24~-dhkXQ5?Thqn#I@}-3r8t-Dk0Jp==(ZZJhWf_7I>98uVdH+ zy7v)v)m?!{5bJ6B*D3HLJ#ihnP0QI z$pM z&js)GGzVm!YOLw(5UM8mLb^j~jQ@)LKb$pq1gAW%O05e(s&9cR z`4+GT7k&nNBXB4Fg}%1dJ1RK;72W&?aIS-M@}kwP*0F;D$vzN3)25S?mhbT=@r4LVOl$>T0AQY7{~ohFkm*gitoQ zTebOD%1PBq|Hu^idC2uY()-YZF?t<5zk_2E4~@(F!Lf}6u}?UT3}lzj+j<(jAXsL% z%5AE9;dK>E|B^2Hw3$vKScWD~vup6rWbAOy*R9|ez5^25z)r`0@|lAvQce%l(am6K z0mQ-YzlAeO&m#`(k{^Sa`WyBVZKEH6$szh0nEX3@(L+C!-%ura64S~ip}dp$>Tg@c zGM6zJd-uZgD!BXsdHzSaq?;6YNiMo5!>)zd?eeg8zi04nV)no-vIEq&z?s|G2K=^z z9t9s?Gx+$1{1o_r-LkMj@G%HJek6~Ye2^Vh_BXAL3O@dd(mceFEzh}7LOIG4|0iJ% zos$QKkxD)`d4!yPIbbPRC#i7~w$F-0(*v?2HB9xx6IhVoWKw@!=vL&QWVAV zgmn@!IA+qqsW_mx(wqj6BVwK}>pOuQxFj(-jJz%+r}3R1oKpg>JE1uSQ7VY4+yvN) z3={*BlM$7jAgo%+h7n|H%;s}L2SAL!Cgoi`~8X4 zTn7}EF-XNEd$^E@s@s3-s(EBkjfz({vuDbLqski;+SLPHbs*fSI6yd3=>7MCR)3dC zIL_xLIu~h}b(C((vqAWaCntO#2>)6I;ol{}RG{Ars0-@=*0#=SK#J7s8O*XdnX%`o=XG-K=`nh~e}k8DdDtN410 zT0T9#a>w|hYc#OsoM!6|ur;TOt#*^GFL1WlEVafzi}N(w;AwUxPsrW&Uj;$iGsDn> z?0G~3hBE(OFjQB?P$!NI(aB;Z>ZiL=S1qGp4ADEzDZnPAn-{3ncOhf%&2vfXMlGD$ zjYEogKfHxBYd4*P+!gtU7xIQMI%?Y3V>lV%)o|A8bxwJVZj8}G?w*evqlb^tGc!id zCmaK{&dFZX?|$SMy?l(`nK62Q-!ZNf4u4GX`KsyS^PX-X`eb(x(hDkz(DecW#vWAm z^^o_e$|`ge57+ectb}hcE31{&W)-@#r(A|!Unm#7x^T|58nIitre`HiZ&*#b76%4m zH;!X%J@lw-*SoPz-JddR(s72$>;9VQbj{Z5pM@?5E2(BBJLOm3r=b$P^EHAC?cAXX z!g(l0uSKego7D&xW2IFHOsr^73;SavT%x81{pkJSyKdo}B(FsuJPVygG}eq_&6kZb zObhaLZ&j_xI6(-;>R0SW9gkU%KB!g}q@ORm^D+2+c=5iA>_}?jHmO{c45mNh1HJ!J1$X`*+d>Yyt!P5{mig9^H(r<=a6_Q+z!gw29e zVJo{+w#)T{FB23({ow$~*0B=p`zGywhJ<-Y4F47)WJDhh%q8uk1_aaWH)`R{J88u^ zYT-vWk??upLCux&bu2u!kHdyTPYvBEYJ~L$Xq6TG->$CFBEvQT3mj2gaKi52fl-~;m-v^6*`tzgUG|4 zD_qI(TCk9+@w)c}yfQO*rK|927JB|9c%=-yunI9@x;Q8H05_;3KzdBCUD=Ivhm`ML1aSUr2AmaD;HsRgYXl3 zXE-%CPm8f5?4c#t8(6nCAgJru6#*}Q#ikKnVJ7gZ;^69cOL4eCmWsG#W)S|x)H`iNODNV&MO%>_OsM{r;yyWYgaz7Q7`05 z`z{vzbA%$yseft5~K2h8+?w^KC2V{J|0}SljhhGfLRBzYfKC!sGSo~iG*q>I$GU9R$ z*nVbJXYeva3|m4%df&c%l_DlDLf5MQg)(-jU~KPpTAn_30`1&4IZ-}?mY%ckJ8;}7 zbj`krVSW(J)=nQpPwwN2J25=k&d;Lh(r0ldz>lNjyr>`Tf{u)$h0;4i!DWaNBeWoC z-8VKN&wgfjWCCk#>;Q~MLd)V<5uz1R4V(ScC|Qn7PK=`RbZj(;WA1%pN95);SmV}o zgpW)f7#$f#2c{8J{$trchU04zo zL>re{nzef3*m3sc=p=h3Yd`9V3PV_jhrMQ$cLTEBXLUCV6U{-5d-zBnx z#DUej@Z3V;^z9~O~N|N`UcIG^}(yrG%IlzSNoc>fE`<3S) zo6RL$p;`Ko+9&xwUjg28IFSH&IKWxsd5(nr@Lz68$~~9gkHem|! zr`Cr=dlGn0wb>Ot)n=u5i$@Du)*M000Hd=SHNz=;4=J;&8mu*=ny(oZ*4U8H(PWJh zffhBz?$mjgwU(68WsTh)n5#ZabJOD^qfDCpqNDm}4jn4DraWBHk`8EjWkFZP5xSIS zmmAY{wWL&$L)JXqn69%K?*K4b$(mD#C&`)$v?LFS=uY=NN?LH#>7TRv9im$_L1H&z zC+Se&Hu-V2(A5&?#bKN%H>-zmP5Hk?zfi~JW*r?aG4h!53!jtCPUR4@S!nh`PwOI@ zB{!;5!qu&p9K-C}Rcg9OcZM?O~BUB5xyEjR>>%vty@0u z`kN~SjR7HUpIHlp?F?#8@s55eh=CV76^BHltKaOb+0{?jfY%XFVQS|r z?T|-ls)B45z?qdq`_B=qc4kfYKx|Ixz?*7J6`h9ckXM=8$J>D#Liad==)?2~ZwxvY zZ9=nL?*55%izo%=?0%mppjtay)NJ53Mc1w9;M%Na{g2D9VLwhqgRR++yVsPV4Ekfj z3rLuDPs($2lyv!Tk-GshuoQ7zw zNekMoD#z>XA-Ii4s`U0A6p}P&kT6oMw)a47Q8B`S)XQ3{djoS(jRE=FJ;+-wUntMj zFiZD!&1LO$ss9wvVDY!hDH*JckWsp;3 zC~gmHF}%bF-mW>i1=99?E^T*q&Q*o3xk{Vn)%~ZSIkCT8Nzpnq_TUPeM21g>)}rKG zX%6gSKcyzK6E1hN!#-5SByA!{X~ov^P3m)jkGP3u)?;DWutBP=twly6xw^A@Uu~bBMYj=bj%Cr21l7;z8SPPZ zl6Wy;M#n*{v$hZ0q&Be+8N^N;$=c=Xa2APv68_n6S(orbnnlbbqZ^4O5ZK#MgK8_;gWL+9!ZlCEmKSua=FLlq zF2aa@W$!%N%SevM7^%7i%02XId5k0h4+7z{FxHjkSgP20!dQ3HmP&rGSgquzj3ys!96rKe2r-N}jKNgDCp9uG z4v%ztc3(+*&m#;%UAn5Ofi7zHpD@zHGh7+SoqQxdZ|IhU){4}ly<;Mvt7x@Sl@WSpLZdhM1~;oP<~~KJqZm0i%n#xLnLk z@ud5W0q>`KPaN=zwEpAg@|b3roSFloZ|7Tnq6_#?=dl|(Z#UAN#!xteIdQ1Zm}UXW zsJpE=n@I7kZYW_EHBKa1QG~);u-}c9_d2A7yZEcNZr%H*(qObwo35|84gWMYx6RwE zY~UzK`!4^x_LIa>e9*kzT}B4_LCKUYI1y3$jankzAjoE7B|> zE}$yk?9dHW|Io9&tmVb$*FTSO(LK3Xb!2713Ig-`;SHx}S^>ZK!U?T_Sud8{9^}s< zW_TV+}Ly z<*%q#`T5R4`qkhKc(8>acK#ai!LOA;<5aZk*V7%kuQ~2W2E3!Rt1?UV8`Fg}DG?{X z790s6y|KsE-P2=R$?GM1cmr+}B=zwMJrvU55DvivZ!q4?>(r2%i|sa?^D5}6PBnBL zN>ChDYVxCm1{KdYrg0PnhlfweD4{tQB>`u$dLy~9jot5WqZlng)b5~F%ufyeCCGt# zo|e&$6hsFH$>%Zc#8l<&$0}y{@gS&%=73xqub4?XKrk0m9M1BQQ89yzbRa%2WiuFP zr4~FV!rEh{(~Sy0w6QK1%UG>wG|r1<&ZRk(#WGrVH;&33@-6=5G*|8R-^#v(X;_XS zeAwVTReqYjg#R3j`|p=6pomP*T;0TSun{x zG#@4Ihb2!%0- zN3G~O1LVU_^8Guv0S}U_RGPthop0_gaZjMFr^MP7vT(^J{m zVD)0ZAF_4^Elqd#*m{ABh;)t9vHqP6!n|Pb0#uc=o)ZdS($fVnYs(a(nHfHhCj5}t zUJzK9>IS|TU4!_zFp^X6!Jk$QbX|;Ghxz2pxRDCc13r+&?q=5q7O|^p#9O<Ek9>o&7-^in^3~*(olF7OUUnWnLQCFg9_EI1fDRGV@t>z7x6&1O6luaY>l~-~xbyL4CNI%UnF*I190B)q_d-B8 z7)X+Zz+0htoIFp)P*iR?&=AWB``y!pDig$2m?jie7&JA|LOPSKOgX_*H#-fP^hnO8 zdz1_DwfTw%qNJxlKOTE92PAty5Nb-0nq;G^l*e$Mc{ikfF(m@*B?dgD&tStWCb4y+jKMlxOd_9(!LZyyDs{KKG{vpu zN(5;5P@7ppLVpE>c?k*T21V`;JOpJSVD*AFS0Dh}L08F}+3R4!-Ssb3E1a}REJB$l zq;x8UXI;R5q&5CP3$)XN7Q50gz;NFTt`nwA^D185tD)Ks>9F$@)~BXLpy^DJ2d5O? z)Q@hXeb=JVde<_X5Bmle@aAlPp%yyVfEafnFK^}P;xF)wdVvNy|D|G?l$@aiO_@-G zV^ESw>WImcCM6kAGB!3%Nm2tPT5^UGY%g$1e4G$f`^l~J)@S}`IF7(RlF3xs zqyuXwZFqQ^j&u@qB-6*}NcA0~Bl(BZF_Zr=K8*Z_aR@EXe?Z6dMAy~ zouKBmV)f$bY~q@*nVu?G5`!Bw6q;rjC>c;U`&qkR#&#%=ih!7Pu+@v4oFe@sMv@*DAp{DeClACdnU zNykQ~%6N<{@o*eeI1;Fj<((=MAk7gE2FVf)2IJ^dnFyi4u8nu9jE90CF*?(!GKO{$ z5yYiSP=yvo1B^s)*|JavRNEa|77BGR^sB_%ykBJ$8Xk(tFnU@jiUt$0j(|&zZwnD zd0W7lY!3#P!T(1BPBqH=S0>n{gZGmf-18W3Vj0_wCYHQ0t>sNBgCpR=NT74ns6Lv=K#`k7cDgoo`U zf}j-9N4zZ%3v*6d}O;BfGFVt)P_HhWnnf<`aPSX*10@sFrG&qZRO z(Gd;ux3UOOp~S(qApM;zrlU|@C?3=&jAoWG-pn!q1rK5N(9AL(hkL8kqamaq7|kpb zh7w7z4d4eKMw6`Q`baDqjDpzk`e3LH4{Afz2%kEmn`NTSyS^wyPXZb$-_QP8$zI1mV$-7LYMjCa(i+08N-2!s*oIU(srH_LEa!0cuT#ciwZW*J3A zJh+nGdL$n9yHkmH0*1rrWf?w6FUvO(2yDbmFz|uxWN0WS&J$}xO*KTHJfT3aja#R5 z5Ml{1(H|!UZlbXS5(0zkgHiB+UY61Ife0-^P#^{akhL3lwJMacp)bZIG#Ch(&Gn*z zHWo(*GH1dM_Oxi5*~~J*dtVsMEE8d~nPr@r%`9Ovcrh<;W*H5I%x0FMax=@=M>n&K zg}G{Z<4{#Jv&3znVqhp9XbXm*`&wu{Z)OQo5(5jaCq$T&u+dUNjJAct5zK4ejX4fO zW5GfgycjwJi)l2o3370#0`Q7 zq{4Uy&SK7L!;iV69pNbSz{Pyfac9w)2zLM-v=57gz$rKAW;4rZ&}?Q28H)2}mT)W| z*35Ffx#!56S#oX15;PWqF+(%UFzgpbS>u7P1j%S+6%TV7(aaLKLaZPqV6MXu4Nf!+ zoJ)`4=S{rF6zmM|Wf_&Hds&*4R`#-tqte{yWf?2?vIL~Z_p*G=T%gOAXM6^p-bBI# z6p9-NcF68501H5~q6sv!3#vtVejc#$K;#e(Q&$;AL(5w;Ven*?uB zUeyVYvOL=n<5tEQ<*8?Y0&9W>xDlh9Wg-X}$LC{hfw0-lG7iKOSYMo_Lj*p&n`Hu^ zf*gn&%#>k4A&r3$d>ssEDin!At&MJ$`DlzwFcdBZK{2~oqAP}}a1a*I0$o+3=w``d z8fPMeZkBjQi-qK>Zk7qCb1drT-7I7Ag#3}+EY~xD%5@xpgAflvTMS1Wf}st@(9JRd z5Tn5`Y75-x4IyB>i?lG@4@iJAg`$3Rvy98`89MmHN5gm*mci&|32j7~CW4z}92^_n zETgbd0wM-(0^Sth{6$+}rS zHNCa)gd+|t(5^2Ui6!DtD&EZ!m>`Bo5ewGLj5}0J2CE_RavwZGYKTAv&dPYKGcw~g; zf#4||hVA41EFtlnCb;l;n78Kvk4a}N3`r>@VE>?=25vymh-bLfMZY~N_p`+LIC^bj zE!PNJ$b$u=qa~1vnH??T^2s||K7XvEB@c2yU5tYbrL}{M0Bj?AF-8%@fHW9*QGTLnEW;}O$Um3vyk zgQGgDx~Js^IBlFB@Q#rtdT}&Nu|J`@W60OAQbi(T`e)h8g5%%3CIMj z44?$a2x-wB6jk%wnuu{80HdvCtg@{otSm$vZ7riA*h0suSfCBk&*=^uZ7maV0CHSg z%YVj>7Y~MMz1zbv%{bn?;%W!gw3{= z@NE%;Xx`S6^9Ys36q{`= zHyij2%nA1pyr(5Z0ReM@T|!1r%TOQ$lZfCJelCWdmho^Hp(T1+Vt$VAY5DGSPs@a< zc$gV@AB0EfX&GG~MmHL+IJ~DNLe@4v)|esL=xGU45$fnbD3Wn%6Ze z3@K&@>Di$`Bo3`YtQ>{&fi-N^5;3!{W#YKLmhVpYwTyx*7`!l6w*tuJLhlG7wBqc+ z#-gE67_nd|jxsg`R>q2Trmtm!Gt*J-Y#Hj{({YR5(ZP2VKv`cHT);6V(Bmd-cDLmJ zf=}@fr@Y{0XVZK>d*M#}i?O7{93~AGd2>tNK8`oHgj&TCF*LV~^5&K?M3GoXAwboH z1aEE`Kd!muXDPug);>HY5M7fq1(1OZhB0V1(pbdQ*w|QVHFL=gh&p+r*E4ySO>_rc zEv_bIU)6Ewg~ClA{zSi=tAFNce$unf%E$OY?;O+5@H;1GKEn@tn06dpyo#Tm%y#_# z2R*`X)&I~V{L;oF{B|JA$8qc#erRN|gLdoA?OT-pG9KbbM>O}=)+X)M9fI>ip5He| zSST3oVr}K~`&|9yr_SN|f}0Ge@X#dVp?xz@;ju~P6Z;IH>N2mEAJ|tn1J);aVBbpl zQ-5GzZsvh~JJ1}*M2UWCJh2atVk3aGQT~nbz&;vn^Qk)ooB61|Q-t#?cEjfh=bP{t zkLnxXkLq*v&pf6NCyX069eY0C3^oAEd^n$pP4-oqel}mj3_6w1=6ibP*?hHBbK`8o0 zGZ>xxNqkz(OY}LU{MO(BXn)L;`0${E+7lkd*EeE5if;#8;x~2US$s)6RI&fq!}#7w z8xP|HUU`n!^wapJ5nI}9JlV^A46!qPOREsOM!2g2vDZzR`Z&b4llkO5124w$ntAYE z1zsQe;62Uu5}sXXV)h9hy!W+_eDEHk-><44_TarFfA%P1rMCd$2~Xaefv~KY!a}v* zHycXm&^`pEwE0v$x^xcmz{p7 z9=BXuOi;|H>KzXX{Wm~43{c)NK(TR9=r_kesq>vz1qlx%U5?!S#=3xTd2%XBF2OGw%`S%g;~et-8x; zt5~2P%Ub2_;jnf&Y2GS2*CF1t%h!H*-YRm*zl2;@Jbw&{NFp*H&^?6Z2djd#yJivu zp8*L*?&=H)Jav^kX->k2C$C;Ile{_?$J&7}qIaTOj^IS&;pz<5`)9IBbqvIW)d(j| zR*n2s^5o5NK0yYnG2ma|sjY52;+-C^9`8#tsg|5EBeisTKqDh~X29`}%3{5o_MSs~ z=MtWH$1@-4LCzjE%L1*e9_}w^*!!^I%2Nr0^vP0Lj|~o1%Yz@s>tD^}(SFR}e@H&- zH0xh6Mt=mXC#zZi@=X5oCm8+Xl3J%ng#d%+dok)`)uY~TK8_u!w4ZoXp4oc!aha{t zqr}vkqX;`ZJ-|7 zu1_JCsD+-y+dNCHnO>0j``hs8-d_1Ol$+GhXSy!ZdhxG=L!{h=#G1EIFJKAWr94ZY z!-tgDRKfqO`~&(CYYhBA`Gwqof`M_L$6t?nJXA)lSnRvjxA=!RWo)K5U9{o{RVHqs z@KXT`#3}TagxPUgR|bSW-V?(PpaOLTE62!zN@b3b(wMUXAOMNFalUDf5*;h>m1m)a zWK9_!iVKJ#ORnbT+UWcFmI&rItH1?70+8kbQNl*e#J+s5n3>yRX6$HRqD?p;qSRLE4{bUit1qINVn zX)IP3lLu(MhGOz_%wqB_tJ+Xaj@=@lI@Z~Ub9_9Q z944b@Cc@j^Fh0_U_MrTQcgF0H#m0k~S(|bS={BR$ zgV~w)q{SM9H|?r?eD==q_~DTuw`soW3W;(5$*kF$qoWOA+T*#;#YK*XhzLzP)9zAd z1s=kty40IO9wOg(2>)Ac6c^eQi11I!zkvw(TuMG)egYAx21LkEAd=l8fma~Hxjhi! zanuxuND4$`dLIxW%h%Q{EN~kIBF?%1L|i0_K zWoYCfD}<6nC3ydfF-dZb!I zUZIXqn=~?i#$3~=PT|h$u#+YgvUez);ay@?_@2f?-69W>8>nT}ER9Lu{_y2NN<$l|yCc;K^6>4EA6au>CRTtv+vM^PrKk8*(Y4?;Y9 A{r~^~ diff --git a/mods/d2k/bits/nopower.shp b/mods/d2k/bits/nopower.shp deleted file mode 100644 index 49792f87ceab2aef30404f32e75ede7ffe41105b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmZ9Iv1{8v7{%W;Y2%XNR7xwU(?R}#sCX@{lb8gOMMI$=IyhOf1`4GV3O=1XwNvMV zc1kn1pbmk|33lwro`k0^vJ~5b?&aK1jUj124NpjS@Atm9h;kfy%6SSjOI=}C+M4Un zxjwm7{=FXa959Pe@meWdMur37wBp(A1E^^w_iUA?iCLzv#Td41!dBg0a{2}IQppmp ze)a?JCt0N!!WG+a<)pSM_pzypVQRUk%C7%d75Tn(tcGbW4poum2aa_@r+LGnlXtDJ z*f9%$>ZaqGqo!FRP9(>>5NN!?QAl`7C|sHNtHKROBWt@A6?u00mI>FgTcc5)pM7E& zdUiOOc3(n%qzjW?0QteZphD(L`d3S88O#C%2!p`fBdX#}vsA9$i4k%x9#n~DGWHZ)~J~?S(^&^-&(CrQy&UvS7 z+b4g2@6u*1tvT;+ApQ>VYi>Vy_FwuN=6};i(cm-8ZSWh8s{ak%UTQOpL zjA03{A%`J+1fU6o1h@&QOxf0Yg7=Mo&{gZ-l%HeNrM;GqORPR_rfeZ2mK!wdt@ z3o)>JP{79P7X^$W`CG~UWP;z5T$B7tqHj_IyL}0MnqVUpv;FUJ`1>88s7j@B`z0)v zfZo%XN3mQk%ik@+a0UE>g&JS@@M;J+Y>~3>`_g(&!b2J(g>70#zJ#zI#UY#*V%)-%^?FqZ$fP0OHr}T^&%6oQV>n6eoJ+Mfk4iwT3 zCQC6yB&E$XCSfOnTp`ogjo`juL?5&nlRi4`q#fV52f-}l`6tl$3T8(z)+nHU0cJAD z=`2$EO`R?%J!y1EF-4%@l> z>sQ~y#y;S&3txg#IfA=_cMX~9Y>>*Q@sN?4k>lH|SXu4PBU)YSe13Z+ckZe2J&(tg zjO+UTbd66Rh<9gFik@m(DJre1c* z{GEs4{H-~nxOEIT+@7LeX9baxV9gr{&oEVE$}t`>RY@x@gpd`k*dmh^l5;Lrx#BgF zoFwO8Gj*ErbtcwHvBsHjT(BAwr{ zqm=Z?AI0h23g+-DB}BtV1DB>Riybv=ubKt8)su5|G$w}WZVKD+<4a{aSyy}4?w@MxgUDFS^Duf`KCL!U(fu} GLii7Q9UH0u diff --git a/mods/d2k/bits/rank.shp b/mods/d2k/bits/rank.shp deleted file mode 100644 index 958aba6c3aeac64b301d03a2ac5747a3c39c5958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 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 NRLB4Q9QuEU{{sXehfDwf diff --git a/mods/d2k/bits/temperat.pal b/mods/d2k/bits/temperat.pal deleted file mode 100644 index bb63fcdd50490a6ace83199cf15196a1e551c57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWlX>5{7;5QV#v78wGj7yAT)^T#DeE+w)r215IPWK<`0|4kh^=V|qs}{yR z)(Lb-lJ&FKUJv_zUDw@qyWJUvvA0aqv~1gUJjZc7*Y*7nAt!YFz;OeFbVv?icwh&#yrBF(A>NpHXDaS@#I@Nd0Wgd^`;d&jf%X9gAl*_evOxb)+ z$By(3u4P>FKolrvh+r4Tb`)C3H+|P|tPP!Cw7b&dNO||^+K;aZ;Qrmtqq_9sd@8#- zS6`{jlPZngKhM`~zFp3juIXx_szMa3APJ3v6y7y}eu4 z)B1pQgjK@N@^`!cj?=5{uSa#M#E|ipWGciGMU@wD2j!NV?p?gK!j0jJZs6*~z9i0h zNKzEVw&xp`9oAJKIO4gPr+X5cL9q3Gu&nX9R@1*wEl&Bg@ogWD#^JQ{VI`+=<421MGttfJm#3KaJG+gwJKqiDJ%2AS3YKM}XYWnFwo_-Ka^U}Q+$#O(hQ}X=8xin4ZvV3pb zqwmu!1B6cT`RF@O{)F4l1n=!Fjvz7-3~1-9X={~8ReS!cjtIf_NeIE5&-{(jtN2;# zZ5^I9gx-FeLp~+%={EHV@BOL2ZLgbWNnv1bD}Uadgy|Ya{E^s}&c}OoFUBh5kK0<= zbz*Oi>)51CdHv-rb+|m+@n1D0W|grlW;Uf`=5CK$7wL>@8M9jluIB!IK2TL!a#}@J z>FGnxq9|mp6{sRX&_`xsYs)lHqAoe35-=T4rDa<-ebc{&7oXRUDC`b9!2<9Bu994- zxY6~|I*!zQI&=yAPnPnsSnuWf7`}ZAx-6P9a#Y1TVrFU)B^Sp`JU0)6GQL!K+WwV& z)4ckDzvj<^1z8iYA?QcJq=M}Vr$AtVaE^q_d7oV6Bv)@G`Kz6#^O`>V2LO^JDT<=1 zs$m$mZF`; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mods/d2k/maps/blank.oramap b/mods/d2k/maps/blank.oramap new file mode 100644 index 0000000000000000000000000000000000000000..c826e5a14ef87d47de68a9a0dc08481e052f3023 GIT binary patch literal 572 zcmWIWW@Zs#U|`^2*fnpH1BXdtbuy60>cGgr4y1Dv3-ppQ^WGjbWMp9AVN$q$=f&!W zj4_viQq%++9x?`?xZ_OlRSsUDl{IlcXke$0kEuGhb67B%EKFdbYY z(KSIJ%h9-X-Cap%=6NX{vI~pk@(vv>xWy%wGePF*Z|l0UsH9gS*L|k$b`xWo@wh_v zazoTk;fAHxgQAVw!W*HQ3><(XQ2auMHmRr3cN0qJ*-gzU6jm1on%c|Lyr!sQ_z zK2C0HXD{2gH?w?l)c?dUiyv=ZDcf**hO>U!96#N2-V8PzS1;vt+-wWUo4F}>=bgT5 z7TphZCuUs|=4C=e-FLYZQQ`0GtM+yzinW_+ zvHdlaezS&mrtQi2e>#G_pStfq|DWV|H&e&k+4{-9nO#{%@83;(lYUIU%GKgnz?I}L w)~}@lycwB{8E{7)Y79Z65?vE|NFy|LAccE?H!B-Rh6xC>f%I-*yf82T08Xo{uK)l5 literal 0 HcmV?d00001 diff --git a/mods/d2k/maps/test.oramap b/mods/d2k/maps/test.oramap new file mode 100644 index 0000000000000000000000000000000000000000..59873cda667acf4c1f98980b55994ea8d275c1fe GIT binary patch literal 752 zcmWIWW@Zs#U|`^2I9RmV;r@#I?x%n}RtH7~b|9UbSfH1bnfLa(CEsBK9u^0y@;%$` zzgfYX+gpAQa!<*Z;r% ze-;0K{r_+;unm+E2lRh31fY2Lj{3a4QH%@>WlW#|fOxkuF*m0-(A)2@15a$apCS8; zMY>FmVJ*|VIHCeBUD`T($6Jrj$;Sdi&mH#NA>kLq!6fD(e6;R--TB9w0m+^lF3vcW zx+1W{^2bbWHjSyzopeOEins|Sb#3H1HMz)aYM|u$Kq2Ex4dP0xGv7ODJ$Kj=E?^n( z>+jhx2`SlL!ARrNpWpmjmr=|0_0+A!AD=eZE9S-Iu0C<#Xv6u?;+6>4Gf5lW*WOf_ zYJ6d0dyJfIx!;`HmA6mMGm$Yo5~312<*^v^Eur<|5y1>+eKs*1_Em5Ae7w0gTfC%n zmsPlhbzvGa%d~w5WW4g2xmIZP?3aDERn7Db@2)wQmwmXMHaVp$I$@In$C5XBsiH^a z%`9)6lJv{hm1_0zXIk|C@V3L%x6kkTAG_$feXsVWNin+*nn^6X^y9_Dgq`0GPQ76J z>qm}(T^0we$c diff --git a/mods/d2k/maps/test/map.yaml b/mods/d2k/maps/test/map.yaml deleted file mode 100644 index c688669572..0000000000 --- a/mods/d2k/maps/test/map.yaml +++ /dev/null @@ -1,44 +0,0 @@ -Selectable: True - -MapFormat: 3 - -Title: Name your map here - -Description: Describe your map here - -Author: Your name here - -PlayerCount: 1 - -Tileset: ARRAKIS - -MapSize: 128,128 - -TopLeft: 16,16 - -BottomRight: 112,112 - -Players: - PlayerReference@Neutral: - Name: Neutral - Palette: - Race: allies - OwnsWorld: True - NonCombatant: True - Playable: False - DefaultStartingUnits: False - Color: 255,238,238,238 - Color2: 255,44,28,24 - InitialCash: 0 - Allies: - Enemies: - -Actors: - -Waypoints: - wp0: 20,20 - -Smudges: - -Rules: - diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index f5dae064b0..3407dccbcc 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -1,41 +1,123 @@ Metadata: Title: Dune 2000 - Description: Work in progress d2k port - Version: a0001 - Author: The OpenRA Developers + Description: Converting the OpenRA Red Alert Mod one by one to Dune 2000 + Version: {DEV_VERSION} + Author: The OpenD2k Developers Folders: . - mods/d2k - mods/d2k/bits - mods/ra/uibits + ./mods/d2k + ./mods/d2k/bits + ./mods/d2k/uibits + ~^/Content/d2k + ./mods/ra + ./mods/ra/bits + ./mods/ra/uibits + ~^/Content/ra + Packages: + ~main.mix + redalert.mix + conquer.mix + hires.mix + local.mix + sounds.mix + speech.mix + allies.mix + russian.mix + temperat.mix + snow.mix + interior.mix + ~scores.mix + ~movies1.mix + ~movies2.mix mods/d2k/bits/arrakis.mix + Rules: - mods/d2k/rules/defaults.yaml - mods/d2k/rules/vehicles.yaml mods/d2k/rules/system.yaml + mods/d2k/rules/vehicles.yaml + mods/d2k/rules/structures.yaml + mods/d2k/rules/aircraft.yaml + mods/ra/rules/defaults.yaml + mods/ra/rules/system.yaml + mods/ra/rules/vehicles.yaml + mods/ra/rules/structures.yaml + mods/ra/rules/infantry.yaml + mods/ra/rules/civilian.yaml + mods/ra/rules/trees.yaml + mods/ra/rules/aircraft.yaml + mods/ra/rules/ships.yaml + Sequences: mods/d2k/sequences.yaml + mods/ra/sequences.yaml + Cursors: - mods/d2k/cursors.xml + mods/ra/cursors.yaml + Chrome: - mods/ra/chrome.xml + mods/d2k/chrome.yaml + mods/ra/chrome.yaml + Assemblies: + mods/d2k/OpenRA.Mods.D2k.dll mods/ra/OpenRA.Mods.RA.dll + ChromeLayout: - mods/d2k/chrome/ingame.yaml - mods/d2k/chrome/mainmenu.yaml - mods/d2k/chrome/videoplayer.yaml - mods/d2k/chrome/settings.yaml - mods/d2k/chrome/gamelobby.yaml - mods/d2k/chrome/serverbrowser.yaml + mods/ra/chrome/gameinit.yaml + mods/ra/chrome/ingame.yaml + mods/ra/chrome/mainmenu.yaml + mods/ra/chrome/settings.yaml + mods/ra/chrome/lobby.yaml + mods/ra/chrome/map-chooser.yaml + mods/ra/chrome/create-server.yaml + mods/ra/chrome/serverbrowser.yaml + mods/ra/chrome/replaybrowser.yaml + mods/ra/chrome/dropdowns.yaml + mods/ra/chrome/modchooser.yaml + Weapons: + mods/ra/weapons.yaml + Voices: + mods/d2k/voices.yaml + mods/ra/voices.yaml + TileSets: mods/d2k/tilesets/arrakis.yaml + mods/ra/tilesets/snow.yaml + mods/ra/tilesets/interior.yaml + mods/ra/tilesets/temperat.yaml + Music: + Movies: -LoadScreen: NullLoadScreen -ShellmapUid:1e36d6874ef7960ac0e21edf36bbe1490a4650eb -TileSize:32 + +LoadScreen: D2kLoadScreen + +ServerTraits: + LobbyCommands + MasterServerPinger + +ChromeMetrics: + mods/ra/metrics.yaml + +Fonts: + Regular: + Font:FreeSans.ttf + Size:14 + Bold: + Font:FreeSansBold.ttf + Size:14 + Title: + Font:titles.ttf + Size:48 + BigBold: + Font:FreeSansBold.ttf + Size:24 + Tiny: + Font:FreeSans.ttf + Size:10 + TinyBold: + Font:FreeSansBold.ttf + Size:10 diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml new file mode 100644 index 0000000000..555526edc1 --- /dev/null +++ b/mods/d2k/rules/aircraft.yaml @@ -0,0 +1,35 @@ +CARRYALL: + Inherits: ^Helicopter + Buildable: + Queue: Plane + BuildPaletteOrder: 110 + Prerequisites: anyhightech + BuiltAt: hightecha + Owner: atreides + Valued: + Cost: 1200 + Tooltip: + Name: Carryall + Description: Fast drop ship.\n Unarmed + Health: + HP: 90 + Armor: + Type: Light + RevealsShroud: + Range: 12 + Helicopter: + RearmBuildings: hightecha + InitialFacing: 0 + ROT: 5 + Speed: 12 + LandableTerrainTypes: Clear,Rough,Road,Ore,Beach + RenderUnit: + PlayerPalette: d2kplayer +# RenderCargo: + WithShadow: + Cargo: + Types: Vehicle + MaxWeight: 1 + PipCount: 1 + FallsToEarth: + Explosion: UnitExplode \ No newline at end of file diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml deleted file mode 100644 index 75a9061e82..0000000000 --- a/mods/d2k/rules/defaults.yaml +++ /dev/null @@ -1,16 +0,0 @@ -^Vehicle: - AppearsOnRadar: - Mobile: - TerrainSpeeds: - Clear: 100% - ROT: 5 - Selectable: - Targetable: - TargetTypes: Ground - Repairable: - Passenger: - CargoType: Vehicle - HiddenUnderFog: - GainsExperience: - GivesExperience: - DrawLineToTarget: \ No newline at end of file diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml new file mode 100644 index 0000000000..81cb4935a3 --- /dev/null +++ b/mods/d2k/rules/structures.yaml @@ -0,0 +1,232 @@ +CONYARDA: + Inherits: ^Building + Building: + Power: 0 + Footprint: xxx xxx xxx + Dimensions: 3,3 + Health: + HP: 1000 + Armor: + Type: Heavy + RevealsShroud: + Range: 5 + Bib: + Production: + Produces: Building,Defense + IronCurtainable: + Valued: + Cost: 2500 + Tooltip: + Name: Atreides Construction Yard + CustomSellValue: + Value: 2500 + BaseBuilding: + Transforms: + IntoActor: mcv + Offset:1,1 + Facing: 96 + ProductionBar: + RenderBuilding: + PlayerPalette: d2kplayer + +PWRA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 0 + Owner: atreides +# Hotkey: p + Valued: + Cost: 300 + Tooltip: + Name: Atreides Windtrap + Description: Provides power for other Atreides structures + ProvidesCustomPrerequisite: + Prerequisite: anypower + Building: + Power: 100 + Footprint: xx xx + Dimensions: 2,2 + Health: + HP: 400 + Armor: + Type: Wood + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + +BARRA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 30 + Prerequisites: anypower + Owner: atreides +# Hotkey: b + Valued: + Cost: 400 + Tooltip: + Name: Atreides Barracks + Description: Trains infantry + Building: + Power: -20 + Footprint: xx xx xx + Dimensions: 2,3 + Health: + HP: 800 + Armor: + Type: Wood + RevealsShroud: + Range: 5 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + RallyPoint: + Exit@1: + SpawnOffset: -1,19 + ExitCell: 0,2 + Exit@2: + SpawnOffset: -17,15 + ExitCell: 0,2 + Production: + Produces: Infantry + PrimaryBuilding: + ProductionBar: + +HIGHTECHA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 50 + Prerequisites: refa + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: High Tech Factory + Description: Produces carryalls + ProvidesCustomPrerequisite: + Prerequisite: anyhightech + Building: + Power: -30 + Footprint: _x_ xxx xxx + Dimensions: 3,3 + Health: + HP: 1500 + Armor: + Type: Light + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + RallyPoint: + Exit@1: + SpawnOffset: 5,0 + ExitCell: 1,1 + Production: + Produces: Plane + PrimaryBuilding: + ProductionBar: + +REFA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 10 + Prerequisites: anypower + Owner: atreides + Valued: + Cost: 1400 + Tooltip: + Name: Spice Refinery + Description: Harvesters unload spice here. + Building: + Power: -30 + Footprint: _x_ xxx x== + Dimensions: 3,3 + Health: + HP: 900 + Armor: + Type: Wood + RevealsShroud: + Range: 6 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + OreRefinery: + StoresOre: + PipCount: 17 + Capacity: 2000 + CustomSellValue: + Value: 600 + FreeActor: + Actor: HARV + InitialActivity: FindResources + SpawnOffset: 1,2 + Facing: 64 + +SILOA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 40 + Prerequisites: refa + Owner: atreides + Valued: + Cost: 150 + Tooltip: + Name: Silo + Description: Stores excess harvested Spice + Building: + Power: -10 + -GivesBuildableArea: + Health: + HP: 300 + Armor: + Type: Wood + RevealsShroud: + Range: 4 +# RenderBuildingSilo: + StoresOre: + PipCount: 5 + Capacity: 1500 + RenderBuilding: + PlayerPalette: d2kplayer + -EmitInfantryOnSell: + +LIGHTA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 50 + Prerequisites: refa + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: Light Factory + Description: light vehicles. + Building: + Power: -30 + Footprint: xxx xxx + Dimensions: 3,2 + Health: + HP: 1500 + Armor: + Type: Light + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + RallyPoint: + Exit@1: + SpawnOffset: 5,0 + ExitCell: 1,1 + Production: + Produces: Vehicle + PrimaryBuilding: + ProductionBar: \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index f078a73334..56001f83fe 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -1,79 +1,30 @@ Player: - TechTree: - PlayerResources: - InitialCash: 5000 - ActorGroupProxy: - DeveloperMode: - -World: - ScreenShaker: - ColorPickerPaletteModifier: - BuildingInfluence: - UnitInfluence: - ChooseBuildTabOnSelect: - PaletteFromCurrentTileset: - Name: terrain - PlayerColorPalette: - BasePalette: units + PlayerColorPalette@d2kplayer: + BasePalette: d2k + BaseName: d2kplayer PaletteFormat: d2k - PaletteFromFile@units: - Name: units - Filename: units.pal +World: + Country@2: + Name: Atreides + Race: atreides +# Country@3: +# Name: Harkonnen +# Race: harkonnen +# Country@4: +# Name: Ordos +# Race: ordos + PaletteFromFile@d2k: + Name: d2k + Filename: d2k.pal PaletteFromFile@chrome: Name: chrome - Filename: temperat.pal - PaletteFromFile@effect: - Name: effect - Filename: temperat.pal - PaletteFromFile@cursor: - Name: cursor - Filename: temperat.pal - PaletteFromRGBA@shadow: - Name: shadow - R: 0 - G: 0 - B: 0 - A: 140 - PaletteFromRGBA@highlight: - Name: highlight - R: 255 - G: 255 - B: 255 - A: 128 - PaletteFromRGBA@disabled: - Name: disabled - R: 0 - G: 0 - B: 0 - A: 180 - ShroudPalette@shroud: - ShroudPalette@fog: - IsFog: yes - Name: fog - Country@0: - Name: Allies - Race: allies - SpawnMapActors: - CreateMPPlayers: - MPStartLocations: - SpawnMPUnits: - EvaAlerts: - RadarUp: - RadarDown: - BuildingSelectAudio: - BuildingReadyAudio: - BuildingCannotPlaceAudio: - UnitSelectAudio: - UnitReadyAudio: - OnHoldAudio: - CancelledAudio: - CashTickUp: - CashTickDown: - LowPower: - SilosNeeded: - PrimaryBuildingSelected: - AbilityInsufficientPower: - LevelUp: - SpatialBins: - BinSize: 4 - Shroud: \ No newline at end of file + Filename: d2k.pal +# ResourceType@spice: +# ResourceType: 1 +# Palette: d2k +# SpriteNames: spice #? +# ValuePerUnit: 25 +# Name: Spice +# PipColor: Yellow +# AllowedTerrainTypes: Sand +# AllowUnderActors: false \ No newline at end of file diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 58c0c820ef..11d38b8416 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -1,21 +1,69 @@ MCV: + Transforms: + IntoActor: conyarda + RenderUnit: + Image: MCV + PlayerPalette: d2kplayer + +TRIKE: Inherits: ^Vehicle Valued: - Cost: 2000 + Cost: 200 Tooltip: - Name: Mobile Construction Vehicle - Description: Deploys into another Construction Yard.\n Unarmed + Name: Scout Trike + Icon: trikeicon + Description: Weak Scout.\n Decent vs. Infantry + Buildable: + BuildPaletteOrder: 15 + Prerequisites: lighta + Owner: atreides Selectable: - Priority: 3 - Bounds: 42,42 + Bounds: 24,24 + Mobile: + ROT: 15 + Speed: 20 Health: - HP: 600 + HP: 75 Armor: Type: Light - Mobile: - Speed: 6 RevealsShroud: - Range: 4 + Range: 8 + AttackFrontal: + PrimaryWeapon: M60mg + PrimaryOffset: 0,0,0,-4 RenderUnit: - MustBeDestroyed: - BaseBuilding: \ No newline at end of file + PlayerPalette: d2kplayer + WithMuzzleFlash: + PrimaryOffset: 0,3,0,0 + AutoTarget: + +QUAD: + Inherits: ^Vehicle + Valued: + Cost: 400 + Tooltip: + Name: Quad + Description: Fast scout vehicle, armed with \nrockets.\n Strong vs Vehicles, Aircraft\n Weak vs Infantry + Buildable: + BuildPaletteOrder: 30 + Prerequisites: lighta + Owner: atreides + Mobile: + ROT: 10 + Speed: 13 + Health: + HP: 120 + Armor: + Type: Light + RevealsShroud: + Range: 7 + AttackFrontal: + PrimaryWeapon: RedEye + SecondaryWeapon: Dragon + PrimaryOffset: 0,0,0,-2 + PrimaryLocalOffset: -4,0,0,0,25, 4,0,0,0,-25 + SecondaryOffset: 0,0,0,-2 + SecondaryLocalOffset: -4,0,0,0,25, 4,0,0,0,-25 + RenderUnit: + PlayerPalette: d2kplayer + AutoTarget: \ No newline at end of file diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 304236121b..5aee160dda 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -3,42 +3,86 @@ mcv: Start: 0 Facings: 32 -moveflsh: +conyarda: idle: Start: 0 - Length: * - -pips: - groups: - Start: 8 - Length: 10 - medic: - Start: 20 - ready: - Start: 3 - hold: - Start: 4 - pip-empty: + make: conmake Start: 0 - pip-green: + Length: * + damaged-idle: Start: 1 - pip-yellow: - Start: 5 - pip-gray: - Start: 6 - pip-red: - Start: 7 - tag-fake: - Start: 18 - tag-primary: + +pwra: + idle: + Start: 0 + make: wtrpmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +barra: + idle: + Start: 0 + make: barramake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +refa: + idle: + Start: 1 + make: refmake + Start: 0 + Length: * + damaged-idle: Start: 2 -clock: +siloa: idle: Start: 0 +# Length: 3 + Length: 1 + damaged-idle: + Start: 4 + Length: 1 + make: silomake + Start: 0 Length: * -rank: - rank: +hightecha: + idle: Start: 0 - Length: * \ No newline at end of file + make: highmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +lighta: + idle: + Start: 1 + make: lightmake + Start: 0 + Length: * + damaged-idle: + Start: 2 + +carryall: + idle: + Start: 0 + Facings: 32 + unload: + Start: 0 + Facings: 32 + +trike: + idle: + Start: 0 + Facings: 32 + +quad: + idle: + Start: 0 + Facings: 32 \ No newline at end of file diff --git a/mods/d2k/uibits/chrome-atreides.png b/mods/d2k/uibits/chrome-atreides.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf0bdf80889d72140143a8d7e41f49f5d3300c6 GIT binary patch literal 30753 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 literal 0 HcmV?d00001 diff --git a/mods/d2k/uibits/chrome-harkonnen.png b/mods/d2k/uibits/chrome-harkonnen.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ec2ac96d1a217422ef94f7b334615140fd06c6 GIT binary patch literal 30747 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 Cxut6W literal 0 HcmV?d00001 diff --git a/mods/d2k/uibits/chrome-ordos.png b/mods/d2k/uibits/chrome-ordos.png new file mode 100644 index 0000000000000000000000000000000000000000..05b6968a2939e510061c36a772efea3f79b0954f GIT binary patch literal 41036 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 VhJvE(p-}~)z4|74={p@R{V%IlTF?Lh literal 0 HcmV?d00001 diff --git a/mods/d2k/uibits/loadscreen.png b/mods/d2k/uibits/loadscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ed1198702f526d572b3291f22cfae0c1ec7a4e GIT binary patch literal 35500 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

f?s6l9WU5e?byLM_ijt7W$l9ft+D_oz>3qPi z;4Ki(RduEYmDO`j?E-0U4AXYNu?+qHkR`DN>*N*lL-<#jEY3YCcTg^zj5o!=`c%m5 z=r(bhLhNMZib__n)Itv46DnV131MhPRWD#j5a9^bqWyS^g6tmj0Uw>=iTfW%)m=j= zlH%||wcg!06v(&1pwvq>DOB}!r&Vcf?=mfl!W&Kc8?zg8i2eDmMtTPnihcIM=$DS@ zi3Q{b=og7$mVZtu5&%?ziA%u`Ah=x^CW^5Fzc*<_z1V2c0yrV6g7-vB z!^Zmo?#~2L3_m>z*hl=?EYjH>VPCy8bj=Q^wtqZbp+z0PmiLjj>cv7bdfLfZ5|{Wo z>IoapTi~^X2}EsDp;q}h!9KW|zyV;>y~|nZQv(tw>iXBTQF{R}9mN6W4?*N2_8tVz zTq75-^@SURgf*4d__h(+XNH!ksnzM7BM+c0)b4WB?(N9L>aRdoQ(_6({vJSQ{TS+q7rW=wWe^ZQF0e0_roM44mTQzOy@-~FUq9ZHvVRGhK(32j1 zHUfh^=$T`JJ>hv}D_8A5u+{el>{y_efBjzl0dw|KWQvwAq>ScG-Z2Cy8)2a-^5TMzjLy0D zl5B28l7UtW2=_TV{^JASG^S+g{_H?uiAC7;F^j|;ljv`1FzaKCFQ7}on`I|jo}YIf zkIyEXcfV3IP|<(&Tv?klKJZiiI&Z5CyF+tj_R7#GPN<+O`gP^tSZC@BNcEt(Ab)Xt z^u`?P(WNdXe?lTeoe(LvA=TzxlZQs$|?;W6M*3V;P*8o_^3 zbF}>m`rl5>Vff0ch2w4PjL(E99@01bEb`Fy+{hPA;ZM@KEk+D85uFV_Gsl?A2KfHI zfUNoho;=4He8g012RT3S?n=X_E5Y$5!L_z&uVe^`|L_B==+5dE5qHHxdFh5sS_;}T zv1Y%dfKYlW7C7XQmnrQC~|D9&{k=FrjLatnSqLb;pcxeH#TZ8$F z_Ney7v2peJSd`D^sm~m`$Z2s)jFudcj&C}#79IsZ;J!WF33?rn30aXG(6I>qQrldK zWJwuYX**OWv*ZL=!+D*9wZ2Ci#bjcRfdz=!9q%!M*B?>KtTkZg3?CG!+4PhEF_t$d2^MSpg~VK&O8IY0IPHEJJL9 z2@baboD=+*lj`3xHUwJFduyk z(N=ao@EVe zazY3WUPBCJZ|Z1)hUaNxFP8{f?KzrV=m|vhVs6#0$4zMh|1rA63M_>hT(YMQq4;!G zHS~!DS{fP}DGNV8_s+CusBJ)&2x=>-lj7N-OB3kDo-KHy>Yk{R~ zH)FILIk@)A$qG~5unfV@N;L)`z3d3_fg5C~b?#QGBcf?a_(6o$zhC1P>u=x0_YDqo zH~tU-iY3_^q=0NnK5?_hgY7Q~xfvr8dDg5xW6}v>Hi#h;JuqN>q&mmrA`-ku7?+@WyRWCwO+y1kl~<_!nLywHmWfI z7c>dHIeiDLQXuE2s?$I}GL!Rfabcino3jnLb=w8kU&77g%+L6un-s^Jf=<3Rk95mh zv|=yw5<$+LzQ_Q37C$MYmRMib906^5OK^darfL5#uVk?n7oyHHdHb1|dS_ms zfX&10T8XpE^{Kmb><(?`X%?VM8U!8}^I9e>OGKN11#|5QhLgea-Y3Xis@v&8P3{Sv zd~i_X*@~Xh?34F4t_!3`Oet-bi*6h$wUiXkM1+GATzp_l%10J`=$?u1%X1Erz8S)Z zPLtZX^~V_Y+JIR;DP4mzCiZ^{A9GBkIc`!G^1UK?v|Hgd~SP|;dWKvRbkEBr|;0YB?_F) zm^A+Yxe(KK4kJmrYzy}8NpgEI2|&caM(T{Vt)jb#h0rvK3SAKR`+0FJ*|A9X9im_FYk>7zsTmTC2&${Md=ckdGLc@>#nnmhi7VJ>*A zqikXY#@x`2_lm69rGu+?#+%B1iJ$<5_xnG+nyYYT4_1A8Xdsu^P>JoI+iMi58a*Gf zaiAZhzrNecyOA4x^>r%v|Fi(D!R|>6#&FOz#FxpgDA!GG44sYGk(l3ii)>SvV<4D{GJqBzV-NNi?@*H z{qu0WKEA-O!}&M`;Yli+3Nq*sR|i%kQ}%9pgDgt%(sK!~1U=CZ!rT+5@w{za>qA3^ z`IQAnb%R)nbCUm`k8-xdgyW^on(e3|x4+cV4^N)SFvPD}NnyxfcfU0W@m$XW*hqU8 zC16-=t(i2R)*dm&%8eiYO%f%Y=i--K4&xX)Dwi1wCC*-j=zCHY8$J(yQ(94$fb)ZPSrUZbE;y8E zoCl)51P*XQfD#UFgA8`W`hQD` z83O>n&e@I4pdo-n*u;*O^_?5#hHy|~U&Weh2W-@r;>(D5_g6jB9~Olq$)jFneC$fk zlba6l*)}Xb71Nm*9;Qne+kumbc8ytSp_f;k*~tc70z*Jf4lXNdG>Hrbd3Rj36$t}n z#wAW91UDI7JL+Dv4^so}R(lZj#0{S3|13uTx&OBoNn}e(Z`E#{TuGAy2xgW>-auAX zbrfGIbCV=Utfw&sF^gjg8POR} zeb{eRh3PVSR+`-zv(y&36ifo&Fq~~X-tB`DX^Pkmvr(wv|AmG?0c@zF6Pbge7|Z16 z7t~kN@cyT}P4h7Ep`ec5nosEnDGwe^MpuoS?T=qXTRywLmAp#ITE%Q3%rPvEQ{QwSO+9>Q z%S?fQNf^0PZ<+tnt`&UsE^LY*j+%b-w^=Wy17`L14)(>x6aPMY#qka@xr?1*TCC<3 zrNr($5bnC+VEve2UkJ6yzq-JQ4}h!YT*vvRgA(=xET8JFg=Qey8HAG3Y5!!nIQU{` zfy9bR$nTsW2~-Q3GaiD|j=wh&QqOm|cz@dlq1gz_WP6K4U6QZ^=q>HTQ~WBZjO5z_(0e(}L*= z)t(NPTvms|iJdQ#M#Tw;dTc#R-lbKPUm~2 zV%m!NT}$mhJt02UfDv;#hVZTo=5Dj0yq+knsjh^J{xyH-24LMm1lLm-E2 z%+Qd745c?2$~SNze3K{!eM55;q^2J5QS-P5r*DKr!VG2@UfL5yXtOln!<^68@!ObJ zw5y`LP0+}io0LTUW~XocHMAUN&>KK4l9I_F2_Wcwt*qCkLY~*}WQeNU9ZO zttymMB4eLM&1j)UjhKQ4)U1Ubv27V~@~s)SCy|RPUAz);i1jV>64B63Qdf7S)K>cN zl@wn@3twR}mh*XsPll+IdMOj{FZB`l_!jN>9Nuqs>@M${i4~OdE#=>S&7iv=S@-YY z=)@AO?e7_v_<39eVO2%W(-H7X-CsAeQ%_O5PUSpr4-bP6V}K;e3Ygl6 z?v>#1fh&3=i6RgK#YKgkZpH-i!=!oHuwdw>R};6Bne}$DF53lt-}Gn{Nl_r3+(6`g z2h6pCZRH>wAj3Oyps}Dswibv znZs+HZzA7#t?wJa+Kz^4l585U)43g|O}}%SRZ#F5@;yDb9Tj%_rsKcxj5^0NHYVn) zq{b*G8>KSm^Ay%K8Ik>*zEKV$o|-;`{Yw9rxsB0{Y2rkcueZzRjiM52j*1S_}eE}ogrQbOmsNK$2%nzclHbrh5{-?#UF~m4Ydp3Ivy*6A`?w+FN z4QpXUuVNcXHt$N_kLGG-`Nkkk@bkR+@2u_$>EXNnxQH4u=Cj3kInt&P5UirY}yl4gd*(&tz_3cL!B1(a@*s9WvIrlKuB4c7Z zy$c=-$`An&;SbWNyTq=J`(6!_{^%L&Vs}YUN8aifJlf{7<660xUbFD&^P-w8;TS5C zC-H*X`nlyh{8=Mf>qcUSJOiR7l288_y)67j_0;8oi&oW>DRb?|P=>8v{JL*`L`;HO zA~d+?Ifu#>D3f=T!(ic=A9O6Ywak+pS5;`1Tm7Ov^s{o}&d(hVJD$5T?~69?SlA4- zR_yctHs6yz*WRbcyp9&@J)#u(<=(tq99}wZ(VX;p+}PZ z4B(Qvn1+U^ES(A?Ci?Ak3MyY}BD59Kbko=G4T)dhsb&q}0^s`HhWDS_1g;xaPTjux z*`2rR{*`$_`|O#L_=5HPt8xza$&RCGOi1^3{i%zU8dNX&1OnQ+>eEMi zwk-IZPCU$eiXi5bHTKde%4;LhLNLew>X}r&k108OX`;da$EH%=qsrajl!ko%t=DXa zTz|C0w5h*5D%WoiZ#3`Y69#`{ewuFr6d!P3jc`89WaWN^tAnEvrirPMLo^!A-gUlZ z!Q;xdWq$nTCyw+l}flRUQ(ty*h88q8)RB6F)FLlUv`qw9G^ z1l6OWisyz051aM!6m4cJNFM!@Yrssn0Ngz8w33eR>wWhWm?XDDNqLy-7}-E(iFYrg z%r@^_6mB%XtT?A4>>hk4i@R{vD{f}SAZFhW>uzi@1+Pg6HnBWd8*1|s0jt=qN5+Wi z-ae&h;OSsQ+UuD4Kh$|I7ZLvZtfwkIyc^CCo8-j=Mc@4qsvbl~(k5H!qc1r+R4eGp z4OOhTvPYkKP;oyYGdz6rE$xVF3R!$=z|)j3YW18(h${|n=nt3il5X~u(VDeEF84%v zw)k_$$p-O;Cr`m;D`ajjOlWN?N>B5^e=PSJ-2bZN1a)L~7bm498h5y-TeDPw_2*mW z(z%_@M3=$u_fn`d!mxSdB`vpe+^jxNxBDLz%Um1e8rQTPkK}VL2I&UztsTqM!)qqa zE4JhXh$^#NacGnlzB&GxPH;_j7iVh=F*4D>^GUMs@&BiuGr;`YC4ujvupekBZk z0ufuKp?wHpxjbg3)q~r;Y-_&8;P*?puCvIhft{;{7R#E9kryp5jewkJ5tRRb^h)xu39XG~f;KHP(<7e;_I^9R&7W4O19h<)WJTTPFl-rgdSOVE zF8YSn#~d{Ps}U#)J~21!^K=x;X4Ntko+|%R-k$}vR$mpCYA^l}h0&Sws)JF0nVTr1 zs6V{ylr{M(rO&KER4i^JzHi(97zhyyI$raltVwxH8i5xr~bx0CKmU#Oaw$I+W< z_T;xvWGd+A&-=-lb5qHae?C;DU*GBHq|GCR64U4?+db?szkg9@S_$2M?&9!bQQvU zlbgsQMl`P~Qcz91_B&1)>JSO_xI~YmY~(UFMnx2#W^u^fZWs1?y=3R~8hqc^tvH2t zRC)Hg(i>2xKfH3bgeYOTSnT~IClZ#+gHl|HzleCJ;R|8vj^2R2V&etKanh3*XM`_kPs%6ulm)mzg>Nb<3&<~b4 zu1omYYeA}NACs}=D{LHf?$S|;US&c4@a{rSwCqzYR;k?J1W_o_uV3gz}pq~t1L|xIe5%aK${7I zuY~=Rfyl5+>VbPzVbJT2YAg}hozQ!{Ij{=A6r%d$tV7D(k#Px*1G+uTUx|a9%v>jc zgJlD6cinRHt~QDosJ$IM(Q=YWl>j%t4z z$4^jM5?P6<(Cf;!U=0+=#>s=I{!_l)@G*r9J^Y|BJB&vuwu8wd#!j)#D7a|^rSWJePjGW%%Y!~)D{?&J1A+t=dsi`Tm%7Uc_4C8 z1)Rg%leiaZlN!$ zr@LRB8<9)|OaGz4On)jg6X`zsV&KIqg>)qVUz{aqePDk8f_Qz|*+X^=xm(p8(al3F zm1|1@c$*TU7qCW*E13tZ3DPjNd%W%ZX z&kdWUKAWft&B=F(^U~bRZ})y!6Mv^wk8<>P_#;OnYE6=zptM(myPpvDvB>sR*u2H4 zFCbv$!_{t&n=I(v6U}Y8FT>A?c z!LHLEhs-%Qz?nU%WAGJ(A$qCgUekKed9`{h3G^E~zCUA^HM6f$HQ{Mf8IJWqUYE>& zwDyWq9gGi4YEsGM9S=JPG=7M|2mO?}Gghab`Q8=(r{@HZV%)sTl*KuJ*aD!!(=Y?W zN)x7lqc6=p4D+{Mqr@|-RG|G4A@OZ@9v5Q;A#P7`0O6t`og5UkjUyka3Y^S;5s?k? z1+nejy-_&AA3VBl`vWTB@uyM{XN-ZIpqEnw&fK2fs+F~UYzq?pcjrX)1vw-DcLx8MlMp3ZSHP9bb6t&`i7Zd>ZpWY{bsLu2-=)CC}{_LZ= zI&ZASM|bueS3NjQAQ~p8wNe&_PDYl)7h$#*_?gh|-N#2gK;()|+jZn|ZqR8F2=T#V zlVd_T=LP+B!}9=w-13Qcg?ZxKsrX(hhfZW5ST|Qd@8A zMVu7{%Mf338#a+uzV3JNGai{y3aO3K;(VWOd;N|9 z(`P+05_q4#hW)R(W{e4&e+sR(#P?-ZbUY!|dZyEq-7`TpMUhB5Hde9{F;^;4_|s$8 zY$dW;2FLa_53KM(NLL&w#;iUIpy&gXk23u-1@bD$-*&DSz>rEZu+PA6bKVC!nKRBu zM{WR%MC|rx4n*wo>Bz)dheL1mIpvqlI+)ki{Owmyb$X`C4(+D;N>)JVW2@VHZLt=k zRF(BN>5nx(-xfpiG-~h2v66+g20u+;xq51pzU+l);qh}IzS5B|B%EdJhOUZO$N)4& zSlNBWY9I)*FFiuYopo?fkI(4n3LH+a!Z0QJ&hlyZ@3JW`7XuEXv{*3TwlJq74>gHE z^yv9H&A<0xP6TlP&_f0&ldp3&dVq=D=*2VY({IY>zU6oFfB~VofYwSlV{5(f{)+p~ zSnYwcJ)y0`giru7;MGj^2Ph5`=GBRLDBCGf)Ayqpy5=WuU26T7T6&l3ovz?oIN zwa39`brK1ObMJ1!Db(DZ(RFD^2;pi}r9^d800k=pPRNs+#y5<+HV-zzy?K_5w?a1F zy!hC!|8#L3!-pX5yO+%nJ;?1PsNsoyV}&^VJEJPaGVRI7d)3+MkyIY!)D?u>6!T2% zFq~T2X~;{8e^Nt+lYIXxoZwU1RTyAiS_aS<;;8oNyE&eO8D~}@jRt4Utd;y)SHlop z<)Z*eRtH~;v$0rniFUv&GkI~lBZjY@Nr;u6L~X)eTD)LHcfiBo^i?Pe7V6hEYVrBP zy_{MqeQ_JTm*Ys9=2lkuamX^O@ZhCo>@+hjftvo|X%dZYQ+dGmi7VC8C8}KSnJ{mY zn#c?x(Du+h`}-U`C$KNHQ)IWhO&(XZhdz@>M*P@>7ES5aSr00_8Ck4!nl;_Ay_M~m zN))eS4}3@vdU}j12w0F7XC%Dm>-VzA{qu=b9w6IZ1z{0prL)*){qGMbz@+wTDdk)p z*VDfIp<>&!QnMoN#E4av(2QU@-{egQp}6~H%>Jh4{ft$46_D-)xMbwMK7XY!D$!D5 zo;5fs#Yfdq>0yKrW?@LKs&T&a!pN_PSNnN2;JiIJ$HhiAFnMGuRKSz6if_Tt(RAqi z&=M$wr9{i{JY9sNTDdm~`jHw9^#HCOPxZ*oUmMt*%y?^6-~`b3lw{5icmL2A?WAc4 z`aX4}I^JjKVlF$kw`QI}lPEWVIv+r7Aknucd~R_J#5V7d+IL4dyY}>hdy*Cl-?MEW zg}?iVTz`3K=_g6K&!&q+oq3F2Ci*NKzrM5b}JQ^Es8^r}&8|s4i9N=%pedSC81hTC~Qn5U~=UYlpjlC%p^-v-)nt|pn50+=q zT3b>pf3`dR%cF72tO0q)`v5-J16Cz5v-ys^N7QM2b+NwjzNa09y64~JyYZIxi~KJ< zR6?p8G5UWuk`Q9Rk=0)n)}yUi#Gl+?lw%xVHit0HB-Xra__LCKy9^TJyOZgPY{yNY zLSXNCC(f5zp3s&aEGUt^u1@UJ0pmF3?{Lb_mGn_nH_pi1AIM&KE8lNWkN--`V~7u~ z;!9HR_=n&20gD)c3|@drRAd@lZWJjrCRG<~z2*;U!7d~@@|j0HYtOGc6#Bv&6090Q ztQ=+rsWpNC+pl8-?(z|JJu;B>vAcUc`S!!fR?1h6Rmw*pIeIeoI<*hXEA3td2uz2H z!DlaN+L1IT#Lvs|{!Zj)!?vSrU~{yqS889q+{cv`6gHuhoWGYt<2f}SJ^vGt;vl(Q zbQbv%K^(q!u_^Mj$pEvqo!Z?maFNva_aF@XUHb$hj;PL08-&nBcY+#!!fp2BP|WR# zZda%866s5ldqqFGu5?&Gcg!&Uqp!7k>aZH4)5eh7q}$NuTR3sVw~P3BuT(!O()|dU zc2+%pED`LR(;XY}%n6dXJOdxbBjpoLADAYy9Y(Pn)pOq^Gy17DL0piiXO*CRNT?$H zTQ1#KkKtg1?Su~LUf&d$3i_p*##{NpWx=<%swD5xtf_2)jeCXZo{_Uzl6LG=s@65M$5wc00P>D^XOu~n6u?r1Cff)a*QK<`+< zF^)84slOZQzOC@5sHJR6C{}LID5yRPBg=>kkZ#Voh#Q?kAYXWvo_m{3re#_mvE!pUC*oK>m1Lq zPR|+hG5_iMmPL~2fRgkXP2L*Xx)y6yklnK@AJlq1B5E zdUg(8elqg;?(jFnyw9c*5tB{XlNF`gcx_vAG;`EqQ*<_y^_W#49w#FV!c9~wDes2$ zYlyIdj*J6iCiv2ggoQbHnGv!rgk{N8if_!Vuke(3%Hcs#^l!75VfT?te+}3K1ksO2 zK5~~|OEwLOh={=E#~fd-hrVre#_97g7M0!*UREr^up`F8(xkzqNhj9v!-KFMTVuc8 zy+HmZhfSG`3W6)0@Ebq`dzt|0BD=xw*mRNZa1UB z2Y&|KtOOcod5c>N9Q;O{PL-oy3ORTfKl78iYgr!_jx}^PRe8bp1lKv3xZY+0i**-+ z^4=T?0Dukvtk0401UrNU^S4QwH7nFZ4AUVuG%}I{Yxp6*45BKSyyVPawi*9o1iHK^ zlQ@5QsjSGb27Gr|Wl~LmKcj^|IPVhnxB|_r`4Z=(2R+~>x`otrHTnTT&}~uL7KOhK zw|w~QMmYBCBEk5u{KrbWOzZ25#~p6}rv)Al^7Y}fYq)EO?6hZM@FfkkJB)(9Xf z;|{V5AzO8C*%flJzb-35TQ#6-(v$Fu{V*h7H;ehP%Uu5scAzNLm#ux10X3VzArkbI z?vekgj2(YXdR@zlpBFI(h`iDk2CbH2Zr8dV)o40tm8MlbMO*Q())yf*w{$nR3+kaj zHa51GSpXxDm)kOS(_5Di3M@7-3f}_YxHVN@O@pP6+e3qktM=ic(5{RO72puILb`Fe zUqXFja(QJ}LRXtFm1!gM8tg>V<^OUC$~d-?Hv*@HIb&l%aq+evm=V*__o>!;JgqqD zm0Tiubp4!UCf4*I&EP0~uNf7-Rw@*fhN@Z34(mEr^`Z{u7@ww!44wj&WLmtqyxex? z!8ivjYGK}uRvX+>%^MQMhmh`Z;(y8`2zdc@<7BVD4&1c?iAvbq%$6AZ%rzK(T=G$l zW!S0YPL5^W)oAY2qwQhtik<-O?;kIzrZuaewQ>GGroJ*P%I^F6o}#;( zp<7CkW@wa_4(XEah8Y?J1eKH)m6jF}fgz+7R9YGd=?00Jm*;u@zw3JM4|C1ebDw?o zT6^tv_RV?wjOfpdtk76p!Ve0aqfF$;Aa#B?=`i-nU7t^z*l$V|cu=r@*ZvmuHGa5V zg`D-+&ezWRRI>;{SoCfM>Xb10RTI{Ac**Y_&e%Ay|3cB7Dy#)7Xuj2$4`W?`_6(V3 zSLS|dsoYv(tQO@j<2sirYAIy@SEb|&rF@ny)g#N(N0ygoNA}rR!;9d_w}W~2$M>h! zkF%`+KjOtBS)teng!=FMog};VauV7?qHtG}n!ICcE{q!?(0qKQ-}a%a@8r6poE_V) z`?0ZXL0RnMqpu`ne3a_O&_sOqCB9jk2Ei8zrt#76?y)DR!Z}oYEwFb@^aAc3&k5Gj z2%fV5;7hQj^@69cfiwZp;tZ4z${Z~XOO7%kG>#X=nKYFQ{5U#w=y$n5^QH4O3|?gc zXzwBvDB+*DFIw)x(j?f5wIQ$n@{GU6v^f3p#O2C2a&Sst(|_`Y-GZ%G6SOu#u~wM2 zX2tjAJ#FXB*}>6SLigxexX!_T6F^skkzpW0ggxsF>9jg69b_mjTPZ>^n`0%W6Br<< zKxC2hO@yc3jR1f6RxRecEev=@X?cl^3>Mef^T=EY`kdAFHYnz8Bb{0X8!{|Q;KxE4> zrEvx}WZ~0@lsxiCp7KQ@E=%H-+EDy9tLtw@ApuvoH;aoR;sICDTN{NI$>!Ev&>e2@ z@ao(cPX0^i$p;{7HU3myF5m<&;{57m^q0RKsI+^7h<0KTP5!wV#-?K|rrCq_n?(D? zusn@Pdq$Z4^#p*FQu+XLe|kwwpvvO$7ADEi!xW$E)pKlQmyJ2s)zHwuM>F|}F3r0# z*mTg3Ng@P`b-G^LnAVw_ep{OEey+MC6i$WwWOh0%RyRor-u-hW{4yp$8pV>0I7!9b z`db64rl*Vzti<-Tph!uo7LX_2m0u9kq#Oy)d1eT{TR+>X&F~3rPFbTC{_j5pT z|I6ps3uRv?g|S~Xt%kIP*WQX<3RpcAkiY#M(gZc|WySwKilTP--qp&)tq?CY4-jw{=r6Csk$?S%9sRoZb3TE>K9hbi0 z>Qc_1NAAO;F?YHW)PDK6Hj>9x>QWK=UGu&-;oM&X?6W!>d2RG`5|JOm@`}D zCeV=K0lJP?WPq57ubLU{j&op1mh&$pX8_}VC|XqeFZ7b<1Py6Q%A2xm$(3nH}j25V2cE z`65VSHdlEQJyj30Wv?BDZ?|x{A=`I*5g)sAG_~sYPE?|QlXOqW`etw7vCP3#`_=an z?5|9@+E;(oS$8|__=|hMf&$3BlY=%;QN7(+=R6J&8UfvUuywtBR(o?nMjGii?AE%g zzZZIH5`8fb_fc=2qo9n>=OBIRuGgK*H-edCT=M(@zD>AqpvAeMu@|r$H&8Hbj#DNN z3I|O`n3XG&L#j!C3udJ#hnqjlQI1u>fDC0P{g`HR*+b0CsX)Z}%HJ`IFBQ0iQux z#xKb&Ioba>)am1;BX2Q7vaH35MV6}=nyRt0?r6tKmaxnQb!;tSnV_rj7kxp zK|k;5|B8D+c>VQ;8_`~h+C?pF5KZ?($D`$pp~$=KP=~cdTWb9E3GCXCF$Ox5(SsaYKB;tSRvLx{m#z)Zp-b$Fsa7L>^{e6MWH4 zjlHyQHwUWgk5v`oMpNHoTt9VM{k?x>a5H`R8!J0L7(>iDTmxTzH0Eu_Ye}*BLBxZM zw+tnFc}t*454zbUZ`ltU7obUVi-VQK-h*J7vc{)wP_i`}pE^2J4Wu#39->K-J6NTH zcDlfwDf;3O>J&$U5Pk#M#Mz$ELcJ%z2+RVzDyy9s^&)Ow@2fzg8(k8FJ;=gD6maDA zv-?f4s+M9at}&g&nH?Rgso0(MyzzTcHa2X0Z~i=W__P&Uvvng3Q7|R|+BUW-F_;c{ zW5d6jj*zi8n_&?7Q@xvehb;FdZXSQ?93`M@H;?TT_VH2avBnk!g0FeY7oSlC4bcU? z?iET*VGsne1kolt#(U3Nek?}a^7{H|kU0?T^@ytKAp@A@U-8ZPChj_hJ(*mJMw!Vuyn zSX~}^si_iEwf5U!TJ0I-$?!8OwsVk zNpos(WaF!Dylki~kMFeMKzfoG!9V~Imeob%yz=e#aQu3r{vWzunxSf@__>Rx-*=!d zDyb0$h!l2loOmH7i{E`+J|z7l^o|GX6p@11$owZbnE`}RpM+2!)Rttq5qFrb_5Xm( z<)LFk$E?5^NPY&AH!~YUM?g#0${*hy$(i`ewh+*mj-~3^@5A0Vh5B2y4>&7soZ~?% zoRv_MNk9|{<=DplD6Qe&b0ciI(flsd)`%SysPx_9dyoM3n_CkdWSn*CXY8iv^$GR^ zb*~o`-$L;g3_dd3&l$cZCc}BvlawG%v(A|?^K{8gIOg2z9Td*SwtN`#IHJ-#FH$pV zLjk(8SZxkEq(XD2gUE0*7C?bCHcfUAG2V=-_9KEX@(Zy=BMK>4|D&MnEAYB->EpEE z@jwtDbgp3Y_2%>nyk&&^RlGT=5ZSr~Qy{%1GG1OWYCIyA-5FB(m$DqH?>KwPeW>nw z!eV#fw&E_+7r@QzI?J<)J1;E8Yny{r$Fce*i`zefifD?4u5*+&)SE-u3z;b=W+=CJ zF8{9JJdU-Ei*`Bl5*p*jyL)Bna@IWT{9Se8am39veE@wz^Db|BK^CYybX5DDqQ!&Q zGfvLgaLnb@xO@qW@IVI3nfG~HVGggyor>&(GSRQDS01G^&nG0`xQyBfmc7YshIQw3 z?GbGL-doKBWU-mAIMea*lR&1av|fQ0Am@-Zax~2n;NW1Jv78bkPD0NlR+tR&yUq%u zm6yICdw5SSuxs-We~eyE!5J_Yze2cC)%A1LeI+V(B;XvD=w-SJLRcRbGu-6y2U~JI z$SN3(#)q(VlH1KaO|;POF-A;N9ro;Z^(X9Zeb(Oa^P1>%y-o|&LSCw4b0*I(EBZ0C zo6^{lmZ=45$Q{?KfC#LF$Ks>2mQC4P zhKpSRk^ZZ=KCxeEP8XSBq3#ip9z^%Lyi=Pr0ec>bk+>dIvU!n$nQNo9TBosa1NGNGkh%4=^2@O}=g{xVgG~ zMLFsZ^Vmy3m#UgX4La$wPC$^W#!%UtT5e0l<*s&GS}t}0k8nlH`5ooJmQ{Bj-m1b3 zA)Uq78)+LS$bd&(aE;XUq87*-eI81~fbR&?v738Oi^?zET`=RxQ&x3n$r~1PW#*cQ z?|K(8m4Qm)+G7igWlpiy$EH_>_S$L|g)gqUHA^o(DEKklb(fBVK z#A#r(BKA0KG5z;J!H0x==MOYAh|sVc6s?y8akOBiM^vFRelQ?3HkK_($!%U(vCvwXR(POBUB?+PhwI!^1__9RZKWY!r6TuAuz#7@mRuN7b$to618x}SVBTb2F>q$?-44o6wcD} zNGkICuY0?${!XdWf5~D+B3X;3?f|b{Pkr4OZM;zXoS@;lj|+2U3IoEG=jJGnx!Uu6 zi;XeO;UGw$$*%6k+x(3dTw^XE2>Er(0ZDd`M0JI?J1x35mG^~#%C`f0i<}2$&7cn} z92n$3WbGiB3(%HBi)TB(M*BFDI6Q>s0q%Y|dT3L^VVsfJ6hDUyqt^&=glGIf2wuNb zr0t2^h4uYTQm&n$d0<-(WZrKqi1)M+y-0E^!?$?F95Cs*$9&)^CbE$bd6R1tHNgu> zl^*A1RCM5|BvMsAQ^cfJBYPGIm=U%3dPN%w#@y7}#0X?9tDJqrDSYwp0++$KeG|XI zaNE{D#`~8#Y7%D)!CTf|)^nBEPpzZmZ1s4BAkVUgABXQIM%8ZEx!f z%UjCeFjmHe`UXRJR#Oy!r!-;Vu6Ghq5Q`0AJNKU?2)0O<}kovGf+*`Q!Kc%}1`Zx#pp`v0^?|%LAkVT3l z&Ow>iQzf>GT8=K9c=6tN<8v>m{j|tWo&8Xk=0Bri8b?E4q~}o!XVbOGTZpedm*1{2 zc6gmU_zJU-$3gW@kA+V`$YMa zC6-3G`YU>ONmMw)aBsfZ?7nNC<+Uk=>4}5QT_I!h2MHaV#cnfUg%!H(uWKick~K7k z3(-$)NKYuvV~x?c((91|mp5q#RUg*fOcV?PvEpjOt6Fe~B9mHg2|J0#bNo0Wlq2LN zU+@cxf27w8!16>_EX%m7#o_@_$q9#|N&KMJhQ?jw-re4wfM(_$8=H8#13-#Ybcx9! z@Swf`$*K@|TDwAhKADA!E_KJZe0sGtj%7b^%ccfUgP;LYMO8-+^wS@e>8Wf^di1@# zJsLiAM!3;A5zI*W)xf%aTkxw=luHtDHIKcJMPg?=PY*u7SlOrFaKklpHCo;Ei||KU zqmfN$9a_Fk)=U7n+ud%Bw( z&=9J*lz)`=gW-5P%(4iq_hpb+uMNwp?3A&rV$aQQroxoi7v(ad+8e=)eeWTF$;&%1 zZU$ayqF&)3YKD+PJ$0c4!mgtev_H1H3PZo$bH?PQVmcItU6FsRrSnE3Z?iQAHRHh#LHy}FdP(ri~ou1>zS{yY^y5MW$J4N? z$=#T|4s1iWW1UZRCREG1YULR#>Ta|k+7^frGj;S8?PcPJ=nukH-v7M0#+QFha`Wt+ zbmu5#u`rcu&l?kc=+d`#J}a3!htx7OUTxAjsuj610O*b3F`>)MnVp23HQ}^5Yi$uW zyY9dgu{{^=U~K_1Z^IpJZ%&PnZjU7#y|lib-D$RNp)_J-%Pl8DN$LgWMl+ES^^fEz zX6C(9fc;A~g2y>+Xox%~UZ7qwW+FrwLCSz*bv}d{#1CF!(&r}yJ+n0Gl!*S)jk2|i zjf+Z9NA);==%DUw{VNpw>rZFzebyUsS+mFvM<8~gB5Eziy6sZEpJ>wzQ0EvkD}U+- zsSEWYAB>JRaN#zB4?Rme(?PhGLK_=VcccZYe%Z2VEs6h`+8N z>q5I^Ir){Xw zGC0qO;goPc1cJl~jaC}(b^uY)vxDDJXrUBUfSzu+iwa5+(Yw*o0V`r|r_H{u3O>8I z?d2WT+6=QAf~@O&U5lk_Q+K01jF7f zy*_`KzBbWi^S5f9qQMQY^O7sy-svw(O|f~dGX64Z-Oqm}O1)xEW(E6UerYAl+~X=t zo@#xQu$82CHUwPuP{&9RKZV{X#MwUy^q+dhDvOWE#9K03%1i@I`63p;zbWCN2ywKi z9u(kJlz`x(>ni9#&19){zsUwT%GJpd;4D#s?CL3BEe?{dzh2Oq6!sf93$IqCAz``& zH#C7mVRDK{Rl?#gzzDfmI$e53@0bnyfEtI6Y5`aW&$#4_FVehCmBA}Wc-RaTHxk(Z3PCmmE36{mc_ z(j}=voJc`-mz|yc#h3P)pw-jwZDd9wM^_(3F?T)lG2Df8SP8W+m~N0>01P4`qfi8( z-)v#kU)Ddev8&@Z;|i#!$dDoz)%}J0Iq;YTG)HlK+6+)VEy60H+%5an*3s^8_Jaio zV3$%i*-c02WW~uS+^N4}(&-)R6@DDpI92;Kv;Elb7}LqG$d>#@JWCU$g%sXa~5u;Pw1Q;}!IV7v$=` zz+-eXIM^E?iU-z=>U@bVKxjoWSsP1|*MKAN7S{}7PgJc2g{n}P2CI;(G>}oNJWHfl z{>vB6)){3I*xByN=MuI1=druC)tAYWd+s`W?C0ttJ_MB9OCnMDl!)QV%OaE{q#mV$ ze)NPw2yV_z2$G%)P!X_Lu_o(%opAdS;BfvWV35w`S- zF!DO=9g2?HR3yLLoQ(d3P0H5_!H4$YS^tNs;UO8B7Wj;_^ov)M&k<(-YAAzF$1re;5(CZsYi;s zbzB=@=-3*P?)p6yRXdNfYYt~Y4KX?R=^fa-by4|J-d*{W9KG|sWSA_p3V9+5x~G6W zQ$P80gJ&;px}Clu)gY)WTEKoWHb*#S@TM>$+T^T1czZ&B_oubz-#i}r*j&{kt-JJZ zUDH&aTym6;+~>Q~*|8uy_P4q_g)O*uF;Trgo2^x(zqX;WK`EuuJkFfmlq{DH+~dIc z;2-R|)fOmG3z_Y5_B|JPwBT~5x?>owPG<6_zkwkh| zB2Jw0dNN`>LGhnO02hLny#Z1F5T~+Ofe>@onpiM-pxn=s38et3fIKK4x%6l0pP&QO zjEIXr*Vr4htUMM0$>D>}KVD9({@PEY&kza#p9;m#HqMZtqu=48viA#DYQjp5C(>wk z)B2iX%h?BxXi5!3@eDUgjz=9a^G`T3gejwib(yC8NVZtv|c?`pAR`WalGNe{Yu5>RASlkplVR8fh7 zCq&1;oc9X~C?7X3za(=bNn+!V##5>;6nH8jO9K>eiOi;^(-IAZexrYUSlD?xmLpD_ zm#?A{#8=f_j*8=u5vc+>4&vTc#kYzh()0oF3EY){#=I2wKo6rnlQ`&t)$P%1C}Qy^ zXCe@2`jX8PwfW>|TQVVpXm>-5p3w{;z6#8>YRh_^U4kdE5e69=hKtj->ZU2$(zMK= zsNjwk^?*K|pE?rkVKa36qP^9-thM)@9Ji@1)w&3S{sroVW+Gl9o+u8LD*k>%03k>; zma9~>EeTJ;xT!XK9Q$a5r!ukr)7O~JG;y5b4li4l*d!Z`?CSW*ju|sn)lQ~N61wRaHWb7#=;?osisJTCl9wOwH`{!=swQW$C;pR8lF@2dE^9c88_C z=GDuJ>?45o(vg>r@Lp}5HS4;+=fk*VB5O8SRh%+A4TXRwmpnFobYp_c=B6~If3S5XcA-0X;OrXBCX$1mL`k=_)Fq>F>U>o|6olR}TKt z$$k%w4$8I)NGn`CtDgi+>HNd?yUvz$=eOat)6;yGnOQB;C*Tl79>Tr-375DWYm&fmV>A2NQXV zV7)AK9hA39g5=d}a~Uo00kE`$Fhu7uQSr+~(VL|oW)duHc<%^onG1y3xj8AqWrq@I zwtxADb;@nYO*ViHm+}f3R#=gHbd(B!Ux3m&KI)t|x#2kwE8+}dUkK#tUvQcf5i^ff z^=JT|zQrn1!N(=IC*{bChqJmG+C|T);fcICZc(PA%YbWFWMSe7Y;Vo+6L;?SWCw5Q1J5qpx09n$%*>J@0vxgqmRn@5 zd&{^R#o8VMcIC6c+jBfNK~GU*tn{PnOohK%Jd<~@x*f zP4?K^mU;#M=E73-u2tk$WyBOT;PKz*PqMda4H#%+KYl-Yi}%nETz-74{U1T=tWiPH zBmqD;^yFHZtOJrW2gBQ+fIT^wx>`9h<%Mot7n zX`EOQMUJ(J_+`o80If!vZb9|$T*oD+#YA@t?F$n3EmKjiCwexysP8}n7?t2P60DCh zq2=TNypbDnD}(*h#qF$DDPAYGpr7t6*9(XG6OR32g)ILy6Z3|MN#evY{U$*qkoZ#< zyF>Z=;q=i&{MJZun6~d&Ibh3(XOM0S&oZKw1nR(XiU?F4EMs{{jHZ{D>nRU+S~)pE zF8pU`v1{5H->YH&E!*0TqZX?GB-YR5U}TLW{KTN2H`>rXMD&g)8#I{JTM8GGydREZ z9pT|ee%(B}(aGqS7Zl*=zQ-wHKJ2Xmd-q*tN=gp;oW%T zc49pg{u)~LDq3BJO1xVBWQ>_u+07Txu1-=-WCMIE8_{Uq&r#aw8GUUr!}Y)!P#cZVX&6~Nu#5UGYmjS( zGs=IhdVtGdK~%wgS*k;T(h<{hmfpIGH~OWe*g5T0aA%2~?Ed(SNDPYaMMHUWw?ix^ zuUXa4Czs0qk&1o>PY46yrawV52|uV3PYJBb#h3;=m{Z+6 zQb&cVHE2EhR+JbrajWo!?J09~(a-D3TW69b%#ilaME1dW4Ab{VBBrFz zj<@q74quU_x!C%RsMu`&NJHTZW)2roC_2d^jc!bG(fPwRm3>0=_hL#JG(~=qj^ob- z40Q;cxz$4hxDf%47E7A-&}XGQZzyi`IrVPm&&QVrm&O~}6f->n|0^D_5i3nKmav^r zp}6o=%gI%!Rh+gR}SK+i6> zU1Y{StRKzp;*U7}C8iv4A0!)n0a5lV>RH1?{}nA1Vqf`U1u_3X$e;+@94F2{I4laJiN?3-(ea*@yp7{G zYV#q=Bb&fwKY|iyF(pZM@SFU;y|TeQZ(U{QY+K(j#O9yq;bDX}Cp|f>3<@EsSu*X! z*$my@v`m$35pzH}(k$h|kF(;$08qVB^NiS%>La~+a!YY3m(P)MQWdzD-*}4xO`|$` zZMk9&675kwSK80f)G?4FmEVdC8RYa<>och~NjA0Gd$>hNiu+_Y@VmPfi72^XOsiiq>5@N$ey za*5imQ)wh0NYmmP6M}&EJWOI&7~_+z?LmE>#8JxJzKsOxiO#~GG^V68A)0>@A>x_U zh74;I)m^-=*)#wLk%vV8C$G8vws*lVUo1C8;nBi>qJKYpttaN!^;|aU+WFAG;wfA4 zSRB7+E_5t>!dr-Z({D^!?w~Z`0m4InbO=4IO+piu;e>hEnAzcXi7a8|#8D(`mgX@h z#5P_XKLAv<4^1e+f$G>x0c?Dt&(~&;qUD9&4fYA_LBr4_B^PBj(H%TXigHdm-Q3d^ zav??T|EUS9$tIqNMp1u5rCj)1)uw1X=NRaIZaG|4(VgH~A5v{WwxIkM{p(qAz0KkMcCJKyYQ zM@0V7M+Y?nU-_b(7!kr5Q2)Ks1pFN8{kg3}Mmv$iXf_e?edK$OyZIaBnq@r_93|~} zm*1RWmr#_PySnB{uqW7iRch46E0Ivy$u;A4GCZ(eAJAgwDXo5Z2V~TRt$E zf)8e%1XAV0God!z&^I%5tfT7JIW%3!j)oj(ohU-mo>pswTXt6^26+=vUAVj70Bx^E zXTyOL-AIG3r58!>i0;^ojMoX|XjlA>QBxTtBjhB$4X*ChgmG|=?Ym53$R5M`S?O z6El>q+UrY{yTko&9_0ekggh6bR$iiM;FQt5Orm~?4;>S^WS{d1&fv%NTXKO6>i98(Pv& z$nfTrp?z_R;|yEob@d+qC7<9(FSE*_@}7HZ}Nb|aev^)UBXI}aqYn3Nt_&5 zpOcurrc!7{pz5#Bc+!h))21EMGL31OgJ1rhAkPm&r_egS--j(vICefiaM<7G{}BI` zo>APXo1R>osHC{!7@~AQsR7cE*I`Hh+qsba@GeewtX^G{>CRC>8Ev0TPIe+wX44%F}pKmAxRW~vEiRws0x zz~Ue9fEMGtR>A{Y?16SkEW9WofsuV{@#)SVVF}!892jXSrJcEnF;KR z<>mT6b`X9DrV=)mMqT|HV}pw-L)r8k@l6@T4D3amUe~jUxA`2t=xDt4#jTYWO;%!b z?8a;eLct2Jv=E(+2icO`ADvpsW~Z8Z!~GPkZ^FXgpq~k+-jk$N;axZ@`zDy1`e{@0hP^Tm`Dev5$=rcLo^p6aE-1GS&SZ??o5V`|@Oct+$oG=P+6=YT%}y zlM{xY_(jx#F#T)H|77mNFIu~kE)XW=L^7tMAHgQBcVUjZAo7jh@=d4h)z_ze16^kdZmJ^>nhdQL!7kc>hPp87Sx(&|U3nji&1o#E zdY-%7E%dTxi`D3NHg!$%1U^{W<0+1TH_44~&F>{yD&5ZlTc<&(#548wVRlJrHTC^{ zv!Z6=qQ;spOPRoI8Hq9+y_#N8?(P4R24%ldp`uZFjS^^YT4_6t0RgsR*u#6g#nML2 z_D=G)L(hnQaX`f7Uk^LqTHS{`mOgge4kRWlzHQEUG1XZUO^-5-)KZW0{XM(JNPUVj z_O`ymTj@#r6Bzd=M(8G&UR|D!u3T?nuf7SkCB?}#?>wsxNKjeNP_!@0DgOwDfm6xU zAicQuo3y0GVWa=rd~W5EG&#=_SIFEj8xKx{5nPN7MJ8FySx?C=FYd0xl*dtaHvK|I z;&-1yvKJ%n+rq<6Y9Ul;9^#cdLj1Nzhr2_G8z>Yrn#+JNxDWW>C$h_|Aop*_DYjp( zy15fgOGW%%x%J#VMYsLD7oAe$(;q+goGr|KAiwUFxTFwKi31_4oZYn29N59T#V+EX zI}wk-2Ok>&VT9L0g(>QqP8y{0P-S&#;&q)4A&sBYL}A@gz3BQFL)h=>f`yIkGKI2z zp;uJcr!=T)PtZv!&e`{?h(Uw}CvTc8n;z+>;ljwa%WR$Gl7#glT|&$94J@ucmQrWo zxTwf{==L?)tM84ykP>s%5j^Be${iY~mhYxy>!t8-E1ZjNjw{Is>FY zoFrsPg*bV{F0ubhP!kVBlY0KN6}C-U$~2*|CBmd)s&jd~UM`@I**q{IYe(71 zZ)C*T!GFjwE8l3Mla;*?IJ(871rJ^;4gCLz83pPs-GS#lVzPIM4rD1Yw8=^ZG=iah zb^X<6W4>o&^%0u`h0p~CBo#8Wx&Wm>82@7)Z@T!ess%M>YiYhkxcDcDWbHlFJ^N^v zG~U3f@ZASETO@J2sE*(}<0p6xvdkQi>?z%#)9E5%@1G0B_o(UcDh55Z( z(4KIJ!#@DJU0B7!_3C9SF8}p_Bf9g!dN%9$2b}(_6V<_jSHy( zfBhtq19#nf1^mg)N~ivW3XlvrC)INCKOKJ|7wEuh9!M%KMk@5Pp8P)dWJR-TSG_Ox zSh?4i@^C>09@fH$>Hp8;q#=d)0^XUAC)qRRh_ZdEfexsuE1^pNID~-|oA8e#P zd{lyr(UV*5-&o83O)a^8wJ+!UTZhRx;n}<*PLNHC40|(=s|fchx9f4YxcLeKv=QqY; z52|t2YgknlaIXUEi0XgHxGFI(T%g|@{_-DBVn`)3}Egz7O2WLVEx0`q)qtw<9nQVgb;ucC#C&+zwc}J|oMU*E z(2`kx6>C-A;mN!g7bJob9FX0~^4x~?RM;c_H4obu^+Y%i8^~CaLE;|Bx9}p3j&*-!|sVqU3d>>{5xj zC6Tu!dR-Rm<6m+c*7OqC7lYeqWMeELQuQ>oNy;~3WWpU}8i7|bI&hB~-J_(qBE1-W z#q-X~GO{iF+g)+gddk)3mB)gMPhgS7YhM@5$;Mf5cc55m57ZfV&)MedvjuhCUrHu| z_qL3&^A5!_d}9f#8Tw?{2S} z9eOh!UeGn1bDn(RF<2}5hu@h48x4SV5ZafL98oM9&6Ck*N8y)0gECM)8$insXm{-M z{uGl)F8_3JWqMhSevi~QjV8dnLdQUkT!-saFo!(uv{XfAlS6eAWE_s#6* zteyzofZFr$PFnC@QG&Lsu#GK|WknsUJqgbmS5q1j=pC&UckvoSNSxN#a?BOdrcC}G4`)95&VJ?A=BuM6$Z;iWrcd73;5SxD?)u9Kcw3t4#^%f}k>F~7SY-{qywlSAv~FLhy6 zjF1|F!*cLlR*A?f7bZ#3K};gziCn2bETye1SS3a;2y^J;4q3+(GU( zBt$beM0-}>V#0Fi=YsO(=I(n*Uk+aPl+_3A)NbT7ffbs9p6KP_Z{FTop}@U+gUJiS zr>fsI{n$-hx9vWyfM4e-ccfa0mHhNh9eG{LDkUR5C@E7;M{^$U7&clTVM9zZ?a=Rj zn!?0gf_NhP87P_FBgedL{pZa=b56)Dp)GhVD48JCxh&!5Es%w=^HU}S=rz$2Al8e* z8z2M0@oul14FE%42Q0fkKZHzTjn&8im)YfS(MLzY?dPOT0U%;g8*N6o99Z$m6C9eI zn3HqN)h1T@bg`dABaOypZM^3xezbJ=I%Vhy4`#h&CS=&QZx4PyCXC*(*4gtQwC{H9 z)3|*HB@_jpcDYM*rpw^wQxBG+$PA#9DCE{#8h> zekN#b>creKAwwAMc9|o)w7VmTMt(Qth;2D>yQI@J2z)(Dau~MBzMPwi#H3BydigB54K6vK)g{BAprlO zJq*0LHJW~5rNjO{GdN;siIE>;fmw<&nCjvfKZ8h6Ld{Aq(mt^tY`X^9koUfw|KTD; z@*+%+&%K71x+}EIY(JZ0d^XP*KNmsyw}f%p9-1;?$Bv_# z$h%9fgx~v;F>%x~e(p0QLKGkS565EA5JIVUtE1B9Udyn87yKB5xlr%h>FX%rl6v?k zJiU0O9A0x6-vIDNk3Amz(1!ids{@=H&2!Ir!rC^sLt@XAt5ZWvl^iJa*=ZB*mRrQH z_DFrzd|meOKM`F|?PtlMfw56PDlhAY@axwv)p6AKZ!~`n`e6rcopAc;9dTQk=Y~TL zKCSMgrp#~CA6-ozDI3dki`nbv2mx`5s| z-}4QtPhSjaWQx36lw2>UmHjHEFvKh4oj*S+iR37|CLW&Y0I^68lbVf)R>%dA*xPBz z>5*s#6UJ)NG^EW8SeNeqmsS6X-rN@`3xakdO4wd%)yp*!5lQeniG+OWI!38rf+Pkm zamX6L<_5+k=si$55M=TsU8Iei+lf;MI%#PM{9X6d^poX}pPnGZloqsjk+E1{Ya0hk z$OG9}PQTBTX$Kx=m5g=2+5SLL1@2z`Kj z%o62N)At%REY5})_l|w!0B2YSUTdJp>d8PnPWL12E;{5pr_ROap#j7_<9g)Ud=U;*JkYc`ErjEG4wglamd*P@~k6KKW+*lYH8p4zZra8?9 zJEXZ22K_>D#io3=u}vaol(1r}w~gw}QW!h-B5PE~3t5KYYaF5k`*dw{;hiE-LsG3A1=0WH-m4s>WW%eEQxO-vcF(Ax`lw(iz{yh zS-Y^RR&t#Q>0S!aO!6ouaOn9K>TPt@DmdOYiEaIfS%Bq-&8p3gTZlZ9XKixFm0NEU znsr{!*+0o4U3b49HnJ_Vn{b5;JPO(#9mRU+ZU9!iX9{j22Y>D3ts9h(CFPx!j7y`} zENQ`*4IW7B)MD7#Mj}s7oJkQ2e!}v}FjC(7y34v?*4xjZDc^)%2d9G7m{EbQiG}9& zPZjH{fd^gQ{Kj{hR)0hde;2)HW5r@~ha;C4Yukvu}a_RhQI<-@cZe0O+xI;eap`n^_$<@ z$cVz0&L%!-OR9{xk-PhZu=(%gJ)&I!t*Kvl?yIQ%+uZ59S z8{utji%(|un)1D@<4}K{(mI~Hhgr8?Or72z#rTA@$W31J#YBzHvyll)NnDiq1M*ha z)~BDAs!aY02a?EAIGaOq59RJWN=we-h$%3vagP32{^4U{yk^C8ynSVK$fJ>pOZ1)2B`3B_UZ9T)s$p)D&_k0eE64sf!@PSRQXUI#1rHqCL(otvzL#T}QH zwiXMy8>h6u(w_6MCOJ~;Iah_*HsqOb*!lfM#>ric_ay5fU$mozTL*=$eAjBRDK$|W z#@O0TXg=%p`&-L^#n1JxULGO~v-CqBTxN1IlKD@^n+lDEc(``on94~^Kj2%lG#Gt2 z8^_T?5g-unK|Z1_`YR=VdpII;g9vkC)S349pl4+iK&TJ_*djIn-P6MM&l0XkPMXO> zk6@d@I1s&X#ACXxyY|raxMw|^Z5=$(M(V%z>93X}e}3^galZ}pJh^M*+ch{Zo}Xko zFCM4FsWU2s-F|yixG2KwaAp`Qcz>g4vp*Rl@By%z1))co2*M?ZP7E#QE?yTc+=R-6 z9P74pVCIa!aKCI2vdiXPd+jPU)zs*^HtsK5@w)8QX;WnZ{>kf{$8R!+Z4-7me|px_ z1-&dKjy9uuyt`$-s0`n0_+R8mK!M;N#204~1IumcZBvaP-F2{-UbtFnbY(objNp%1 zvF1CnWtq;^kL>1uPJyh?Cp`l%h({xPN^8R|J9^G#XA661$whRc068S{{=iytr2 zmQTMTXI!Pn!)IV}!t*r2>+UEMD(oE?ZCFwAOBri7=b%XB!rb3><{?bAYh#j5e1mwi zCgrc&{a`u*I{M zG!OSO*N&Le8kfbVr$S5rue>Y&hH?SJ-z=B0&xDB>XN-(3WV>C{X^!Qa;;Jwg8CgQb zFqz5Lq$!`VG|9EzvYuirF_sLfgUgwi%92pJmWoEyC`~SfEXSSh{WI?K!}Ig|p7XrV z^ZxX{txsF}Xipd<{sN)YGWH;c`17T;t=Mmq-9cTGce=(SC<}rq-!?ObpY+*SBC*4v zPEYfd4kJA317$G~96ok+g+K3t(L0w&6P%;Q=C{k5MNO#pO-1Lg1!E&GE8dO~F}1~U zo7(`pPvhU#ILoP`>v6D|l#{q(SO5o1#@OJfm zTuxF13=LP}r71UMTVv_OzrfRe6Q>CWDU&4=enVCcXToh6%B;`;Yh;VJS>dC_=TvKB zVfws!ut^Sm&%iG<$}7hJ<&6U09ml4eZ(T9p<0f)oklgUEgm?bXlln{-$@=XOqR%t? z)Td4_{a~B{vK(~AsV2x){6FshnvJQ>aSWZr4BCfetaX7_gw0@i?QsjEg=YTX`g1$1 zAsG}G={lt3>pB=)YL>`8>edm3_}h}<#*NA42mnt|fINRg zv1te1qDLg~`|T=?2-R$^(=}ZOk|5Ne+%^54O`w8zRulQ`I^0mD(4W0}#szE8?KCHy zy`H7x65GeK$$Qjm0eB4M=P5W*sq>ZUPBm`94}Q{b_PSwZhU3Q2?Z61{Vr|>viQ|R^ zqC`Q9#fYVkNtH}>!kJ-iTHsOYG1i|#Qz;>pph(Cdt*$Rkep`2OqGWd3)`VbZA=yIZ zKdp0=xuUpM*v!>iTG9=Jukna_qlTj=m};jk;!q?3%+);Vw4N3<$R=YG$g@GZCS~Q> zfRA%`IoM_J^r3ytrUtZJx{{8qHoHX|0AML+Gt-DJpuSh((<|D@Up4z_)Y77-=A>xp zAKXdMWT7aojdt+ty|O{C5BFUyM5@jYGKrZoHJRO?mJ-jY?F%XFFE-2bm$v_P^{<2C zS3vT1u|>+A&#N58zN<`EgEtxa)6UPBcm`KsxT@dn9r=b|+M8>dAS%12bZz!f)T(d_ z;u}ZX*YRtM0~-0_xzr;68Vwr1yaFlqdJPYq<=2g5p?Ty2Z+L!*U?C4H&;>|fXLX`Z zU~X$wg15a}Vu9_MVJk!josMd=iadAW-T-sFe!C-m6W(nnhQ0l8QVi!kVdDQLFE_rc zAK#po2yXvK_!qkHrtvp`0dW@-p^?Ig*Na`39dX8A0dT6qc9jrfM@(oT;;Hh{%l37q zg8g5-E3=52nW~MoB5H$MPtqu1R1NLnaD%l1(Y4(Jhk>-@wr5t@rR)Z5wc#;I9ZOBc zGzox}?>4&?8B~=B97;$Wt@x%8q7`4iBxNy|$UWm0>#Hc?v>_?jbZf?$%!WAYYs1(p z*kl4fgl0Tzw7!@9ogP z79pZ6YT2!TeSmL2(JSw$oB7=2-U*l+p2A8%K`+sCNw$8*)aApq_?`$)J&x%Ti|xaH zL*VyZPRrSi3K2cv`kT$ZMn6yv+d+Mw4xihYehJN_Dq71{T9RVX0$k19=qTF+dJ?%5kvC%Lq5 literal 0 HcmV?d00001 diff --git a/mods/d2k/voices.yaml b/mods/d2k/voices.yaml new file mode 100644 index 0000000000..414c92fec5 --- /dev/null +++ b/mods/d2k/voices.yaml @@ -0,0 +1,13 @@ +# Classic Red Alert Mod -- Package Manifest + +GenericVoice: + Variants: + atreides: .v01,.v03 + harkonnen: .v01,.v03 + ordos: .v01,.v03 + +VehicleVoice: + Variants: + atreides: .v00,.v02 + harkonnen: .v00,.v02 + ordos: .v00,.v02 diff --git a/mods/default/bogus.tem b/mods/default/bogus.tem deleted file mode 100644 index db18593048cc571b13781f323f9c715cab3f15ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 wcmb1OkYHeBU;tu9hHNGV1`Qw^1bX<3buxkcEFjJRV*61r8UhrA00RRD00@kc3;+NC diff --git a/mods/default/chrome.xml b/mods/default/chrome.xml deleted file mode 100644 index 9ccee19185..0000000000 --- a/mods/default/chrome.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mods/default/cursors.xml b/mods/default/cursors.xml deleted file mode 100644 index 9d522a9009..0000000000 --- a/mods/default/cursors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mods/default/dialog.png b/mods/default/dialog.png deleted file mode 100644 index b7047caefa56fedf5d77aac078a6892db4805055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19241 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 diff --git a/mods/default/maps/shellmap/map.bin b/mods/default/maps/shellmap/map.bin deleted file mode 100644 index 35529fcc670a3ee4830f85c26e6159f7b4c260c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81925 zcmeIuF#!Mo2m_$me9g6n2Si|+W-(yEfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0Rs;Pf&l{t3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ T0|pEjFkrxd0RsjM7%-3n_L@vH diff --git a/mods/default/maps/shellmap/map.yaml b/mods/default/maps/shellmap/map.yaml deleted file mode 100644 index 6d94b3360b..0000000000 --- a/mods/default/maps/shellmap/map.yaml +++ /dev/null @@ -1,15 +0,0 @@ -Selectable: False -MapFormat: 2 -Title: Default Shellmap -Description: A default empty map to use when no custom shellmap is wanted -Author: alzeih -PlayerCount: 0 -Tileset: DUMMY -MapSize: 128,128 -TopLeft: 16,16 -BottomRight: 112,112 -Players: -Actors: -Waypoints: -Smudges: -Rules: diff --git a/mods/default/maps/shellmap/preview.png b/mods/default/maps/shellmap/preview.png deleted file mode 100644 index b5681e16e5b6edb6cafc07e986feea84780633b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 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

S=YJMhbiL96^9H#Fc<40M|;JFy11FRp@LpB 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 diff --git a/mods/palettetest/mcv.yaml b/mods/palettetest/mcv.yaml deleted file mode 100644 index 282a4952b3..0000000000 --- a/mods/palettetest/mcv.yaml +++ /dev/null @@ -1,13 +0,0 @@ -MCV: - RenderUnit: - PlayerPalette: d2kplayer - -Player: - PlayerColorPalette@d2k: - BasePalette: d2k - BaseName: d2kplayer - PaletteFormat: d2k -World: - PaletteFromFile@d2k: - Name: d2k - Filename: d2k.pal \ No newline at end of file diff --git a/mods/palettetest/mod.yaml b/mods/palettetest/mod.yaml deleted file mode 100644 index 202f76d3e8..0000000000 --- a/mods/palettetest/mod.yaml +++ /dev/null @@ -1,11 +0,0 @@ -Metadata: - Title: Player Palette Test - Description: Replaces the mcv artwork with the d2k mcv - Version: a0001 - Author: The OpenRA Developers - Requires: ra - -Folders: - mods/palettetest -Rules: - mods/palettetest/mcv.yaml \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh new file mode 100755 index 0000000000..d8980e2425 --- /dev/null +++ b/ripD2kGameFiles.sh @@ -0,0 +1,267 @@ +#!/bin/bash +R8="/home/matthias/.openra/Content/d2k/DATA.R8" +PAL="mods/d2k/bits/d2k.pal" + +mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" +mono OpenRA.Utility.exe --shp spice.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 206 457 "rifleinfantry" --infantry +mono OpenRA.Utility.exe --shp rifleinfantry.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 458 693 "rocketinfantry" --infantry +mono OpenRA.Utility.exe --shp rocketinfantry.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 694 929 "fremen" --infantry +mono OpenRA.Utility.exe --shp fremen.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 930 1165 "sardaukar" --infantry +mono OpenRA.Utility.exe --shp sardaukar.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1166 1221 "engineer" --infantry # death animation 1342..1401 +mono OpenRA.Utility.exe --shp engineer.png 48 +#rifleinfantry repetitions? +mono OpenRA.Utility.exe --r8 $R8 $PAL 1402 1502 "thumper" --infantry #death animations 1543..1602 +mono OpenRA.Utility.exe --shp thumper.png 48 +#rifleinfantry repetitions? +mono OpenRA.Utility.exe --r8 $R8 $PAL 1603 1634 "missile" --vehicle +mono OpenRA.Utility.exe --shp missile.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1635 1666 "trike" --vehicle +mono OpenRA.Utility.exe --shp trike.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1667 1698 "quad" --vehicle +mono OpenRA.Utility.exe --shp quad.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1699 1730 "harvester" --vehicle +mono OpenRA.Utility.exe --shp harvester.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1731 1762 "combata" --vehicle +mono OpenRA.Utility.exe --shp combata.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1763 1794 "siege" --vehicle +mono OpenRA.Utility.exe --shp siege.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1795 1826 "mcv" --vehicle +mono OpenRA.Utility.exe --shp mcv.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1827 1858 "sonic" --vehicle +mono OpenRA.Utility.exe --shp sonic.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1859 1890 "combataturret" --vehicle +mono OpenRA.Utility.exe --shp combataturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1891 1922 "siegeturret" --vehicle +mono OpenRA.Utility.exe --shp siegeturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1923 1954 "carryall" --vehicle # requires some reordering (again) +mono OpenRA.Utility.exe --shp carryall.png 64 +mono OpenRA.Utility.exe --r8 $R8 $PAL 1955 2050 "orni" --vehicle +mono OpenRA.Utility.exe --shp orni.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2051 2082 "combath" --vehicle +mono OpenRA.Utility.exe --shp combath.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2083 2114 "devast" --vehicle +mono OpenRA.Utility.exe --shp devast.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2115 2146 "combataturret" --vehicle +mono OpenRA.Utility.exe --shp combataturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2147 2148 "deathhandmissile" +mono OpenRA.Utility.exe --shp deathhandmissile.png 24 +#rifleinfantry repetitions? +mono OpenRA.Utility.exe --r8 $R8 $PAL 2245 2284 "saboteur" --infantry #death animations 2325..2388 +mono OpenRA.Utility.exe --shp saboteur.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2389 2420 "deviator" --vehicle +mono OpenRA.Utility.exe --shp deviator.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2421 2452 "raider" --vehicle +mono OpenRA.Utility.exe --shp raider.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2453 2484 "combato" --vehicle +mono OpenRA.Utility.exe --shp combato.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2485 2516 "combatoturret" --vehicle +mono OpenRA.Utility.exe --shp combatoturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2517 2517 "frigate" --vehicle +mono OpenRA.Utility.exe --shp frigate.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2518 2520 "heavya" --building #2518 is only the gate +mono OpenRA.Utility.exe --shp heavya.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2521 2522 "radara" --building +mono OpenRA.Utility.exe --shp radara.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2523 2524 "pwra" --building +mono OpenRA.Utility.exe --shp pwra.png 64 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2525 2526 "barra" --building +mono OpenRA.Utility.exe --shp barra.png 80 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "wall" --building +mono OpenRA.Utility.exe --shp wall.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2559 2560 "conyarda" --building +mono OpenRA.Utility.exe --shp conyarda.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2561 2563 "refa" --building # 2561 is fassade, 2562 is silo top, 2563 is silo top broken +mono OpenRA.Utility.exe --shp refa.png 120 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2564 2565 "hightecha" --building +mono OpenRA.Utility.exe --shp hightecha.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2566 2570 "siloa" --building +mono OpenRA.Utility.exe --shp siloa.png 32 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 2673 2675 "lighta" --building +mono OpenRA.Utility.exe --shp lighta.png 96 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 3549 3564 "sandwormmouth" +mono OpenRA.Utility.exe --shp sandwormmouth.png 68 +mono OpenRA.Utility.exe --r8 $R8 $PAL 3565 3585 "sandwormdust" +mono OpenRA.Utility.exe --shp sandwormdust.png 68 +mono OpenRA.Utility.exe --r8 $R8 $PAL 3586 3600 "wormsigns1" +mono OpenRA.Utility.exe --shp wormsigns1.png 16 +mono OpenRA.Utility.exe --r8 $R8 $PAL 3601 3610 "wormsigns2" +mono OpenRA.Utility.exe --shp wormsigns2.png 16 +mono OpenRA.Utility.exe --r8 $R8 $PAL 3611 3615 "wormsigns3" +mono OpenRA.Utility.exe --shp wormsigns3.png 16 +mono OpenRA.Utility.exe --r8 $R8 $PAL 3616 3620 "wormsigns4" +mono OpenRA.Utility.exe --shp wormsigns4.png 16 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 3679 3686 "sell" +mono OpenRA.Utility.exe --shp sell.png 48 +#explosions and muzzle flash + +mono OpenRA.Utility.exe --r8 $R8 $PAL 4011 4011 "infrantryicon" +mono OpenRA.Utility.exe --shp infrantryicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4012 4012 "bazookaicon" +mono OpenRA.Utility.exe --shp bazookaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4013 4013 "engineericon" +mono OpenRA.Utility.exe --shp engineericon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4014 4014 "thumpericon" +mono OpenRA.Utility.exe --shp thumpericon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4015 4015 "sadaukaricon" +mono OpenRA.Utility.exe --shp sadaukaricon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4016 4016 "trikeicon" +mono OpenRA.Utility.exe --shp trikeicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4017 4017 "raidericon" +mono OpenRA.Utility.exe --shp raidericon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4018 4018 "quadicon" +mono OpenRA.Utility.exe --shp quadicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4019 4019 "harvicon" # = 4044 +mono OpenRA.Utility.exe --shp harvicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4020 4020 "combataicon" +mono OpenRA.Utility.exe --shp combataicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4021 4021 "combathicon" +mono OpenRA.Utility.exe --shp combathicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4022 4022 "combatoicon" +mono OpenRA.Utility.exe --shp combatoicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4023 4023 "mcvicon" +mono OpenRA.Utility.exe --shp mcvicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4024 4024 "missileicon" +mono OpenRA.Utility.exe --shp missileicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4025 4025 "deviatoricon" +mono OpenRA.Utility.exe --shp deviatoricon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4026 4026 "siegeicon" +mono OpenRA.Utility.exe --shp siegeicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4027 4027 "sonicicon" +mono OpenRA.Utility.exe --shp sonicicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4028 4028 "devastatoricon" +mono OpenRA.Utility.exe --shp devastatoricon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4029 4029 "carryallicon" # = 4030 +mono OpenRA.Utility.exe --shp carryallicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4031 4031 "orniicon" # = 4062 +mono OpenRA.Utility.exe --shp orniicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4032 4032 "fremenicon" # = 4033 +mono OpenRA.Utility.exe --shp fremenicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4034 4034 "saboteuricon" +mono OpenRA.Utility.exe --shp saboteuricon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4035 4035 "deathhandicon" +mono OpenRA.Utility.exe --shp deathhandicon.png 60 +# 4036..4045 = repetitions +mono OpenRA.Utility.exe --r8 $R8 $PAL 4046 4046 "conyardicona" # = 4049 +mono OpenRA.Utility.exe --shp conyardicona.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4047 4047 "conyardiconh" +mono OpenRA.Utility.exe --shp conyardiconh.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4048 4048 "conyardicono" +mono OpenRA.Utility.exe --shp conyardicono.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4050 4050 "4plateicon" # = 4051..4052 +mono OpenRA.Utility.exe --shp 4plateicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4053 4053 "6plateicon" # = 4054..4055 +mono OpenRA.Utility.exe --shp 6plateicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4056 4056 "pwraicon" +mono OpenRA.Utility.exe --shp pwraicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4057 4057 "pwrhicon" +mono OpenRA.Utility.exe --shp pwrhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4058 4058 "pwroicon" +mono OpenRA.Utility.exe --shp pwroicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4059 4059 "barraicon" +mono OpenRA.Utility.exe --shp barraicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4060 4060 "barrhicon" +mono OpenRA.Utility.exe --shp barrhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4061 4061 "barroicon" +mono OpenRA.Utility.exe --shp barroicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4063 4063 "wallicon" # = 4061..4062 +mono OpenRA.Utility.exe --shp wallicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4066 4066 "refaicon" +mono OpenRA.Utility.exe --shp refaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4067 4067 "refhicon" +mono OpenRA.Utility.exe --shp refhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4068 4068 "refoicon" +mono OpenRA.Utility.exe --shp refoicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4069 4069 "turreticon" # = 4070..4071 +mono OpenRA.Utility.exe --shp turreticon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4072 4072 "radaraicon" +mono OpenRA.Utility.exe --shp radaraicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4073 4073 "radarhicon" +mono OpenRA.Utility.exe --shp radarhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4074 4074 "radaroicon" +mono OpenRA.Utility.exe --shp radaroicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4075 4075 "rturreticon" # = 4076..4077 +mono OpenRA.Utility.exe --shp rturreticon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4078 4078 "hightechaicon" +mono OpenRA.Utility.exe --shp hightechaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4079 4079 "hightechhicon" +mono OpenRA.Utility.exe --shp hightechhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4080 4080 "hightechoicon" +mono OpenRA.Utility.exe --shp hightechoicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4081 4081 "lightaicon" +mono OpenRA.Utility.exe --shp lightaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4082 4082 "lighthicon" +mono OpenRA.Utility.exe --shp lighthicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4083 4083 "lightoicon" +mono OpenRA.Utility.exe --shp lightoicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4084 4084 "siloaicon" +mono OpenRA.Utility.exe --shp siloaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4085 4085 "silohicon" +mono OpenRA.Utility.exe --shp silohicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4086 4086 "silooicon" +mono OpenRA.Utility.exe --shp silooicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4087 4087 "heavyaicon" +mono OpenRA.Utility.exe --shp heavyaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4088 4088 "heavyhicon" +mono OpenRA.Utility.exe --shp heavyhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4089 4089 "heavyoicon" +mono OpenRA.Utility.exe --shp heavyoicon.png 60 +# 4090 = orniicon +# 4091 = heavyhicon +mono OpenRA.Utility.exe --r8 $R8 $PAL 4092 4092 "starportaicon" +mono OpenRA.Utility.exe --shp starportaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4093 4093 "starporthicon" +mono OpenRA.Utility.exe --shp starporthicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4094 4094 "starportoicon" +mono OpenRA.Utility.exe --shp starportoicon.png 60 +# 4095 = orniicon +mono OpenRA.Utility.exe --r8 $R8 $PAL 4096 4096 "repairicon" # = 4097..4098 +mono OpenRA.Utility.exe --shp repairicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4099 4099 "researchicon" # = 4100..4101 +mono OpenRA.Utility.exe --shp researchicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4102 4102 "palaceaicon" +mono OpenRA.Utility.exe --shp palaceaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4103 4103 "palacehicon" +mono OpenRA.Utility.exe --shp palacehicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4104 4104 "palaceoicon" +mono OpenRA.Utility.exe --shp palaceoicon.png 60 +# 4105 = orniicon +# 4106..4107 = radaraicon +# 4108 = conyardaicon +mono OpenRA.Utility.exe --r8 $R8 $PAL 4109 4150 "conmake" --building +mono OpenRA.Utility.exe --shp conmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4151 4174 "wtrpmake" --building +mono OpenRA.Utility.exe --shp wtrpmake.png 64 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4175 4194 "barramake" --building +mono OpenRA.Utility.exe --shp barramake.png 80 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 4231 4253 "refmake" --building +mono OpenRA.Utility.exe --shp refmake.png 120 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 4274 4294 "highmake" --building +mono OpenRA.Utility.exe --shp highmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4275 4312 "lightmake" --building +mono OpenRA.Utility.exe --shp lightmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4313 4327 "silomake" --building +mono OpenRA.Utility.exe --shp silomake.png 32 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 4436 4449 "cranea" +mono OpenRA.Utility.exe --shp cranea.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4450 4463 "craneh" +mono OpenRA.Utility.exe --shp craneh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4463 4477 "craneo" +mono OpenRA.Utility.exe --shp craneo.png 96 + +mono OpenRA.Utility.exe --r8 $R8 $PAL 4760 4819 "windtrap_anim" --building #? +mono OpenRA.Utility.exe --shp windtrap_anim.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4820 4840 "missile_launch" +mono OpenRA.Utility.exe --shp missile_launch.png 96 + +mv *.shp mods/d2k/bits \ No newline at end of file From 66f82c6c2a0a2b97a433495200172f38dde5a3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Tue, 22 May 2012 21:02:25 +0200 Subject: [PATCH 02/36] added harvester, trike/quad now working, fixed mod inheritances RenderCargo: works, moved R8Reader to Utility namespace --- AUTHORS | 2 + OpenRA.FileFormats/OpenRA.FileFormats.csproj | 1 - OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj | 8 +- OpenRA.Utility/OpenRA.Utility.csproj | 1 + .../Graphics => OpenRA.Utility}/R8Reader.cs | 8 +- mods/d2k/bits/d2k.pal | Bin 0 -> 768 bytes mods/d2k/maps/blank.oramap | Bin 572 -> 0 bytes mods/d2k/maps/test.oramap | Bin 752 -> 878 bytes mods/d2k/mod.yaml | 52 +---- mods/d2k/rules/aircraft.yaml | 4 +- mods/d2k/rules/structures.yaml | 2 +- mods/d2k/rules/system.yaml | 184 +++++++++++++++++- mods/d2k/rules/vehicles.yaml | 84 +++++--- mods/d2k/sequences.yaml | 15 ++ ripD2kGameFiles.sh | 4 +- 15 files changed, 270 insertions(+), 95 deletions(-) rename {OpenRA.FileFormats/Graphics => OpenRA.Utility}/R8Reader.cs (94%) create mode 100644 mods/d2k/bits/d2k.pal delete mode 100644 mods/d2k/maps/blank.oramap diff --git a/AUTHORS b/AUTHORS index 2b8f0e1bc5..1cc92b954c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -12,6 +12,7 @@ The OpenRA developers are: Also thanks to: * Akseli Virtanen (RAGEQUIT) * Andrew Riedi + * Barnaby Smith (mvi) * Bellator * Christer Ulfsparre (Holloweye) * Erasmus Schroder (rasco) @@ -22,6 +23,7 @@ Also thanks to: * Lawrence Wang * Mark Olson (markolson) * Matthew Gatland (mgatland) + * Matthias Mailänder (Mailaender) * Max Ugrumov (katzsmile) * Max621 * Nukem diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj index 0b4c08eacf..f97116332b 100644 --- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj +++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj @@ -81,7 +81,6 @@ - diff --git a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj index 47617a3870..42540d4f24 100644 --- a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj +++ b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj @@ -82,7 +82,9 @@ - - - + + mkdir "$(SolutionDir)mods/d2k/" +copy "$(TargetPath)" "$(SolutionDir)mods/d2k/" +cd "$(SolutionDir)" + \ No newline at end of file diff --git a/OpenRA.Utility/OpenRA.Utility.csproj b/OpenRA.Utility/OpenRA.Utility.csproj index 0c4ed1da40..0beb4c89d7 100644 --- a/OpenRA.Utility/OpenRA.Utility.csproj +++ b/OpenRA.Utility/OpenRA.Utility.csproj @@ -54,6 +54,7 @@ + diff --git a/OpenRA.FileFormats/Graphics/R8Reader.cs b/OpenRA.Utility/R8Reader.cs similarity index 94% rename from OpenRA.FileFormats/Graphics/R8Reader.cs rename to OpenRA.Utility/R8Reader.cs index d7a9be4b47..4901d9cc5e 100644 --- a/OpenRA.FileFormats/Graphics/R8Reader.cs +++ b/OpenRA.Utility/R8Reader.cs @@ -1,10 +1,12 @@ #region Copyright & License Information /* - * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, - * see LICENSE. + * see COPYING. + * It also incorporates parts of http://code.google.com/p/dune2000plusone + * which is licensed under the BSD 2-Clause License. */ #endregion @@ -14,7 +16,7 @@ using System.Drawing; using System.IO; using System; -namespace OpenRA.FileFormats +namespace OpenRA.Utility { public class R8Image { diff --git a/mods/d2k/bits/d2k.pal b/mods/d2k/bits/d2k.pal new file mode 100644 index 0000000000000000000000000000000000000000..be445309b50a8ac75b0963ec4c811b2b8c4e3631 GIT binary patch literal 768 zcmWlXZS!(K9EJ6hrNxS+u#`MRdHRQ>C4K*Ib$6dRFRoW-=9)Qz@IOm&-vh#cj2*!e zMu4bBmwx&1b!Zm=nGm8Vdr4BM9Y}Jb>Bk*;dcHqSbNikp%Mn#g$+9Eo(m0-q;=Qhq zu1nGs5IRPuz2`jn6Ry7{c&~490FjAcKr^LvQ>jEMo71h_BLwRwCIoXn@i$5?;%BMW zrGHisxZ8CK_!z&(>)6G-^TzJFzOJq%1-`v5{CRg`rfV4SM{HXMskTn4tg1#3_D%c0%=nKpjPN8r>ex5}wox9);J0FWd}Q502G z4a2Z)+jZR_2%;!Tk|fXbvMk%S?YeFp$7z~&qM(X`fxtvSWjOwdw+u^XEJZ|0^j&W4 z?v7SETI*@!CA9J8plv(@m<6E&(Gg-FvH^@TOow08o`~!alQYHWZ literal 0 HcmV?d00001 diff --git a/mods/d2k/maps/blank.oramap b/mods/d2k/maps/blank.oramap deleted file mode 100644 index c826e5a14ef87d47de68a9a0dc08481e052f3023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmWIWW@Zs#U|`^2*fnpH1BXdtbuy60>cGgr4y1Dv3-ppQ^WGjbWMp9AVN$q$=f&!W zj4_viQq%++9x?`?xZ_OlRSsUDl{IlcXke$0kEuGhb67B%EKFdbYY z(KSIJ%h9-X-Cap%=6NX{vI~pk@(vv>xWy%wGePF*Z|l0UsH9gS*L|k$b`xWo@wh_v zazoTk;fAHxgQAVw!W*HQ3><(XQ2auMHmRr3cN0qJ*-gzU6jm1on%c|Lyr!sQ_z zK2C0HXD{2gH?w?l)c?dUiyv=ZDcf**hO>U!96#N2-V8PzS1;vt+-wWUo4F}>=bgT5 z7TphZCuUs|=4C=e-FLYZQQ`0GtM+yzinW_+ zvHdlaezS&mrtQi2e>#G_pStfq|DWV|H&e&k+4{-9nO#{%@83;(lYUIU%GKgnz?I}L w)~}@lycwB{8E{7)Y79Z65?vE|NFy|LAccE?H!B-Rh6xC>f%I-*yf82T08Xo{uK)l5 diff --git a/mods/d2k/maps/test.oramap b/mods/d2k/maps/test.oramap index 59873cda667acf4c1f98980b55994ea8d275c1fe..d97a361db95e889e6125a526de7d228c823abd71 100644 GIT binary patch literal 878 zcmWIWW@Zs#U|`^2NZhp5;gQ4pJ$j4`46F`}4D3MB+{6OCq|CgxcdhddJMg#$T6KOl z%w2!eoBxu4T!O*eHpUvhkQH@WdLbXbbhrc61HqH~#pibD#H}fL@^5+1`JR|P5id{t zy>GP7XkE9sw(QRT)yK+@<$g?Bs{H-`i619-=*O*DvVZ->`%(WE?U((#HhZtm~P-MRPb zrh3`iMb)cQ|66T)`Yr7AztWu3Z`a=Ycg{IyQS9Hj?KfO@|FY)a*je_qTrNrY?W^}T zN7QcJyRV3wWWux(Q>39IJ^&?1P2R|UEdd6pCNn6IAwgQ1n47aT$lDJXrm@$TpJ3dS z!4)z=bYTFeBcm$oH8sPMB|i-xb4>kQAgtFmS)}WSN6v&alW&{n&p&P~nz>5yy~)#) zMq5}mIM|mTRCs<;?m$qX{Gt;K$3pY4#*( z{QZ?A%@r%_J8?-`;IyMRGq1i5c@>$JKKXBm*@21Kxx%b7mTltO#abY{vg2yk7O{yo zGZ*(=dQ$YZ)w1~8#<$kHFYQ<+P%Ob4=J{RZ#I=$NM_u+SLXxoy1TV1({Qq?FShRS_ z=AFAzEUb&4@k#2|H>h57a^_ni)pcJ~Y;Bt9JuaSoJ7OO#KiTJYyrf@fjRdpy?}A*> znn9XC(Hr2+$_A2Q0>W${ I{T7^h0Ho7mFaQ7m literal 752 zcmWIWW@Zs#U|`^2I9RmV;r@#I?x%n}RtH7~b|9UbSfH1bnfLa(CEsBK9u^0y@;%$` zzgfYX+gpAQa!<*Z;r% ze-;0K{r_+;unm+E2lRh31fY2Lj{3a4QH%@>WlW#|fOxkuF*m0-(A)2@15a$apCS8; zMY>FmVJ*|VIHCeBUD`T($6Jrj$;Sdi&mH#NA>kLq!6fD(e6;R--TB9w0m+^lF3vcW zx+1W{^2bbWHjSyzopeOEins|Sb#3H1HMz)aYM|u$Kq2Ex4dP0xGv7ODJ$Kj=E?^n( z>+jhx2`SlL!ARrNpWpmjmr=|0_0+A!AD=eZE9S-Iu0C<#Xv6u?;+6>4Gf5lW*WOf_ zYJ6d0dyJfIx!;`HmA6mMGm$Yo5~312<*^v^Eur<|5y1>+eKs*1_Em5Ae7w0gTfC%n zmsPlhbzvGa%d~w5WW4g2xmIZP?3aDERn7Db@2)wQmwmXMHaVp$I$@In$C5XBsiH^a z%`9)6lJv{hm1_0zXIk|C@V3L%x6kkTAG_$feXsVWNin+*nn^6X^y9_Dgq`0GPQ76J z>qm}(T Date: Tue, 22 May 2012 22:17:48 +0200 Subject: [PATCH 03/36] fixed vehicles driving backwards also fixed the bazooka for quad --- OpenRA.Utility/Command.cs | 31 +++++-------------------------- mods/d2k/bits/mcv.shp | Bin 75230 -> 0 bytes mods/d2k/rules/structures.yaml | 14 +++++++------- mods/d2k/rules/vehicles.yaml | 2 +- ripD2kGameFiles.sh | 2 +- 5 files changed, 14 insertions(+), 35 deletions(-) delete mode 100644 mods/d2k/bits/mcv.shp diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index f398117cb1..51ebff6a9d 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -123,14 +123,14 @@ namespace OpenRA.Utility int x = 0; - if (args.Contains("--vehicle")) //complex resorting to RA/CnC compatible frame order + if (args.Contains("--vehicle")) //resorting to RA/CnC compatible counter-clockwise frame order { - endFrame = endFrame - (FrameCount / 2); + frame = srcImage[startFrame]; + + endFrame--; startFrame--; for (int f = endFrame; f > startFrame; f--) { - frame = srcImage[f]; - OffsetX = frame.FrameWidth/2 - frame.OffsetX; OffsetY = frame.FrameHeight/2 - frame.OffsetY; @@ -147,29 +147,8 @@ namespace OpenRA.Utility bitmap.UnlockBits(data); x += frame.FrameWidth; - } - endFrame = endFrame + (FrameCount / 2) - 1; - startFrame = startFrame + (FrameCount / 2) + 1; - for (int f = endFrame; f > startFrame; f--) - { + frame = srcImage[f]; - - OffsetX = frame.FrameWidth/2 - frame.OffsetX; - OffsetY = frame.FrameHeight/2 - frame.OffsetY; - - Console.WriteLine("calculated OffsetX: {0}", OffsetX); - Console.WriteLine("calculated OffsetY: {0}", OffsetY); - - var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, - PixelFormat.Format8bppIndexed); - - for (var i = 0; i < frame.Height; i++) - Marshal.Copy(frame.Image, i * frame.Width, - new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); - - bitmap.UnlockBits(data); - - x += frame.FrameWidth; } } else diff --git a/mods/d2k/bits/mcv.shp b/mods/d2k/bits/mcv.shp deleted file mode 100644 index 68b0a1fb47be211963192777b7c4861dfe6c90c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75230 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 e^j^zfU|Bve*%hu(?PN*- diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 5483a3b75f..857f61b73a 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -45,8 +45,8 @@ PWRA: Prerequisite: anypower Building: Power: 100 - Footprint: xx xx - Dimensions: 2,2 + Footprint: xx xx xx + Dimensions: 2,3 Health: HP: 400 Armor: @@ -145,7 +145,7 @@ REFA: Description: Harvesters unload spice here. Building: Power: -30 - Footprint: _x_ xxx x== + Footprint: xxx xxx x== Dimensions: 3,3 Health: HP: 900 @@ -211,8 +211,8 @@ LIGHTA: Description: light vehicles. Building: Power: -30 - Footprint: xxx xxx - Dimensions: 3,2 + Footprint: xxx xxx xxx + Dimensions: 3,3 Health: HP: 1500 Armor: @@ -224,8 +224,8 @@ LIGHTA: PlayerPalette: d2kplayer RallyPoint: Exit@1: - SpawnOffset: 5,0 - ExitCell: 1,1 + SpawnOffset: 10,0 + ExitCell: 1,3 Production: Produces: Vehicle PrimaryBuilding: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 9e6d90569b..77aa3e9845 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -93,7 +93,7 @@ QUAD: RenderUnit: PlayerPalette: d2kplayer AttackFrontal: - PrimaryWeapon: RedEye + PrimaryWeapon: Dragon PrimaryOffset: 0,0,0,-2 PrimaryLocalOffset: -4,0,0,0,25, 4,0,0,0,-25 AutoTarget: \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 5e599aa582..df9b77d707 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -38,7 +38,7 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 1859 1890 "combataturret" --vehicle mono OpenRA.Utility.exe --shp combataturret.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 1891 1922 "siegeturret" --vehicle mono OpenRA.Utility.exe --shp siegeturret.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 1923 1954 "carryall" --vehicle # requires some reordering (again) +mono OpenRA.Utility.exe --r8 $R8 $PAL 1923 1954 "carryall" --vehicle mono OpenRA.Utility.exe --shp carryall.png 64 mono OpenRA.Utility.exe --r8 $R8 $PAL 1955 2050 "orni" --vehicle mono OpenRA.Utility.exe --shp orni.png 48 From 68a731ed5e3896b800e39989b730884ef2dbc8e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Tue, 22 May 2012 23:19:05 +0200 Subject: [PATCH 04/36] fixing MCV facings and flickering bug --- mods/d2k/bits/d2k.pal | Bin 768 -> 768 bytes mods/d2k/rules/structures.yaml | 2 +- mods/d2k/rules/system.yaml | 4 ++-- mods/d2k/rules/vehicles.yaml | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/d2k/bits/d2k.pal b/mods/d2k/bits/d2k.pal index be445309b50a8ac75b0963ec4c811b2b8c4e3631..01b5babc5f564a563e177458ec5ae8585f2e5a92 100644 GIT binary patch delta 15 WcmZo*YhYtzU| Date: Wed, 23 May 2012 20:04:45 +0200 Subject: [PATCH 05/36] +heavy factory, radar outpost, brick wall --- mods/d2k/rules/structures.yaml | 95 ++++++++++++++++++++++++++++++++-- mods/d2k/rules/vehicles.yaml | 2 +- mods/d2k/sequences.yaml | 32 ++++++++++++ ripD2kGameFiles.sh | 61 +++++++++++++++++----- 4 files changed, 172 insertions(+), 18 deletions(-) diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 9de4e9bb65..d8fd5c2bae 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -205,14 +205,48 @@ LIGHTA: Prerequisites: refa Owner: atreides Valued: - Cost: 2000 + Cost: 1000 Tooltip: Name: Light Factory - Description: light vehicles. + Description: produces light vehicles. Building: Power: -30 Footprint: xxx xxx xxx Dimensions: 3,3 + Health: + HP: 750 + Armor: + Type: Light + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + RallyPoint: + Exit@1: + SpawnOffset: 10,0 + ExitCell: 1,3 + Production: + Produces: Vehicle + PrimaryBuilding: + ProductionBar: + +HEAVYA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 50 + Prerequisites: lighta + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: Heavy Factory + Description: produces tanks + Building: + Power: -30 + Footprint: _x_ xxx xxx + Dimensions: 3,3 Health: HP: 1500 Armor: @@ -229,4 +263,59 @@ LIGHTA: Production: Produces: Vehicle PrimaryBuilding: - ProductionBar: \ No newline at end of file + ProductionBar: + +RADARA: + RequiresPower: + CanPowerDown: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 60 + Prerequisites: barra + Owner: atreides + Valued: + Cost: 1400 + Tooltip: + Name: Outpost + Description: Provides a radar map of the battlefield.\n Requires power to operate. + Building: + Power: -40 + Footprint: xxx xxx xxx + Dimensions: 3,3 + Health: + HP: 1000 + Armor: + Type: Wood + RevealsShroud: + Range: 10 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + ProvidesRadar: + +WALLA: + Inherits: ^Wall + Buildable: + Queue: Defense + BuildPaletteOrder: 1000 + Prerequisites: conyarda + Owner: atreides + Valued: + Cost: 100 + CustomSellValue: + Value: 0 + Tooltip: + Name: Concrete Wall + Description: Stop units and blocks enemy fire. + SoundOnDamageTransition: + DamagedSound: crmble2.aud + DestroyedSound: kaboom30.aud + Health: + HP: 500 + Armor: + Type: Concrete + Wall: + CrushClasses: heavywall + RenderBuildingWall: + Palette: d2k \ No newline at end of file diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index a41047fe32..ae96a0571b 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -11,7 +11,7 @@ HARVESTER: Buildable: Queue: Vehicle BuildPaletteOrder: 10 - Prerequisites: refa + Prerequisites: refa,heavya Owner: atreides Valued: Cost: 1100 diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 4c9340310f..d87b2aa9c2 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -27,6 +27,20 @@ conyarda: damaged-idle: Start: 1 +walla: + idle: + Start: 0 + Length: 16 + scratched-idle: + Start: 0 + Length: 16 + damaged-idle: + Start: 16 + Length: 16 + critical-idle: + Start: 16 + Length: 16 + pwra: idle: Start: 0 @@ -45,6 +59,15 @@ barra: damaged-idle: Start: 1 +radara: + idle: + Start: 0 + make: radarmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + refa: idle: Start: 1 @@ -84,6 +107,15 @@ lighta: damaged-idle: Start: 2 +heavya: + idle: + Start: 1 + make: heavymake + Start: 0 + Length: * + damaged-idle: + Start: 2 + carryall: idle: Start: 0 diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index df9b77d707..b7501f3889 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -71,8 +71,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2523 2524 "pwra" --building mono OpenRA.Utility.exe --shp pwra.png 64 mono OpenRA.Utility.exe --r8 $R8 $PAL 2525 2526 "barra" --building mono OpenRA.Utility.exe --shp barra.png 80 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "wall" --building -mono OpenRA.Utility.exe --shp wall.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "walla" --building +mono OpenRA.Utility.exe --shp walla.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 2559 2560 "conyarda" --building mono OpenRA.Utility.exe --shp conyarda.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2561 2563 "refa" --building # 2561 is fassade, 2562 is silo top, 2563 is silo top broken @@ -81,9 +81,24 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2564 2565 "hightecha" --building mono OpenRA.Utility.exe --shp hightecha.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2566 2570 "siloa" --building mono OpenRA.Utility.exe --shp siloa.png 32 - +mono OpenRA.Utility.exe --r8 $R8 $PAL 2571 2572 "repaira" --building +mono OpenRA.Utility.exe --shp repaira.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2573 2588 "guntowera" --building +mono OpenRA.Utility.exe --shp guntowera.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2589 2620 "gunturret" --building +mono OpenRA.Utility.exe --shp gunturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2621 2636 "rockettowera" --building +mono OpenRA.Utility.exe --shp rockettowera.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2637 2668 "rocketturreta" --building +mono OpenRA.Utility.exe --shp rocketturreta.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2669 2670 "researcha" --building +mono OpenRA.Utility.exe --shp researcha.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2671 2672 "starporta" --building +mono OpenRA.Utility.exe --shp starporta.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2673 2675 "lighta" --building mono OpenRA.Utility.exe --shp lighta.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2676 2677 "palacea" --building +mono OpenRA.Utility.exe --shp palacea.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 3549 3564 "sandwormmouth" mono OpenRA.Utility.exe --shp sandwormmouth.png 68 @@ -171,8 +186,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 4060 4060 "barrhicon" mono OpenRA.Utility.exe --shp barrhicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4061 4061 "barroicon" mono OpenRA.Utility.exe --shp barroicon.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4063 4063 "wallicon" # = 4061..4062 -mono OpenRA.Utility.exe --shp wallicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4063 4063 "wallaicon" # = 4061..4062 +mono OpenRA.Utility.exe --shp wallaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4066 4066 "refaicon" mono OpenRA.Utility.exe --shp refaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4067 4067 "refhicon" @@ -222,10 +237,18 @@ mono OpenRA.Utility.exe --shp starporthicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4094 4094 "starportoicon" mono OpenRA.Utility.exe --shp starportoicon.png 60 # 4095 = orniicon -mono OpenRA.Utility.exe --r8 $R8 $PAL 4096 4096 "repairicon" # = 4097..4098 -mono OpenRA.Utility.exe --shp repairicon.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4099 4099 "researchicon" # = 4100..4101 -mono OpenRA.Utility.exe --shp researchicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4096 4096 "repairaicon" +mono OpenRA.Utility.exe --shp repairaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4097 4097 "repairhicon" +mono OpenRA.Utility.exe --shp repairhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4098 4098 "repairoicon" +mono OpenRA.Utility.exe --shp repairhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4099 4099 "researchaicon" +mono OpenRA.Utility.exe --shp researchaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4100 4100 "researchhicon" +mono OpenRA.Utility.exe --shp researchhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4101 4101 "researchoicon" +mono OpenRA.Utility.exe --shp researchoicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4102 4102 "palaceaicon" mono OpenRA.Utility.exe --shp palaceaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4103 4103 "palacehicon" @@ -244,19 +267,29 @@ mono OpenRA.Utility.exe --shp barramake.png 80 mono OpenRA.Utility.exe --r8 $R8 $PAL 4231 4253 "refmake" --building mono OpenRA.Utility.exe --shp refmake.png 120 - +mono OpenRA.Utility.exe --r8 $R8 $PAL 4254 4273 "radarmake" --building +mono OpenRA.Utility.exe --shp radarmake.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4274 4294 "highmake" --building mono OpenRA.Utility.exe --shp highmake.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4275 4312 "lightmake" --building mono OpenRA.Utility.exe --shp lightmake.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4313 4327 "silomake" --building mono OpenRA.Utility.exe --shp silomake.png 32 - -mono OpenRA.Utility.exe --r8 $R8 $PAL 4436 4449 "cranea" +mono OpenRA.Utility.exe --r8 $R8 $PAL 4328 4346 "heavymake" --building +mono OpenRA.Utility.exe --shp heavymake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4347 4369 "starportmake" --building +mono OpenRA.Utility.exe --shp starportmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4370 4390 "repairmake" --building +mono OpenRA.Utility.exe --shp repairmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4391 4412 "researchmake" --building +mono OpenRA.Utility.exe --shp researchmake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4413 4435 "palacemake" --building +mono OpenRA.Utility.exe --shp palacemake.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4436 4449 "cranea" --building mono OpenRA.Utility.exe --shp cranea.png 96 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4450 4463 "craneh" +mono OpenRA.Utility.exe --r8 $R8 $PAL 4450 4463 "craneh" --building mono OpenRA.Utility.exe --shp craneh.png 96 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4463 4477 "craneo" +mono OpenRA.Utility.exe --r8 $R8 $PAL 4463 4477 "craneo" --building mono OpenRA.Utility.exe --shp craneo.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4760 4819 "windtrap_anim" --building #? From 72b2e03dd05ec88fea6cfed0dcf6c018be3653ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 24 May 2012 16:26:38 +0200 Subject: [PATCH 06/36] added tech buildings, repair pad, startport, tanks --- mods/d2k/TODO | 31 ++++++ mods/d2k/mod.yaml | 6 +- mods/d2k/rules/aircraft.yaml | 28 +++++- mods/d2k/rules/infantry.yaml | 23 +++++ mods/d2k/rules/structures.yaml | 166 ++++++++++++++++++++++++++++++++- mods/d2k/rules/vehicles.yaml | 129 ++++++++++++++++++++++++- mods/d2k/sequences.yaml | 134 +++++++++++++++++++++++++- mods/d2k/weapons.yaml | 63 +++++++++++++ ripD2kGameFiles.sh | 14 +-- 9 files changed, 580 insertions(+), 14 deletions(-) create mode 100644 mods/d2k/TODO create mode 100644 mods/d2k/rules/infantry.yaml create mode 100644 mods/d2k/weapons.yaml diff --git a/mods/d2k/TODO b/mods/d2k/TODO new file mode 100644 index 0000000000..3a45d82bf7 --- /dev/null +++ b/mods/d2k/TODO @@ -0,0 +1,31 @@ +# make R8Reader not always scan the whole file on load +# brick walls don't fit, requires updated RenderBuildingWall +# factories and refinery require overlays (something like RenderWeaponFactory) +# make structures appear earlier when errecting from ground +# silo frames don't fit, requires updated RenderSilo +# harvester unload frames missing (too few DATA.R8 frames in general) +# carryalls should automatically transport harvesters (needs complex logic) +# windtrap animations missing +# outpost animations missing +# construction yard crane animations missing +# Arrakis tileset crashes the game +# create a tileset extractor for gamefiles to remove copyrighted content from distribution +# replace ore with spice and mines with spice blooms +# add game logic for concrete plates +# allow placing turrets on walls +# support separate turret sequence with RenderBuildingTurreted +# repair bay should repair vehicles +# add ornithocopter (might need new RenderOrni code) +# add infantry +# add tanks +# add sandworm +# add thumper +# allow upgrades +# add ordos/harkonnen (avoid redundancy using inheritances) +# add voices (Dune 2000/DATA/SFX folder contains .aud files) +# muzzles and explosions with lightning (might need engine update) +# ingame gamefile extractor at first start when SHPs are not found +# create a shellmap +# rework chrome UI, dialoges, tabs +# add install rules to makefile (once more polished) +# idea: frame 2998 (looks like hole) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) \ No newline at end of file diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 9bc28d10eb..12c793955e 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -20,6 +20,7 @@ Rules: mods/d2k/rules/vehicles.yaml mods/d2k/rules/structures.yaml mods/d2k/rules/aircraft.yaml + mods/d2k/rules/infantry.yaml Sequences: mods/d2k/sequences.yaml @@ -37,6 +38,7 @@ Assemblies: ChromeLayout: Weapons: + mods/d2k/weapons.yaml Voices: mods/d2k/voices.yaml @@ -44,6 +46,8 @@ Voices: TileSets: mods/d2k/tilesets/arrakis.yaml +#TileSize: 32 + Music: Movies: @@ -74,4 +78,4 @@ Fonts: Size:10 TinyBold: Font:FreeSansBold.ttf - Size:10 + Size:10 \ No newline at end of file diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index d77c297bb8..fa38554b87 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -32,4 +32,30 @@ CARRYALL: MaxWeight: 1 PipCount: 1 FallsToEarth: - Explosion: UnitExplode \ No newline at end of file + Explosion: UnitExplode + +C17: + ParaDrop: + LZRange: 1 + Inherits: ^Plane + Tooltip: + Name: Frigate + Description: Supply spacecraft + Plane: + ROT: 5 + Speed: 35 + Health: + HP: 25 + Armor: + Type: Heavy + RenderUnit: + Image: frigate + PlayerPalette: d2kplayer + WithShadow: + Cargo: + MaxWeight: 10 + PipCount: 10 + Invulnerable: + -Selectable: + -GainsExperience: + FlyAwayOnIdle: \ No newline at end of file diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml new file mode 100644 index 0000000000..9162f020cf --- /dev/null +++ b/mods/d2k/rules/infantry.yaml @@ -0,0 +1,23 @@ +#RIFLE: +# Inherits: ^Infantry +# Buildable: +# Queue: Infantry +# BuildPaletteOrder: 10 +# Owner: atreides +# Valued: +# Cost: 100 +# Tooltip: +# Name: Rifle Infantry +# Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles +# Selectable: +# Bounds: 12,17,0,-9 +# Health: +# HP: 50 +# Mobile: +# Speed: 4 +# AttackFrontal: +# PrimaryWeapon: M1Carbine +# TakeCover: +# -RenderInfantry: +# RenderInfantryProne: +# IdleAnimations: idle1,idle2 \ No newline at end of file diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index d8fd5c2bae..d0f99461bc 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -131,6 +131,59 @@ HIGHTECHA: PrimaryBuilding: ProductionBar: +RESEARCHA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 50 + Prerequisites: heavya,radara + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: IX Research Center + Description: Provides advanced units + Building: + Power: -30 + Footprint: _x_ xxx xxx + Dimensions: 3,3 + Health: + HP: 1000 + Armor: + Type: Light + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + +PALACEA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 50 + Prerequisites: researcha + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: Atreides Palace + Description: Provides advanced technology + Building: + Power: -30 + Footprint: xxx xxx xxx + Dimensions: 3,3 + Health: + HP: 2000 + Armor: + Type: Light + RevealsShroud: + Range: 4 + Bib: + RenderBuilding: + PlayerPalette: d2kplayer + + REFA: Inherits: ^Building Buildable: @@ -211,8 +264,8 @@ LIGHTA: Description: produces light vehicles. Building: Power: -30 - Footprint: xxx xxx xxx - Dimensions: 3,3 + Footprint: xxx xxx + Dimensions: 3,2 Health: HP: 750 Armor: @@ -294,6 +347,50 @@ RADARA: PlayerPalette: d2kplayer ProvidesRadar: +STARPORTA: + Inherits: ^Building + Valued: + Cost: 2000 + Tooltip: + Name: Starport + Description: Provides a dropzone for vehicle reinforcements + ProvidesCustomPrerequisite: + Prerequisite: anystarport + Buildable: + Queue: Building + BuildPaletteOrder: 60 + Prerequisites: radara + Owner: atreides + Building: + Power: -30 + Footprint: xxx xxx xxx + Dimensions: 3,3 + Health: + HP: 1000 + RevealsShroud: + Range: 7 + RenderBuilding: + PlayerPalette: d2kplayer + Bib: + RallyPoint: + RallyPoint: 4,2 + BelowUnits: + Exit@1: + SpawnOffset: -24,0 + ExitCell: 3,1 + ProductionAirdrop: + Produces: Vehicle + ProductionQueue: + Type: Vehicle + Group: Vehicle + BuildSpeed: .4 + LowPowerSlowdown: 3 + QueuedAudio: + ReadyAudio: + OnHoldAudio: + CancelledAudio: + ProductionBar: + WALLA: Inherits: ^Wall Buildable: @@ -318,4 +415,67 @@ WALLA: Wall: CrushClasses: heavywall RenderBuildingWall: - Palette: d2k \ No newline at end of file + Palette: d2k + +GUNTOWERA: + Inherits: ^Building + Buildable: + Queue: Defense + BuildPaletteOrder: 40 + Prerequisites: barra + Owner: atreides + Valued: + Cost: 600 + Tooltip: + Name: Turret + Description: Anti-Armor base defense.\n Strong vs Tanks\n Weak vs Infantry, Aircraft + Icon: turreticon + Building: + Power: -40 + -GivesBuildableArea: + Health: + HP: 400 + Armor: + Type: Heavy + RevealsShroud: + Range: 7 + Turreted: + ROT: 12 + InitialFacing: 50 + RenderBuildingTurreted: + Palette: d2k + AttackTurreted: + PrimaryWeapon: TurretGun + AutoTarget: + -RenderBuilding: + RenderRangeCircle: + +REPAIRA: + Inherits: ^Building + Buildable: + Queue: Building + BuildPaletteOrder: 30 + Prerequisites: heavya + Owner: atreides + Valued: + Cost: 1000 + Tooltip: + Name: Repair Pad + Description: Repairs vehicles, and allows\n the construction of additional bases. + Building: + Power: -30 + Footprint: xxx xxx xxx + Dimensions: 3,3 + Health: + HP: 800 + Armor: + Type: Wood + RevealsShroud: + Range: 5 + RenderBuilding: + PlayerPalette: d2kplayer + BelowUnits: + Reservable: + RallyPoint: + RepairsUnits: + Interval: 10 \ No newline at end of file diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index ae96a0571b..7fc4a71a7a 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -1,10 +1,39 @@ MCV: + Inherits: ^Vehicle + Buildable: + Queue: Vehicle + BuildPaletteOrder: 110 + Prerequisites: heavya,repaira + Owner: atreides + Valued: + Cost: 2000 + Tooltip: + Name: Mobile Construction Vehicle + Description: Deploys into another Construction Yard.\n Unarmed + Selectable: + Priority: 3 + Bounds: 42,42 + Health: + HP: 600 + Armor: + Type: Light + Mobile: + Speed: 6 + Crushes: crate, infantry + RevealsShroud: + Range: 4 Transforms: Facing: 10 IntoActor: conyarda + Offset:-1,-1 + TransformSounds: placbldg.aud, build5.aud + NoTransformSounds: nodeply1.aud RenderUnit: Image: MCV PlayerPalette: d2kplayer + MustBeDestroyed: + BaseBuilding: + -AttackMove: HARVESTER: Inherits: ^Vehicle @@ -94,7 +123,105 @@ QUAD: RenderUnit: PlayerPalette: d2kplayer AttackFrontal: - PrimaryWeapon: Dragon + PrimaryWeapon: QuadRockets PrimaryOffset: 0,0,0,-2 PrimaryLocalOffset: -4,0,0,0,25, 4,0,0,0,-25 + AutoTarget: + +COMBATA: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 60 + Prerequisites: heavya + Owner: atreides + Valued: + Cost: 850 + Tooltip: + Name: Combat Tank + Description: Atreides Main Battle Tank.\n Strong vs Tanks, Light Vehicles\n Weak vs Infantry, Aircraft + Health: + HP: 450 + Armor: + Type: Heavy + Mobile: + Speed: 6 + Crushes: crate, infantry + RevealsShroud: + Range: 5 + Turreted: + ROT: 5 + AttackTurreted: + PrimaryWeapon: 90mm + PrimaryRecoil: 3 + PrimaryRecoilRecovery: 0.9 + RenderUnitTurreted: + PlayerPalette: d2kplayer + AutoTarget: + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + Selectable: + Bounds: 30,30 + +SIEGE: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 80 + Prerequisites: radara + Owner: atreides + Valued: + Cost: 600 + Tooltip: + Name: Siege Tank + Description: Long-range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft + Health: + HP: 75 + Armor: + Type: Light + Mobile: + Speed: 6 + Crushes: crate, infantry + RevealsShroud: + Range: 5 + Turreted: + ROT: 5 + AttackTurreted: + PrimaryWeapon: 155mm + PrimaryRecoil: 3 + PrimaryRecoilRecovery: 0.9 + RenderUnitTurreted: + PlayerPalette: d2kplayer + Explodes: + Weapon: UnitExplode + Chance: 75 + AutoTarget: + +Missile: + Inherits: ^Tank + Valued: + Cost: 800 + Tooltip: + Name: Missile Tank + Description: Long range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft + Buildable: + Queue: Vehicle + BuildPaletteOrder: 50 + Prerequisites: heavya + Owner: atreides + Mobile: + Speed: 6 + Health: + HP: 120 + Armor: + Type: Light + RevealsShroud: + Range: 6 + AttackFrontal: + PrimaryWeapon: 227mm + PrimaryOffset: 0,6,0,-3 + PrimaryLocalOffset: 3,-5,0,0,0, -3,-5,0,0,0 + RenderUnit: + PlayerPalette: d2kplayer AutoTarget: \ No newline at end of file diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index d87b2aa9c2..32c77eb9fc 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -27,6 +27,29 @@ conyarda: damaged-idle: Start: 1 +repaira: + idle: + Start: 0 + make: repairmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +starporta: + idle: + Start: 0 + active: + Start: 0 + Length: 1 + damaged-idle: + Start: 1 + damaged-active: + Start: 1 + make: starportmake + Start: 0 + Length: * + walla: idle: Start: 0 @@ -98,6 +121,25 @@ hightecha: damaged-idle: Start: 1 +researcha: + idle: + Start: 0 + make: researchmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +palacea: + idle: + Start: 0 + make: palacemake + Start: 0 + Length: * + damaged-idle: + Start: 1 + + lighta: idle: Start: 1 @@ -132,4 +174,94 @@ trike: quad: idle: Start: 0 - Facings: 32 \ No newline at end of file + Facings: 32 + +combata: + idle: + Start: 0 + Facings: 32 + turret: combataturret + Start: 0 + Facings: 32 + +siege: + idle: + Start: 0 + Facings: 32 + turret: siegeturret + Start: 0 + Facings: 32 + +missile: + idle: + Start: 0 + Facings: 32 + +guntowera: + idle: + Start: 0 + Facings: 1 + recoil: + Start: 0 + Facings: 1 + make: silomake + Start: 0 + Length: * + damaged-idle: + Start: 0 + Facings: 1 + damaged-recoil: + Start: 0 + Facings: 1 + turret: gunturret + Start: 0 + Facings: 32 + +frigate: + idle: + Start: 0 + Facings: 1 + +#rifle: +# stand: +# Start: 0 +# Facings: 8 +# run: +# Start: 8 +# Length: 6 +# Facings: 8 +# shoot: +# Start: 56 +# Length: 8 +# Facings: 8 +# prone-stand: +# Start: 136 +# Length: 4 +# Facings: 8 +# prone-run: +# Start: 136 +# Length: 4 +# Facings: 8 +# standup-0: +# Start: 176 +# Length: 2 +# Facings: 8 +# prone-shoot: +# Start: 168 +# Length: 8 +# Facings: 8 +# die1: +# Start: 288 +# Length: 8 +# die2: +# Start: 296 +# Length: 8 +# die3: +# Start: 304 +# Length: 8 +# die4: +# Start: 312 +# Length: 12 +# die5: +# Start: 324 +# Length: 18 \ No newline at end of file diff --git a/mods/d2k/weapons.yaml b/mods/d2k/weapons.yaml new file mode 100644 index 0000000000..afe343912f --- /dev/null +++ b/mods/d2k/weapons.yaml @@ -0,0 +1,63 @@ +QuadRockets: + ROF: 60 + Range: 7 + Report: MISSILE6 + ValidTargets: Ground, Air + Burst: 2 + BurstDelay: 0 + Projectile: Missile + Arm: 0 + High: yes + Shadow: no + Proximity: yes + Inaccuracy: 3 + Image: DRAGON + ROT: 10 + Trail: smokey + Speed: 35 + RangeLimit: 40 + Warhead: + Spread: 3 + Versus: + None: 50% + Wood: 30% + Light: 75% + Heavy: 30% + InfDeath: 3 + Explosion: med_explosion + WaterExplosion: med_splash + ImpactSound: kaboom12 + SmudgeType: Crater + Damage: 35 + +227mm: + ROF: 80 + Range: 10 + MinRange: 2 + Burst: 6 + BurstDelay: 1 + Report: MISSILE6 + ValidTargets: Ground + Projectile: Bullet + Arm: 5 + High: yes + Shadow: yes + Inaccuracy: 30 + Angle: 0.1 + Image: DRAGON + ROT: 5 + Trail: smokey + Speed: 15 + Warhead: + Spread: 10 + Versus: + None: 30% + Wood: 75% + Light: 75% + Heavy: 50% + InfDeath: 3 + Explosion: med_explosion + WaterExplosion: med_splash + ImpactSound: kaboom12 + SmudgeType: Crater + Damage: 25 \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index b7501f3889..afed7b29df 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -4,10 +4,10 @@ PAL="mods/d2k/bits/d2k.pal" mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" mono OpenRA.Utility.exe --shp spice.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 206 457 "rifleinfantry" --infantry -mono OpenRA.Utility.exe --shp rifleinfantry.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 458 693 "rocketinfantry" --infantry -mono OpenRA.Utility.exe --shp rocketinfantry.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 206 457 "rifle" --infantry +mono OpenRA.Utility.exe --shp rifle.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 458 693 "rocket" --infantry +mono OpenRA.Utility.exe --shp rocket.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 694 929 "fremen" --infantry mono OpenRA.Utility.exe --shp fremen.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 930 1165 "sardaukar" --infantry @@ -117,8 +117,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 3679 3686 "sell" mono OpenRA.Utility.exe --shp sell.png 48 #explosions and muzzle flash -mono OpenRA.Utility.exe --r8 $R8 $PAL 4011 4011 "infrantryicon" -mono OpenRA.Utility.exe --shp infrantryicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4011 4011 "rifleicon" +mono OpenRA.Utility.exe --shp rifleicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4012 4012 "bazookaicon" mono OpenRA.Utility.exe --shp bazookaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4013 4013 "engineericon" @@ -271,7 +271,7 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 4254 4273 "radarmake" --building mono OpenRA.Utility.exe --shp radarmake.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4274 4294 "highmake" --building mono OpenRA.Utility.exe --shp highmake.png 96 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4275 4312 "lightmake" --building +mono OpenRA.Utility.exe --r8 $R8 $PAL 4295 4312 "lightmake" --building mono OpenRA.Utility.exe --shp lightmake.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4313 4327 "silomake" --building mono OpenRA.Utility.exe --shp silomake.png 32 From 4362a215d9ccd7df69015772a10e53534ca4a7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 25 May 2012 17:46:58 +0200 Subject: [PATCH 07/36] fixed wall, silo; add ornithocopter, sonic tank, infantry orni does not flap, no sonic wave weapon, infantry frames broken --- OpenRA.Utility/Command.cs | 30 +++- mods/d2k/TODO | 15 +- mods/d2k/maps/blank.oramap | Bin 0 -> 572 bytes mods/d2k/mod.yaml | 1 + mods/d2k/rules/aircraft.yaml | 40 ++++- mods/d2k/rules/defaults.yaml | 310 +++++++++++++++++++++++++++++++++ mods/d2k/rules/infantry.yaml | 46 ++--- mods/d2k/rules/structures.yaml | 9 +- mods/d2k/rules/vehicles.yaml | 29 +++ mods/d2k/sequences.yaml | 91 +++++----- ripD2kGameFiles.sh | 2 +- 11 files changed, 489 insertions(+), 84 deletions(-) create mode 100644 mods/d2k/maps/blank.oramap create mode 100644 mods/d2k/rules/defaults.yaml diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index 51ebff6a9d..660f32a993 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -151,13 +151,41 @@ namespace OpenRA.Utility frame = srcImage[f]; } } + else if (args.Contains("--wall")) //complex resorting to RA/CnC compatible frame order + { + int[] D2kBrikFrameOrder = {1, 4, 2, 12, 5, 6, 16, 9, 3, 13, 7, 8, 14, 10, 11, 15, 17, 20, 18, 28, 21, 22, 32, 25, 19, 29, 23, 24, 30, 26, 27, 31}; + foreach (int o in D2kBrikFrameOrder) + { + int f = startFrame -1 + o; + + frame = srcImage[f]; + + if (frame.OffsetX < 0) { frame.OffsetX = 0 - frame.OffsetX; } + if (frame.OffsetY < 0) { frame.OffsetY = 0 - frame.OffsetY; } + OffsetX = 0 + frame.OffsetX; + OffsetY = frame.FrameHeight - frame.OffsetY; + Console.WriteLine("calculated OffsetX: {0}", OffsetX); + Console.WriteLine("calculated OffsetY: {0}", OffsetY); + + var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, + PixelFormat.Format8bppIndexed); + + for (var i = 0; i < frame.Height; i++) + Marshal.Copy(frame.Image, i * frame.Width, + new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); + + bitmap.UnlockBits(data); + + x += frame.FrameWidth; + } + } else { for (int f = startFrame; f < endFrame; f++) { frame = srcImage[f]; - if (args.Contains("--infrantry")) + if (args.Contains("--infantry")) { OffsetX = frame.FrameWidth/2 - frame.Width/2; OffsetY = frame.FrameHeight/2 - frame.Height/2; diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 3a45d82bf7..b2586a6edc 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -1,8 +1,6 @@ -# make R8Reader not always scan the whole file on load # brick walls don't fit, requires updated RenderBuildingWall # factories and refinery require overlays (something like RenderWeaponFactory) # make structures appear earlier when errecting from ground -# silo frames don't fit, requires updated RenderSilo # harvester unload frames missing (too few DATA.R8 frames in general) # carryalls should automatically transport harvesters (needs complex logic) # windtrap animations missing @@ -11,15 +9,15 @@ # Arrakis tileset crashes the game # create a tileset extractor for gamefiles to remove copyrighted content from distribution # replace ore with spice and mines with spice blooms -# add game logic for concrete plates +# add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # support separate turret sequence with RenderBuildingTurreted -# repair bay should repair vehicles -# add ornithocopter (might need new RenderOrni code) +# repair bay should really repair vehicles +# ornithocopter should flap (might need new RenderOrni code for proper animation) +# R8 converter needs infantry frame resorter # add infantry -# add tanks # add sandworm -# add thumper +# add thumper which really attracts sandworms # allow upgrades # add ordos/harkonnen (avoid redundancy using inheritances) # add voices (Dune 2000/DATA/SFX folder contains .aud files) @@ -28,4 +26,5 @@ # create a shellmap # rework chrome UI, dialoges, tabs # add install rules to makefile (once more polished) -# idea: frame 2998 (looks like hole) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) \ No newline at end of file +# idea: frame 2998 (fremen siech) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) +# add sonic tank weapon (currently uses tesla) \ No newline at end of file diff --git a/mods/d2k/maps/blank.oramap b/mods/d2k/maps/blank.oramap new file mode 100644 index 0000000000000000000000000000000000000000..c826e5a14ef87d47de68a9a0dc08481e052f3023 GIT binary patch literal 572 zcmWIWW@Zs#U|`^2*fnpH1BXdtbuy60>cGgr4y1Dv3-ppQ^WGjbWMp9AVN$q$=f&!W zj4_viQq%++9x?`?xZ_OlRSsUDl{IlcXke$0kEuGhb67B%EKFdbYY z(KSIJ%h9-X-Cap%=6NX{vI~pk@(vv>xWy%wGePF*Z|l0UsH9gS*L|k$b`xWo@wh_v zazoTk;fAHxgQAVw!W*HQ3><(XQ2auMHmRr3cN0qJ*-gzU6jm1on%c|Lyr!sQ_z zK2C0HXD{2gH?w?l)c?dUiyv=ZDcf**hO>U!96#N2-V8PzS1;vt+-wWUo4F}>=bgT5 z7TphZCuUs|=4C=e-FLYZQQ`0GtM+yzinW_+ zvHdlaezS&mrtQi2e>#G_pStfq|DWV|H&e&k+4{-9nO#{%@83;(lYUIU%GKgnz?I}L w)~}@lycwB{8E{7)Y79Z65?vE|NFy|LAccE?H!B-Rh6xC>f%I-*yf82T08Xo{uK)l5 literal 0 HcmV?d00001 diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 12c793955e..900e0cd16c 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -17,6 +17,7 @@ Packages: Rules: mods/d2k/rules/system.yaml + mods/d2k/rules/defaults.yaml mods/d2k/rules/vehicles.yaml mods/d2k/rules/structures.yaml mods/d2k/rules/aircraft.yaml diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index fa38554b87..8c8c3fffa3 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -58,4 +58,42 @@ C17: Invulnerable: -Selectable: -GainsExperience: - FlyAwayOnIdle: \ No newline at end of file + FlyAwayOnIdle: + +ORNI: + Inherits: ^Helicopter + Buildable: + Queue: Plane + BuildPaletteOrder: 90 + Prerequisites: hightecha + BuiltAt: hightecha + Owner: atreides + Valued: + Cost: 1000 + Tooltip: + Name: Ornithocopter + Description: Helicopter Gunship with Chainguns.\n Strong vs Infantry, Light Vehicles.\n Weak vs Tanks + Health: + HP: 150 + Armor: + Type: Light + RevealsShroud: + Range: 10 + AttackHeli: + PrimaryWeapon: ChainGun + PrimaryOffset: -5,-2,0,2 + FacingTolerance: 20 + Helicopter: + LandWhenIdle: false + InitialFacing: 20 + ROT: 4 + Speed: 12 + RenderUnit: + PlayerPalette: d2kplayer + WithShadow: + Selectable: + Bounds: 38,32,0,0 + FallsToEarth: + Explosion: UnitExplode + SmokeTrailWhenDamaged: + Offset: 0,-10 \ No newline at end of file diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml new file mode 100644 index 0000000000..93386afa85 --- /dev/null +++ b/mods/d2k/rules/defaults.yaml @@ -0,0 +1,310 @@ +^Vehicle: + AppearsOnRadar: + Mobile: + Crushes: atmine, crate, apmine + TerrainSpeeds: + Clear: 80 + Rough: 40 + Road: 100 + Ore: 70 + Beach: 40 + ROT: 5 + SelectionDecorations: + Selectable: + Voice: VehicleVoice + TargetableUnit: + TargetTypes: Ground + Repairable: + Chronoshiftable: + Passenger: + CargoType: Vehicle + IronCurtainable: + AttackMove: + HiddenUnderFog: + GainsExperience: + GivesExperience: + DrawLineToTarget: + ActorLostNotification: + Notification: unitlst1.aud + ProximityCaptor: + Types:Vehicle + GivesBounty: + GpsDot: + String:Vehicle + WithSmoke: + +^Tank: + AppearsOnRadar: + Mobile: + Crushes: wall, atmine, crate, apmine + TerrainSpeeds: + Clear: 80 + Rough: 70 + Road: 100 + Ore: 70 + Beach: 70 + ROT: 5 + SelectionDecorations: + Selectable: + Voice: VehicleVoice + TargetableUnit: + TargetTypes: Ground + Repairable: + Chronoshiftable: + Passenger: + CargoType: Vehicle + IronCurtainable: + AttackMove: + HiddenUnderFog: + GainsExperience: + GivesExperience: + DrawLineToTarget: + ActorLostNotification: + Notification: unitlst1.aud + ProximityCaptor: + Types:Tank + GivesBounty: + GpsDot: + String:Vehicle + WithSmoke: + +^Infantry: + AppearsOnRadar: + Health: + Radius: 3 + Armor: + Type: None + RevealsShroud: + Range: 4 + Mobile: + Crushes: apmine, crate + SharesCell: true + TerrainSpeeds: + Clear: 90 + Rough: 80 + Road: 100 + Ore: 80 + Beach: 80 + SelectionDecorations: + Selectable: + Voice: GenericVoice + TargetableUnit: + TargetTypes: Ground + RenderInfantry: + AutoTarget: + AttackMove: + Passenger: + CargoType: Infantry + HiddenUnderFog: + TeslaInstantKills: + GainsExperience: + GivesExperience: + DrawLineToTarget: + ActorLostNotification: + Notification: unitlst1.aud + ProximityCaptor: + Types:Infantry + GivesBounty: + GpsDot: + String:Infantry + ParachuteAttachment: + Offset: 0,-10 + CrushableInfantry: + CrushSound: squishy2.aud + +^Ship: + AppearsOnRadar: + Mobile: + Crushes: crate + TerrainSpeeds: + Water: 100 + SelectionDecorations: + Selectable: + Voice: ShipVoice + TargetableUnit: + TargetTypes: Ground, Water + DetectCloaked: + Range: 3 + HiddenUnderFog: + AttackMove: + GainsExperience: + GivesExperience: + DrawLineToTarget: + ActorLostNotification: + Notification: navylst1.aud + ProximityCaptor: + Types:Ship + GivesBounty: + GpsDot: + String:Ship + WithSmoke: + +^Plane: + AppearsOnRadar: + UseLocation: yes + SelectionDecorations: + Selectable: + Voice: GenericVoice + TargetableAircraft: + TargetTypes: Air + GroundedTargetTypes: Ground + HiddenUnderFog: + GainsExperience: + GivesExperience: + DrawLineToTarget: + ActorLostNotification: + Notification: aunitl1.aud + DebugAircraftFacing: + DebugAircraftSubPxX: + DebugAircraftSubPxY: + DebugAircraftAltitude: + ProximityCaptor: + Types:Plane + EjectOnDeath: + PilotActor: E1 + SuccessRate: 50 + GivesBounty: + GpsDot: + String:Plane + +^Helicopter: + Inherits: ^Plane + GpsDot: + String:Helicopter + +^Building: + AppearsOnRadar: + SelectionDecorations: + Selectable: + Priority: 3 + TargetableBuilding: + TargetTypes: Ground + Building: + Dimensions: 1,1 + Footprint: x + TerrainTypes: Clear,Road + GivesBuildableArea: + Capturable: + CapturableBar: + SoundOnDamageTransition: + DamagedSound: kaboom1.aud + DestroyedSound: kaboom22.aud + RenderBuilding: + WithBuildingExplosion: + RepairableBuilding: + EmitInfantryOnSell: + ActorTypes: e1,e1,e1,c1,c2,e6 + MustBeDestroyed: + GivesExperience: +# FrozenUnderFog: + CaptureNotification: + Notification: strucap1.aud + EditorAppearance: + RelativeToTopLeft: yes + ShakeOnDeath: + ProximityCaptor: + Types:Building + Sellable: + AcceptsSupplies: + GivesBounty: + +^Wall: + AppearsOnRadar: + Building: + Dimensions: 1,1 + Footprint: x + BuildSounds: placbldg.aud + Adjacent: 7 + TerrainTypes: Clear,Road + SoundOnDamageTransition: + DamagedSound: sandbag2.aud + DestroyedSound: sandbag2.aud + Wall: + CrushClasses: wall + LineBuild: + Range: 8 + SelectionDecorations: + Selectable: + Priority: 1 + TargetableBuilding: + TargetTypes: Ground + RenderBuildingWall: + HasMakeAnimation: false + Palette: terrain + GivesExperience: + EditorAppearance: + RelativeToTopLeft: yes + AutoTargetIgnore: + ProximityCaptor: + Types:Wall + Sellable: + +^CivBuilding: + Inherits: ^Building + -RepairableBuilding: + Health: + HP: 400 + Armor: + Type: Wood + Tooltip: + Name: Civilian Building + ProximityCaptor: + Types:CivilianBuilding + -AcceptsSupplies: + -GivesBuildableArea: + -Sellable: + -Capturable: + -CapturableBar: + +^CivField: + Inherits: ^CivBuilding + -Selectable: + Tooltip: + Name: Field + -ProximityCaptor: + ProximityCaptor: + Types:CivilianField + +^Tree: + Tooltip: + Name: Tree + RenderBuilding: + Palette: terrain + Building: + Footprint: x + Dimensions: 1,1 + AppearsOnRadar: + RadarColorFromTerrain: + Terrain: Tree + EditorAppearance: + RelativeToTopLeft: yes + ProximityCaptor: + Types:Tree + +^Husk: + Husk: + RenderUnit: + Health: + HP: 140 + Armor: + Type: Heavy + HiddenUnderFog: + AppearsOnRadar: + Burns: + ProximityCaptor: + Types:Husk + +^Bridge: + Tooltip: + Name: Bridge + BelowUnits: + TargetableBuilding: + TargetTypes: Ground, Water + Building: + Footprint: ____ ____ + Dimensions: 4,2 + Health: + HP: 1000 + ProximityCaptor: + Types:Bridge + AutoTargetIgnore: diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index 9162f020cf..009385f4ba 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -1,23 +1,23 @@ -#RIFLE: -# Inherits: ^Infantry -# Buildable: -# Queue: Infantry -# BuildPaletteOrder: 10 -# Owner: atreides -# Valued: -# Cost: 100 -# Tooltip: -# Name: Rifle Infantry -# Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles -# Selectable: -# Bounds: 12,17,0,-9 -# Health: -# HP: 50 -# Mobile: -# Speed: 4 -# AttackFrontal: -# PrimaryWeapon: M1Carbine -# TakeCover: -# -RenderInfantry: -# RenderInfantryProne: -# IdleAnimations: idle1,idle2 \ No newline at end of file +RIFLE: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 10 + Owner: atreides + Valued: + Cost: 100 + Tooltip: + Name: Rifle Infantry + Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles + Selectable: + Bounds: 12,17,0,-9 + Health: + HP: 50 + Mobile: + Speed: 4 + AttackFrontal: + PrimaryWeapon: M1Carbine + TakeCover: + -RenderInfantry: + RenderInfantryProne: + PlayerPalette: d2kplayer \ No newline at end of file diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index d0f99461bc..5d148e90da 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -242,12 +242,12 @@ SILOA: Type: Wood RevealsShroud: Range: 4 -# RenderBuildingSilo: + RenderBuildingSilo: + PlayerPalette: d2kplayer StoresOre: PipCount: 5 Capacity: 1500 - RenderBuilding: - PlayerPalette: d2kplayer + -RenderBuilding: -EmitInfantryOnSell: LIGHTA: @@ -476,6 +476,5 @@ REPAIRA: PlayerPalette: d2kplayer BelowUnits: Reservable: - RallyPoint: RepairsUnits: - Interval: 10 \ No newline at end of file + RallyPoint: \ No newline at end of file diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 7fc4a71a7a..696c6bc4aa 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -224,4 +224,33 @@ Missile: PrimaryLocalOffset: 3,-5,0,0,0, -3,-5,0,0,0 RenderUnit: PlayerPalette: d2kplayer + AutoTarget: + +SONIC: + Inherits: ^Vehicle + Buildable: + Queue: Vehicle + BuildPaletteOrder: 15 + Prerequisites: heavya,researcha + Owner: atreides + Valued: + Cost: 1500 + Tooltip: + Name: Sonic Tank + Description: Fires a sound wave\n Strong vs Infantry.\n Weak vs Tanks + Selectable: + Bounds: 24,24 + Health: + HP: 150 + Armor: + Type: Light + Mobile: + Speed: 8 + RevealsShroud: + Range: 7 + RenderUnit: + PlayerPalette: d2kplayer + AttackFrontal: + PrimaryWeapon: TTankZap + PrimaryOffset: 0,0,0,-5 AutoTarget: \ No newline at end of file diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 32c77eb9fc..f7fcc7f730 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -103,8 +103,7 @@ refa: siloa: idle: Start: 0 -# Length: 3 - Length: 1 + Length: 4 damaged-idle: Start: 4 Length: 1 @@ -166,6 +165,11 @@ carryall: Start: 0 Facings: 32 +orni: + idle: + Start: 0 + Facings: 32 + trike: idle: Start: 0 @@ -197,6 +201,11 @@ missile: Start: 0 Facings: 32 +sonic: + idle: + Start: 0 + Facings: 32 + guntowera: idle: Start: 0 @@ -222,46 +231,38 @@ frigate: Start: 0 Facings: 1 -#rifle: -# stand: -# Start: 0 -# Facings: 8 -# run: -# Start: 8 -# Length: 6 -# Facings: 8 -# shoot: -# Start: 56 -# Length: 8 -# Facings: 8 -# prone-stand: -# Start: 136 -# Length: 4 -# Facings: 8 -# prone-run: -# Start: 136 -# Length: 4 -# Facings: 8 -# standup-0: -# Start: 176 -# Length: 2 -# Facings: 8 -# prone-shoot: -# Start: 168 -# Length: 8 -# Facings: 8 -# die1: -# Start: 288 -# Length: 8 -# die2: -# Start: 296 -# Length: 8 -# die3: -# Start: 304 -# Length: 8 -# die4: -# Start: 312 -# Length: 12 -# die5: -# Start: 324 -# Length: 18 \ No newline at end of file +#TODO: This is wrong. +rifle: + stand: + Start: 0 + Facings: 8 + stand2: + Start: 8 + Length: 8 + stand3: + Start: 128 + Length: 16 + run: + Start: 16 + Length: 6 + Facings: 8 + shoot: + Start: 64 + Length: 6 + Facings: 8 + prone-stand: + Start: 112 + Length: 4 + Facings: 8 + prone-run: + Start: 144 + Length: 4 + Facings: 8 + standup-0: + Start: 176 + Length: 2 + Facings: 8 + prone-shoot: + Start: 192 + Length: 6 + Facings: 8 \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index afed7b29df..09a606d38d 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -71,7 +71,7 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2523 2524 "pwra" --building mono OpenRA.Utility.exe --shp pwra.png 64 mono OpenRA.Utility.exe --r8 $R8 $PAL 2525 2526 "barra" --building mono OpenRA.Utility.exe --shp barra.png 80 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "walla" --building +mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "walla" --wall mono OpenRA.Utility.exe --shp walla.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 2559 2560 "conyarda" --building mono OpenRA.Utility.exe --shp conyarda.png 96 From 7f48a242dbd0159bba1bfa6de3d64e1491bc11c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 25 May 2012 22:27:26 +0200 Subject: [PATCH 08/36] fixed refinery, factories a little hacky though --- mods/d2k/TODO | 4 +- mods/d2k/rules/structures.yaml | 12 +- mods/d2k/sequences.yaml | 39 +++- mods/d2k/weapons.yaml | 331 ++++++++++++++++++++++++++++++++- mods/ra/rules/defaults.yaml | 159 +++------------- 5 files changed, 400 insertions(+), 145 deletions(-) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index b2586a6edc..02e2e39a40 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -1,11 +1,11 @@ -# brick walls don't fit, requires updated RenderBuildingWall -# factories and refinery require overlays (something like RenderWeaponFactory) # make structures appear earlier when errecting from ground # harvester unload frames missing (too few DATA.R8 frames in general) # carryalls should automatically transport harvesters (needs complex logic) # windtrap animations missing # outpost animations missing # construction yard crane animations missing +# welding animation (factories) missing +# chimney animation (refinery) missing # Arrakis tileset crashes the game # create a tileset extractor for gamefiles to remove copyrighted content from distribution # replace ore with spice and mines with spice blooms diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 5d148e90da..c328afcf99 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -207,7 +207,9 @@ REFA: RevealsShroud: Range: 6 Bib: - RenderBuilding: + -RenderBuilding: + RenderBuildingWarFactory: + Image: REFA PlayerPalette: d2kplayer OreRefinery: StoresOre: @@ -273,7 +275,9 @@ LIGHTA: RevealsShroud: Range: 4 Bib: - RenderBuilding: + -RenderBuilding: + RenderBuildingWarFactory: + Image: LIGHTA PlayerPalette: d2kplayer RallyPoint: Exit@1: @@ -307,7 +311,9 @@ HEAVYA: RevealsShroud: Range: 4 Bib: - RenderBuilding: + -RenderBuilding: + RenderBuildingWarFactory: + Image: HEAVYA PlayerPalette: d2kplayer RallyPoint: Exit@1: diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index f7fcc7f730..c58ce544a0 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -93,11 +93,22 @@ radara: refa: idle: - Start: 1 + Start: 0 + Length: 1 make: refmake Start: 0 Length: * damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: Start: 2 siloa: @@ -141,20 +152,42 @@ palacea: lighta: idle: - Start: 1 + Start: 0 + Length: 1 make: lightmake Start: 0 Length: * damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: Start: 2 heavya: idle: - Start: 1 + Start: 0 + Length: 1 make: heavymake Start: 0 Length: * damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: Start: 2 carryall: diff --git a/mods/d2k/weapons.yaml b/mods/d2k/weapons.yaml index afe343912f..0cbe8d4e0f 100644 --- a/mods/d2k/weapons.yaml +++ b/mods/d2k/weapons.yaml @@ -1,3 +1,51 @@ +M1Carbine: + ROF: 20 + Range: 5 + Report: GUN11 + Projectile: Bullet + Speed: 100 + Warhead: + Spread: 3 + Versus: + Wood: 25% + Light: 30% + Heavy: 10% + Concrete: 10% + Explosion: piffs + InfDeath: 1 + Damage: 15 + +Dragon: + ROF: 50 + Range: 5 + Report: MISSILE6 + ValidTargets: Ground + Projectile: Missile + Speed: 25 + Arm: 2 + High: true + Shadow: false + Proximity: true + Trail: smokey + ContrailLength: 10 + Inaccuracy: 3 + Image: DRAGON + ROT: 5 + RangeLimit: 35 + Warhead: + Spread: 3 + Versus: + None: 10% + Wood: 75% + Light: 35% + Concrete: 20% + Explosion: med_explosion + WaterExplosion: med_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 50 + ImpactSound: kaboom12 + QuadRockets: ROF: 60 Range: 7 @@ -30,6 +78,109 @@ QuadRockets: SmudgeType: Crater Damage: 35 +TurretGun: + ROF: 30 + Range: 7 + Report: TURRET1 + Projectile: Bullet + Speed: 40 + Image: 120MM + Warhead: + Spread: 3 + Versus: + None: 20% + Wood: 75% + Light: 75% + Concrete: 50% + Explosion: small_explosion + WaterExplosion: small_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 60 + +25mm: + ROF: 13 + Range: 4 + Report: CANNON2 + Projectile: Bullet + Speed: 50 + Image: 120MM + Warhead: + Spread: 3 + Versus: + None: 30% + Wood: 40% + Heavy: 40% + Concrete: 30% + Explosion: small_explosion + WaterExplosion: small_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 16 + +90mm: + ROF: 50 + Range: 4.75 + Report: CANNON1 + Projectile: Bullet + Speed: 40 + Image: 120MM + Warhead: + Spread: 3 + Versus: + None: 20% + Wood: 75% + Light: 75% + Concrete: 50% + Explosion: small_explosion + WaterExplosion: small_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 30 + +105mm: + ROF: 70 + Range: 4.75 + Report: CANNON1 + Burst: 2 + BurstDelay: 4 + Projectile: Bullet + Speed: 40 + Image: 120MM + Warhead: + Spread: 3 + Versus: + None: 20% + Wood: 75% + Light: 75% + Concrete: 50% + Explosion: small_explosion + WaterExplosion: small_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 40 + +120mm: + ROF: 90 + Range: 4.75 + Report: CANNON1 + Burst: 2 + Projectile: Bullet + Speed: 40 + Image: 120MM + Warhead: + Spread: 3 + Versus: + None: 20% + Wood: 75% + Light: 75% + Concrete: 50% + Explosion: small_explosion + WaterExplosion: small_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 50 + 227mm: ROF: 80 Range: 10 @@ -60,4 +211,182 @@ QuadRockets: WaterExplosion: med_splash ImpactSound: kaboom12 SmudgeType: Crater - Damage: 25 \ No newline at end of file + Damage: 25 + +#for rocket turret +MammothTusk: + ROF: 60 + Range: 8 + Report: MISSILE6 + Burst: 2 + ValidTargets: Ground, Air + Projectile: Missile + Speed: 30 + Arm: 2 + High: true + Shadow: false + Proximity: true +# Trail: smokey + ContrailLength: 10 + Inaccuracy: 3 + Image: DRAGON + ROT: 5 + RangeLimit: 40 + Warhead: + Spread: 6 + Versus: + None: 90% + Wood: 75% + Light: 60% + Heavy: 25% + Explosion: med_explosion + WaterExplosion: med_splash + InfDeath: 2 + SmudgeType: Crater + Damage: 45 + +155mm: + ROF: 85 + Range: 14 + MinRange: 3 + Report: TANK5 + Projectile: Bullet + Speed: 12 + High: true + Angle: .1 + Inaccuracy: 40 + Image: 120MM + ContrailLength: 30 + Warhead: + Spread: 10 + Versus: + None: 90% + Wood: 75% + Light: 60% + Heavy: 25% + Concrete: 50% + Explosion: large_explosion + WaterExplosion: med_splash + InfDeath: 2 + SmudgeType: Crater + Damage: 220 + +TTankZap: + ROF: 120 + Range: 7 + Report: TESLA1 + Charges: yes + Projectile: TeslaZap + Warhead: + Spread: 1 + InfDeath: 5 + Damage: 100 + +Demolish: + Warhead: + ImpactSound: kaboom25 + Explosion: building + +Crush: + Warhead: + ImpactSound: squishy2 + Damage: 100 + +Atomic: + Warhead@impact: + Damage: 1000 + Spread: 6 + Ore: true + Versus: + None: 90% + Light: 60% + Heavy: 25% + Concrete: 50% + Explosion: nuke + WaterExplosion: nuke + InfDeath: 4 + ImpactSound: kaboom1 + Warhead@areanuke: + DamageModel: PerCell + Damage: 250 + SmudgeType: Scorch + Size: 5,4 + Ore: true + Versus: + None: 90% + Light: 60% + Heavy: 25% + Concrete: 50% + Delay: 4 + InfDeath: 4 + ImpactSound: kaboom22 + +CrateNuke: + Warhead@impact: + Damage: 1000 + Spread: 6 + Ore: true + Versus: + None: 90% + Light: 60% + Heavy: 25% + Concrete: 50% + Explosion: nuke + WaterExplosion: nuke + InfDeath: 4 + ImpactSound: kaboom1 + Warhead@areanuke: + DamageModel: PerCell + Damage: 250 + SmudgeType: Scorch + Size: 5,4 + Ore: true + Versus: + None: 90% + Light: 60% + Heavy: 25% + Concrete: 50% + Delay: 4 + InfDeath: 4 + ImpactSound: kaboom22 + +CrateExplosion: + Warhead: + Damage: 500 + Spread: 10 + Versus: + None: 90% + Wood: 75% + Light: 60% + Heavy: 25% + Explosion: self_destruct + WaterExplosion: self_destruct + InfDeath: 3 + ImpactSound: kaboom15 + +UnitExplode: + Warhead: + Damage: 500 + Spread: 10 + Versus: + None: 90% + Wood: 75% + Light: 60% + Heavy: 25% + Explosion: self_destruct + WaterExplosion: large_splash + InfDeath: 3 + ImpactSound: kaboom22 + +UnitExplodeSmall: + Warhead: + Damage: 40 + Spread: 10 + Versus: + None: 90% + Wood: 75% + Light: 60% + Heavy: 25% + Explosion: large_explosion + InfDeath: 3 + ImpactSound: kaboom15 \ No newline at end of file diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 93386afa85..ec4e31ae72 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -1,7 +1,7 @@ ^Vehicle: AppearsOnRadar: Mobile: - Crushes: atmine, crate, apmine + Crushes: crate TerrainSpeeds: Clear: 80 Rough: 40 @@ -11,11 +11,10 @@ ROT: 5 SelectionDecorations: Selectable: - Voice: VehicleVoice + Voice: TargetableUnit: TargetTypes: Ground Repairable: - Chronoshiftable: Passenger: CargoType: Vehicle IronCurtainable: @@ -25,18 +24,16 @@ GivesExperience: DrawLineToTarget: ActorLostNotification: - Notification: unitlst1.aud + Notification: ProximityCaptor: Types:Vehicle GivesBounty: - GpsDot: - String:Vehicle WithSmoke: ^Tank: AppearsOnRadar: Mobile: - Crushes: wall, atmine, crate, apmine + Crushes: crate TerrainSpeeds: Clear: 80 Rough: 70 @@ -46,26 +43,23 @@ ROT: 5 SelectionDecorations: Selectable: - Voice: VehicleVoice + Voice: TargetableUnit: TargetTypes: Ground Repairable: Chronoshiftable: Passenger: CargoType: Vehicle - IronCurtainable: AttackMove: HiddenUnderFog: GainsExperience: GivesExperience: DrawLineToTarget: ActorLostNotification: - Notification: unitlst1.aud + Notification: ProximityCaptor: Types:Tank GivesBounty: - GpsDot: - String:Vehicle WithSmoke: ^Infantry: @@ -77,7 +71,7 @@ RevealsShroud: Range: 4 Mobile: - Crushes: apmine, crate + Crushes: crate SharesCell: true TerrainSpeeds: Clear: 90 @@ -87,7 +81,7 @@ Beach: 80 SelectionDecorations: Selectable: - Voice: GenericVoice + Voice: TargetableUnit: TargetTypes: Ground RenderInfantry: @@ -96,55 +90,25 @@ Passenger: CargoType: Infantry HiddenUnderFog: - TeslaInstantKills: GainsExperience: GivesExperience: DrawLineToTarget: ActorLostNotification: - Notification: unitlst1.aud + Notification: ProximityCaptor: Types:Infantry GivesBounty: GpsDot: String:Infantry - ParachuteAttachment: - Offset: 0,-10 CrushableInfantry: - CrushSound: squishy2.aud + CrushSound: -^Ship: - AppearsOnRadar: - Mobile: - Crushes: crate - TerrainSpeeds: - Water: 100 - SelectionDecorations: - Selectable: - Voice: ShipVoice - TargetableUnit: - TargetTypes: Ground, Water - DetectCloaked: - Range: 3 - HiddenUnderFog: - AttackMove: - GainsExperience: - GivesExperience: - DrawLineToTarget: - ActorLostNotification: - Notification: navylst1.aud - ProximityCaptor: - Types:Ship - GivesBounty: - GpsDot: - String:Ship - WithSmoke: - -^Plane: +^Helicopter: AppearsOnRadar: UseLocation: yes SelectionDecorations: Selectable: - Voice: GenericVoice + Voice: TargetableAircraft: TargetTypes: Air GroundedTargetTypes: Ground @@ -153,7 +117,7 @@ GivesExperience: DrawLineToTarget: ActorLostNotification: - Notification: aunitl1.aud + Notification: DebugAircraftFacing: DebugAircraftSubPxX: DebugAircraftSubPxY: @@ -161,16 +125,9 @@ ProximityCaptor: Types:Plane EjectOnDeath: - PilotActor: E1 + PilotActor: RIFLE SuccessRate: 50 GivesBounty: - GpsDot: - String:Plane - -^Helicopter: - Inherits: ^Plane - GpsDot: - String:Helicopter ^Building: AppearsOnRadar: @@ -187,18 +144,18 @@ Capturable: CapturableBar: SoundOnDamageTransition: - DamagedSound: kaboom1.aud - DestroyedSound: kaboom22.aud + DamagedSound: + DestroyedSound: RenderBuilding: WithBuildingExplosion: RepairableBuilding: EmitInfantryOnSell: - ActorTypes: e1,e1,e1,c1,c2,e6 + ActorTypes: rifle,rifle,rifle,rifle,rifle,rifle MustBeDestroyed: GivesExperience: # FrozenUnderFog: CaptureNotification: - Notification: strucap1.aud + Notification: EditorAppearance: RelativeToTopLeft: yes ShakeOnDeath: @@ -213,12 +170,12 @@ Building: Dimensions: 1,1 Footprint: x - BuildSounds: placbldg.aud + BuildSounds: Adjacent: 7 TerrainTypes: Clear,Road SoundOnDamageTransition: - DamagedSound: sandbag2.aud - DestroyedSound: sandbag2.aud + DamagedSound: + DestroyedSound: Wall: CrushClasses: wall LineBuild: @@ -230,81 +187,11 @@ TargetTypes: Ground RenderBuildingWall: HasMakeAnimation: false - Palette: terrain + Palette: d2k GivesExperience: EditorAppearance: RelativeToTopLeft: yes AutoTargetIgnore: ProximityCaptor: Types:Wall - Sellable: - -^CivBuilding: - Inherits: ^Building - -RepairableBuilding: - Health: - HP: 400 - Armor: - Type: Wood - Tooltip: - Name: Civilian Building - ProximityCaptor: - Types:CivilianBuilding - -AcceptsSupplies: - -GivesBuildableArea: - -Sellable: - -Capturable: - -CapturableBar: - -^CivField: - Inherits: ^CivBuilding - -Selectable: - Tooltip: - Name: Field - -ProximityCaptor: - ProximityCaptor: - Types:CivilianField - -^Tree: - Tooltip: - Name: Tree - RenderBuilding: - Palette: terrain - Building: - Footprint: x - Dimensions: 1,1 - AppearsOnRadar: - RadarColorFromTerrain: - Terrain: Tree - EditorAppearance: - RelativeToTopLeft: yes - ProximityCaptor: - Types:Tree - -^Husk: - Husk: - RenderUnit: - Health: - HP: 140 - Armor: - Type: Heavy - HiddenUnderFog: - AppearsOnRadar: - Burns: - ProximityCaptor: - Types:Husk - -^Bridge: - Tooltip: - Name: Bridge - BelowUnits: - TargetableBuilding: - TargetTypes: Ground, Water - Building: - Footprint: ____ ____ - Dimensions: 4,2 - Health: - HP: 1000 - ProximityCaptor: - Types:Bridge - AutoTargetIgnore: + Sellable: \ No newline at end of file From 083952a531e6af32a63fbd4e6f23415c69b715ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 26 May 2012 13:06:02 +0200 Subject: [PATCH 09/36] added Dune 2000 music, voices --- mods/d2k/mod.yaml | 3 +++ mods/d2k/music.yaml | 37 ++++++++++++++++++++++++++++++++++++ mods/d2k/rules/vehicles.yaml | 2 +- mods/d2k/voices.yaml | 20 ++++++++++++------- 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 mods/d2k/music.yaml diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 900e0cd16c..ddb1b227f8 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -11,6 +11,8 @@ Folders: ./mods/d2k/bits ./mods/d2k/uibits ~^/Content/d2k + ~^/Content/d2k/GAMESFX + ~^/Content/d2k/Music Packages: arrakis.mix @@ -50,6 +52,7 @@ TileSets: #TileSize: 32 Music: + mods/d2k/music.yaml Movies: diff --git a/mods/d2k/music.yaml b/mods/d2k/music.yaml new file mode 100644 index 0000000000..b562bd9e4b --- /dev/null +++ b/mods/d2k/music.yaml @@ -0,0 +1,37 @@ +# requires Dune 2000/DATA/Music copied to OpenRA/Content/d2k +AMBUSH: The Ambush + Extension: AUD +ARAKATAK: Attack on Arrakis + Extension: AUD +ATREGAIN: The Atreides Gain + Extension: AUD +ENTORDOS: Enter the Ordos + Extension: AUD +FIGHTPWR: Fight for Power + Extension: AUD +# this one crashes the game at startup: +#FREMEN: The Fremen +# Extension: AUD +HARK_BAT: Harkonnen Battle + Extension: AUD +LANDSAND: Land of Sand + Extension: AUD +OPTIONS: Options + Extension: AUD +PLOTTING: Plotting + Extension: AUD +RISEHARK: Rise of Harkonnen + Extension: AUD +ROBOTIX: Robotix + Extension: AUD +# this one crashes the game at startup: +#SCORE: Score +# Extension: AUD +SOLDAPPR: The Soldiers Approach + Extension: AUD +SPICESCT: Spice Scouting + Extension: AUD +UNDERCON: Under Construction + Extension: AUD +WAITGAME: The Waiting Game + Extension: AUD \ No newline at end of file diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 696c6bc4aa..2888c737c5 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -27,7 +27,7 @@ MCV: IntoActor: conyarda Offset:-1,-1 TransformSounds: placbldg.aud, build5.aud - NoTransformSounds: nodeply1.aud + NoTransformSounds: AI_DPLOY.AUD RenderUnit: Image: MCV PlayerPalette: d2kplayer diff --git a/mods/d2k/voices.yaml b/mods/d2k/voices.yaml index 414c92fec5..852581dcca 100644 --- a/mods/d2k/voices.yaml +++ b/mods/d2k/voices.yaml @@ -1,13 +1,19 @@ -# Classic Red Alert Mod -- Package Manifest +# requires Dune 2000/DATA/GAMESFX copied to OpenRA/Content/d2k GenericVoice: Variants: - atreides: .v01,.v03 - harkonnen: .v01,.v03 - ordos: .v01,.v03 + atreides: .AUD + harkonnen: .AUD + ordos: .AUD + Voices: + Select: G_SSEL1,G_SSEL2,G_SSEL3 + Move: G_SCONF1,G_SCONF2,G_SCONF3 VehicleVoice: Variants: - atreides: .v00,.v02 - harkonnen: .v00,.v02 - ordos: .v00,.v02 + atreides: .AUD + harkonnen: .AUD + ordos: .AUD + Voices: + Select: G_SSEL1,G_SSEL2,G_SSEL3 + Move: G_SCONF1,G_SCONF2,G_SCONF3 \ No newline at end of file From ffbc76919e93f8472b86b5b8e262e51d2598a263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 26 May 2012 18:13:51 +0200 Subject: [PATCH 10/36] make Dune 2000 an independent mod Arrakis tileset now loads properly --- mods/d2k/TODO | 5 +- mods/d2k/bits/cursor.pal | Bin 0 -> 768 bytes mods/d2k/chrome.yaml | 350 ++++++++++++++++++++++ mods/d2k/chrome/cheats.yaml | 76 +++++ mods/d2k/chrome/create-server.yaml | 78 +++++ mods/d2k/chrome/dropdowns.yaml | 50 ++++ mods/d2k/chrome/gameinit.yaml | 158 ++++++++++ mods/d2k/chrome/ingame.yaml | 369 +++++++++++++++++++++++ mods/d2k/chrome/lobby.yaml | 465 +++++++++++++++++++++++++++++ mods/d2k/chrome/mainmenu.yaml | 331 +++++++++----------- mods/d2k/chrome/map-chooser.yaml | 74 +++++ mods/d2k/chrome/modchooser.yaml | 84 ++++++ mods/d2k/chrome/replaybrowser.yaml | 102 +++++++ mods/d2k/chrome/serverbrowser.yaml | 215 +++++++++++++ mods/d2k/cursors.yaml | 271 +++++++++++++++++ mods/d2k/metrics.yaml | 6 + mods/d2k/mod.yaml | 35 ++- mods/d2k/rules/defaults.yaml | 150 ++-------- mods/d2k/rules/system.yaml | 31 +- mods/d2k/rules/vehicles.yaml | 2 - mods/d2k/sequences.yaml | 137 ++++++++- mods/d2k/weapons.yaml | 63 +++- mods/ra/rules/defaults.yaml | 159 ++++++++-- ripD2kGameFiles.sh | 3 + 24 files changed, 2842 insertions(+), 372 deletions(-) create mode 100644 mods/d2k/bits/cursor.pal create mode 100644 mods/d2k/chrome/cheats.yaml create mode 100644 mods/d2k/chrome/create-server.yaml create mode 100644 mods/d2k/chrome/dropdowns.yaml create mode 100644 mods/d2k/chrome/gameinit.yaml create mode 100644 mods/d2k/chrome/ingame.yaml create mode 100644 mods/d2k/chrome/lobby.yaml create mode 100644 mods/d2k/chrome/map-chooser.yaml create mode 100644 mods/d2k/chrome/modchooser.yaml create mode 100644 mods/d2k/chrome/replaybrowser.yaml create mode 100644 mods/d2k/chrome/serverbrowser.yaml create mode 100644 mods/d2k/cursors.yaml create mode 100644 mods/d2k/metrics.yaml diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 02e2e39a40..e5c4626c23 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -6,9 +6,9 @@ # construction yard crane animations missing # welding animation (factories) missing # chimney animation (refinery) missing -# Arrakis tileset crashes the game # create a tileset extractor for gamefiles to remove copyrighted content from distribution # replace ore with spice and mines with spice blooms +# add Smudge Types # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # support separate turret sequence with RenderBuildingTurreted @@ -27,4 +27,5 @@ # rework chrome UI, dialoges, tabs # add install rules to makefile (once more polished) # idea: frame 2998 (fremen siech) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) -# add sonic tank weapon (currently uses tesla) \ No newline at end of file +# add sonic tank weapon (currently uses tesla) +# replace RA mouse.shp, nopower.shp with Dune 2000 equivalent \ No newline at end of file diff --git a/mods/d2k/bits/cursor.pal b/mods/d2k/bits/cursor.pal new file mode 100644 index 0000000000000000000000000000000000000000..bb63fcdd50490a6ace83199cf15196a1e551c57e GIT binary patch literal 768 zcmWlX>5{7;5QV#v78wGj7yAT)^T#DeE+w)r215IPWK<`0|4kh^=V|qs}{yR z)(Lb-lJ&FKUJv_zUDw@qyWJUvvA0aqv~1gUJjZc7*Y*7nAt!YFz;OeFbVv?icwh&#yrBF(A>NpHXDaS@#I@Nd0Wgd^`;d&jf%X9gAl*_evOxb)+ z$By(3u4P>FKolrvh+r4Tb`)C3H+|P|tPP!Cw7b&dNO||^+K;aZ;Qrmtqq_9sd@8#- zS6`{jlPZngKhM`~zFp3juIXx_szMa3APJ3v6y7y}eu4 z)B1pQgjK@N@^`!cj?=5{uSa#M#E|ipWGciGMU@wD2j!NV?p?gK!j0jJZs6*~z9i0h zNKzEVw&xp`9oAJKIO4gPr+X5cL9q3Gu&nX9R@1*wEl&Bg@ogWD#^JQ{VI`+=<421MGttfJm#3KaJG+ Date: Sat, 26 May 2012 20:20:01 +0200 Subject: [PATCH 11/36] inherit units that differ only slightly for each faction --- mods/d2k/mod.yaml | 1 + mods/d2k/music.yaml | 10 +- mods/d2k/raw/d2k_BLOXBASE.tsx | 3019 ++++++++++++++++++++------------ mods/d2k/rules/aircraft.yaml | 3 - mods/d2k/rules/defaults.yaml | 22 +- mods/d2k/rules/infantry.yaml | 5 +- mods/d2k/rules/structures.yaml | 147 +- mods/d2k/rules/system.yaml | 4 - mods/d2k/rules/vehicles.yaml | 71 +- ripD2kGameFiles.sh | 12 +- 10 files changed, 1975 insertions(+), 1319 deletions(-) diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 050da91259..50768b6e07 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -41,6 +41,7 @@ Rules: mods/d2k/rules/structures.yaml mods/d2k/rules/aircraft.yaml mods/d2k/rules/infantry.yaml + mods/d2k/rules/atreides.yaml Sequences: mods/d2k/sequences.yaml diff --git a/mods/d2k/music.yaml b/mods/d2k/music.yaml index b562bd9e4b..ae048b4609 100644 --- a/mods/d2k/music.yaml +++ b/mods/d2k/music.yaml @@ -9,9 +9,8 @@ ENTORDOS: Enter the Ordos Extension: AUD FIGHTPWR: Fight for Power Extension: AUD -# this one crashes the game at startup: -#FREMEN: The Fremen -# Extension: AUD +FREMEN: The Fremen + Extension: AUD HARK_BAT: Harkonnen Battle Extension: AUD LANDSAND: Land of Sand @@ -24,9 +23,8 @@ RISEHARK: Rise of Harkonnen Extension: AUD ROBOTIX: Robotix Extension: AUD -# this one crashes the game at startup: -#SCORE: Score -# Extension: AUD +SCORE: Score + Extension: AUD SOLDAPPR: The Soldiers Approach Extension: AUD SPICESCT: Spice Scouting diff --git a/mods/d2k/raw/d2k_BLOXBASE.tsx b/mods/d2k/raw/d2k_BLOXBASE.tsx index e36616e824..a28511d643 100644 --- a/mods/d2k/raw/d2k_BLOXBASE.tsx +++ b/mods/d2k/raw/d2k_BLOXBASE.tsx @@ -1,1125 +1,1896 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 8c8c3fffa3..33fdaffe1a 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -24,7 +24,6 @@ CARRYALL: Speed: 15 LandableTerrainTypes: Clear,Rough,Road,Ore,Beach RenderUnit: - PlayerPalette: d2kplayer RenderCargo: WithShadow: Cargo: @@ -50,7 +49,6 @@ C17: Type: Heavy RenderUnit: Image: frigate - PlayerPalette: d2kplayer WithShadow: Cargo: MaxWeight: 10 @@ -89,7 +87,6 @@ ORNI: ROT: 4 Speed: 12 RenderUnit: - PlayerPalette: d2kplayer WithShadow: Selectable: Bounds: 38,32,0,0 diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 566a128e12..27beb9119a 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -165,6 +165,19 @@ GivesBounty: ^Wall: + Buildable: + Queue: Defense + BuildPaletteOrder: 1000 + SoundOnDamageTransition: + DamagedSound: + DestroyedSound: + Valued: + Cost: 100 + CustomSellValue: + Value: 0 + Tooltip: + Name: Concrete Wall + Description: Stop units and blocks enemy fire. AppearsOnRadar: Building: Dimensions: 1,1 @@ -172,11 +185,12 @@ BuildSounds: Adjacent: 7 TerrainTypes: Clear,Road - SoundOnDamageTransition: - DamagedSound: - DestroyedSound: + Health: + HP: 500 + Armor: + Type: Concrete Wall: - CrushClasses: wall + CrushClasses: heavywall LineBuild: Range: 8 SelectionDecorations: diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index 009385f4ba..dcdbabbe75 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -10,7 +10,7 @@ RIFLE: Name: Rifle Infantry Description: General-purpose infantry.\n Strong vs Infantry\n Weak vs Vehicles Selectable: - Bounds: 12,17,0,-9 + Bounds: 12,17,0,0 Health: HP: 50 Mobile: @@ -19,5 +19,4 @@ RIFLE: PrimaryWeapon: M1Carbine TakeCover: -RenderInfantry: - RenderInfantryProne: - PlayerPalette: d2kplayer \ No newline at end of file + RenderInfantryProne: \ No newline at end of file diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index c328afcf99..693b1ee5b2 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -1,4 +1,4 @@ -CONYARDA: +^CONYARD: Inherits: ^Building Building: Power: 0 @@ -13,11 +13,10 @@ CONYARDA: Bib: Production: Produces: Building,Defense - IronCurtainable: Valued: Cost: 2500 Tooltip: - Name: Atreides Construction Yard + Name: Construction Yard CustomSellValue: Value: 2500 BaseBuilding: @@ -26,21 +25,18 @@ CONYARDA: Offset:1,1 Facing: 270 ProductionBar: - RenderBuilding: - PlayerPalette: d2kplayer -PWRA: +^POWER: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 0 - Owner: atreides -# Hotkey: p + Hotkey: w Valued: Cost: 300 Tooltip: - Name: Atreides Windtrap - Description: Provides power for other Atreides structures + Name: Windtrap + Description: Provides power for other structures ProvidesCustomPrerequisite: Prerequisite: anypower Building: @@ -54,21 +50,18 @@ PWRA: RevealsShroud: Range: 4 Bib: - RenderBuilding: - PlayerPalette: d2kplayer -BARRA: +^BARRACKS: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 30 Prerequisites: anypower - Owner: atreides -# Hotkey: b + Hotkey: b Valued: Cost: 400 Tooltip: - Name: Atreides Barracks + Name: Barracks Description: Trains infantry Building: Power: -20 @@ -81,8 +74,6 @@ BARRA: RevealsShroud: Range: 5 Bib: - RenderBuilding: - PlayerPalette: d2kplayer RallyPoint: Exit@1: SpawnOffset: -1,19 @@ -95,18 +86,16 @@ BARRA: PrimaryBuilding: ProductionBar: -HIGHTECHA: +^HIGHTECH: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 50 - Prerequisites: refa - Owner: atreides Valued: Cost: 2000 Tooltip: Name: High Tech Factory - Description: Produces carryalls + Description: Produces Carryalls ProvidesCustomPrerequisite: Prerequisite: anyhightech Building: @@ -120,8 +109,6 @@ HIGHTECHA: RevealsShroud: Range: 4 Bib: - RenderBuilding: - PlayerPalette: d2kplayer RallyPoint: Exit@1: SpawnOffset: 5,0 @@ -131,13 +118,11 @@ HIGHTECHA: PrimaryBuilding: ProductionBar: -RESEARCHA: +^RESEARCH: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 50 - Prerequisites: heavya,radara - Owner: atreides Valued: Cost: 2000 Tooltip: @@ -154,20 +139,16 @@ RESEARCHA: RevealsShroud: Range: 4 Bib: - RenderBuilding: - PlayerPalette: d2kplayer -PALACEA: +^PALACE: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 50 - Prerequisites: researcha - Owner: atreides Valued: Cost: 2000 Tooltip: - Name: Atreides Palace + Name: Palace Description: Provides advanced technology Building: Power: -30 @@ -180,17 +161,16 @@ PALACEA: RevealsShroud: Range: 4 Bib: - RenderBuilding: - PlayerPalette: d2kplayer -REFA: +^REFINERY: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 10 Prerequisites: anypower - Owner: atreides + ProvidesCustomPrerequisite: + Prerequisite: anyref Valued: Cost: 1400 Tooltip: @@ -208,9 +188,6 @@ REFA: Range: 6 Bib: -RenderBuilding: - RenderBuildingWarFactory: - Image: REFA - PlayerPalette: d2kplayer OreRefinery: StoresOre: PipCount: 17 @@ -223,13 +200,11 @@ REFA: SpawnOffset: 1,2 Facing: 64 -SILOA: +^SILO: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 40 - Prerequisites: refa - Owner: atreides Valued: Cost: 150 Tooltip: @@ -244,21 +219,20 @@ SILOA: Type: Wood RevealsShroud: Range: 4 + -RenderBuilding: RenderBuildingSilo: - PlayerPalette: d2kplayer StoresOre: PipCount: 5 Capacity: 1500 - -RenderBuilding: -EmitInfantryOnSell: -LIGHTA: +^LIGHT: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 50 - Prerequisites: refa - Owner: atreides + ProvidesCustomPrerequisite: + Prerequisite: anylight Valued: Cost: 1000 Tooltip: @@ -276,9 +250,6 @@ LIGHTA: Range: 4 Bib: -RenderBuilding: - RenderBuildingWarFactory: - Image: LIGHTA - PlayerPalette: d2kplayer RallyPoint: Exit@1: SpawnOffset: 10,0 @@ -288,13 +259,13 @@ LIGHTA: PrimaryBuilding: ProductionBar: -HEAVYA: +^HEAVY: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 50 - Prerequisites: lighta - Owner: atreides + ProvidesCustomPrerequisite: + Prerequisite: anyheavy Valued: Cost: 2000 Tooltip: @@ -312,9 +283,6 @@ HEAVYA: Range: 4 Bib: -RenderBuilding: - RenderBuildingWarFactory: - Image: HEAVYA - PlayerPalette: d2kplayer RallyPoint: Exit@1: SpawnOffset: 10,0 @@ -324,15 +292,15 @@ HEAVYA: PrimaryBuilding: ProductionBar: -RADARA: +^RADAR: RequiresPower: CanPowerDown: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 60 - Prerequisites: barra - Owner: atreides + ProvidesCustomPrerequisite: + Prerequisite: anyradar Valued: Cost: 1400 Tooltip: @@ -349,11 +317,9 @@ RADARA: RevealsShroud: Range: 10 Bib: - RenderBuilding: - PlayerPalette: d2kplayer ProvidesRadar: -STARPORTA: +^STARPORT: Inherits: ^Building Valued: Cost: 2000 @@ -365,8 +331,6 @@ STARPORTA: Buildable: Queue: Building BuildPaletteOrder: 60 - Prerequisites: radara - Owner: atreides Building: Power: -30 Footprint: xxx xxx xxx @@ -375,8 +339,6 @@ STARPORTA: HP: 1000 RevealsShroud: Range: 7 - RenderBuilding: - PlayerPalette: d2kplayer Bib: RallyPoint: RallyPoint: 4,2 @@ -391,45 +353,13 @@ STARPORTA: Group: Vehicle BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: - ReadyAudio: - OnHoldAudio: - CancelledAudio: ProductionBar: -WALLA: - Inherits: ^Wall - Buildable: - Queue: Defense - BuildPaletteOrder: 1000 - Prerequisites: conyarda - Owner: atreides - Valued: - Cost: 100 - CustomSellValue: - Value: 0 - Tooltip: - Name: Concrete Wall - Description: Stop units and blocks enemy fire. - SoundOnDamageTransition: - DamagedSound: crmble2.aud - DestroyedSound: kaboom30.aud - Health: - HP: 500 - Armor: - Type: Concrete - Wall: - CrushClasses: heavywall - RenderBuildingWall: - Palette: d2k - -GUNTOWERA: +^GUNTOWER: Inherits: ^Building Buildable: Queue: Defense BuildPaletteOrder: 40 - Prerequisites: barra - Owner: atreides Valued: Cost: 600 Tooltip: @@ -445,29 +375,27 @@ GUNTOWERA: Type: Heavy RevealsShroud: Range: 7 + RenderRangeCircle: + -RenderBuilding: + RenderBuildingTurreted: + Palette: d2k Turreted: ROT: 12 InitialFacing: 50 - RenderBuildingTurreted: - Palette: d2k AttackTurreted: PrimaryWeapon: TurretGun AutoTarget: - -RenderBuilding: - RenderRangeCircle: -REPAIRA: +^REPAIR: Inherits: ^Building Buildable: Queue: Building BuildPaletteOrder: 30 - Prerequisites: heavya - Owner: atreides Valued: Cost: 1000 Tooltip: Name: Repair Pad - Description: Repairs vehicles, and allows\n the construction of additional bases. + Description: Repairs vehicles and allows\n the construction of additional bases. Building: Power: -30 Footprint: xxx xxx xxx @@ -478,9 +406,8 @@ REPAIRA: Type: Wood RevealsShroud: Range: 5 - RenderBuilding: - PlayerPalette: d2kplayer BelowUnits: Reservable: RepairsUnits: + Interval: 10 RallyPoint: \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index a332b40072..46e4a5e7c8 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -38,10 +38,6 @@ Player: PlayerColorPalette: BasePalette: d2k PaletteFormat: d2k - PlayerColorPalette@d2kplayer: - BasePalette: d2k - BaseName: d2kplayer - PaletteFormat: d2k DebugResourceCash: DebugResourceOre: DebugResourceOreCapacity: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index ecabbf0618..ff04b3e593 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -1,10 +1,8 @@ -MCV: +^MCV: Inherits: ^Vehicle Buildable: Queue: Vehicle BuildPaletteOrder: 110 - Prerequisites: heavya,repaira - Owner: atreides Valued: Cost: 2000 Tooltip: @@ -22,15 +20,7 @@ MCV: Crushes: crate, infantry RevealsShroud: Range: 4 - Transforms: - Facing: 10 - IntoActor: conyarda - Offset:-1,-1 - TransformSounds: placbldg.aud, build5.aud - NoTransformSounds: AI_DPLOY.AUD RenderUnit: - Image: MCV - PlayerPalette: d2kplayer MustBeDestroyed: BaseBuilding: -AttackMove: @@ -40,7 +30,7 @@ HARVESTER: Buildable: Queue: Vehicle BuildPaletteOrder: 10 - Prerequisites: refa,heavya + Prerequisites: anyref,anyheavy Owner: atreides Valued: Cost: 1100 @@ -52,7 +42,7 @@ HARVESTER: Bounds: 42,42 Harvester: Capacity: 20 - Resources: Ore,Gems + Resources: Spice UnloadTicksPerBale: 1 Health: HP: 600 @@ -60,11 +50,10 @@ HARVESTER: Type: Heavy Mobile: Speed: 6 - Crushes: wall, atmine, crate, infantry + Crushes: crate, infantry + RenderUnit: RevealsShroud: Range: 4 - RenderUnit:: - PlayerPalette: d2kplayer -AttackMove: TRIKE: @@ -72,7 +61,7 @@ TRIKE: Buildable: Queue: Vehicle BuildPaletteOrder: 15 - Prerequisites: lighta + Prerequisites: anylight Owner: atreides Valued: Cost: 200 @@ -91,7 +80,6 @@ TRIKE: RevealsShroud: Range: 8 RenderUnit: - PlayerPalette: d2kplayer AttackFrontal: PrimaryWeapon: M60mg PrimaryOffset: 0,0,0,-4 @@ -102,7 +90,7 @@ QUAD: Buildable: Queue: Vehicle BuildPaletteOrder: 30 - Prerequisites: lighta + Prerequisites: anylight Owner: atreides Valued: Cost: 400 @@ -119,25 +107,22 @@ QUAD: RevealsShroud: Range: 7 RenderUnit: - PlayerPalette: d2kplayer AttackFrontal: PrimaryWeapon: QuadRockets PrimaryOffset: 0,0,0,-2 PrimaryLocalOffset: -4,0,0,0,25, 4,0,0,0,-25 AutoTarget: -COMBATA: +^COMBAT: Inherits: ^Tank Buildable: Queue: Vehicle BuildPaletteOrder: 60 - Prerequisites: heavya - Owner: atreides Valued: Cost: 850 Tooltip: Name: Combat Tank - Description: Atreides Main Battle Tank.\n Strong vs Tanks, Light Vehicles\n Weak vs Infantry, Aircraft + Description: Main Battle Tank.\n Strong vs Tanks, Light Vehicles\n Weak vs Infantry, Aircraft Health: HP: 450 Armor: @@ -154,7 +139,6 @@ COMBATA: PrimaryRecoil: 3 PrimaryRecoilRecovery: 0.9 RenderUnitTurreted: - PlayerPalette: d2kplayer AutoTarget: Explodes: Weapon: UnitExplodeSmall @@ -167,7 +151,7 @@ SIEGE: Buildable: Queue: Vehicle BuildPaletteOrder: 80 - Prerequisites: radara + Prerequisites: anyradar Owner: atreides Valued: Cost: 600 @@ -190,7 +174,6 @@ SIEGE: PrimaryRecoil: 3 PrimaryRecoilRecovery: 0.9 RenderUnitTurreted: - PlayerPalette: d2kplayer Explodes: Weapon: UnitExplode Chance: 75 @@ -206,7 +189,7 @@ Missile: Buildable: Queue: Vehicle BuildPaletteOrder: 50 - Prerequisites: heavya + Prerequisites: anyheavy Owner: atreides Mobile: Speed: 6 @@ -216,39 +199,9 @@ Missile: Type: Light RevealsShroud: Range: 6 + RenderUnit: AttackFrontal: PrimaryWeapon: 227mm PrimaryOffset: 0,6,0,-3 PrimaryLocalOffset: 3,-5,0,0,0, -3,-5,0,0,0 - RenderUnit: - PlayerPalette: d2kplayer - AutoTarget: - -SONIC: - Inherits: ^Vehicle - Buildable: - Queue: Vehicle - BuildPaletteOrder: 15 - Prerequisites: heavya,researcha - Owner: atreides - Valued: - Cost: 1500 - Tooltip: - Name: Sonic Tank - Description: Fires a sound wave\n Strong vs Infantry.\n Weak vs Tanks - Selectable: - Bounds: 24,24 - Health: - HP: 150 - Armor: - Type: Light - Mobile: - Speed: 8 - RevealsShroud: - Range: 7 - RenderUnit: - PlayerPalette: d2kplayer - AttackFrontal: - PrimaryWeapon: TTankZap - PrimaryOffset: 0,0,0,-5 AutoTarget: \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index ce3828e3d8..9886252544 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -167,12 +167,12 @@ mono OpenRA.Utility.exe --shp saboteuricon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4035 4035 "deathhandicon" mono OpenRA.Utility.exe --shp deathhandicon.png 60 # 4036..4045 = repetitions -mono OpenRA.Utility.exe --r8 $R8 $PAL 4046 4046 "conyardicona" # = 4049 -mono OpenRA.Utility.exe --shp conyardicona.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4047 4047 "conyardiconh" -mono OpenRA.Utility.exe --shp conyardiconh.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4048 4048 "conyardicono" -mono OpenRA.Utility.exe --shp conyardicono.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4046 4046 "conyardaicon" # = 4049 +mono OpenRA.Utility.exe --shp conyardaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4047 4047 "conyardhicon" +mono OpenRA.Utility.exe --shp conyardhicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4048 4048 "conyardaicon" +mono OpenRA.Utility.exe --shp conyardoicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4050 4050 "4plateicon" # = 4051..4052 mono OpenRA.Utility.exe --shp 4plateicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4053 4053 "6plateicon" # = 4054..4055 From 1fcf044980ed8d74f3a8bb9ba2ad14589329581c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 27 May 2012 10:40:08 +0200 Subject: [PATCH 12/36] added flags, worked on the UI looks crappy, needs someone who is good at this --- mods/d2k/chrome.yaml | 10 +-- mods/d2k/maps/test.oramap | Bin 878 -> 1118 bytes mods/d2k/rules/atreides.yaml | 148 +++++++++++++++++++++++++++++++++++ mods/d2k/rules/system.yaml | 19 ++--- mods/d2k/uibits/buttons.png | Bin 0 -> 22345 bytes mods/d2k/uibits/dialog.png | Bin 19234 -> 18213 bytes ripD2kGameFiles.sh | 8 ++ 7 files changed, 168 insertions(+), 17 deletions(-) create mode 100644 mods/d2k/rules/atreides.yaml create mode 100644 mods/d2k/uibits/buttons.png diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index 81993a5bba..ebc7405138 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -168,11 +168,11 @@ tabs-normal: tabs.png harkonnen-Ship: 134,200,27,41 flags: buttons.png - atreides: 60,84,30,15 - harkonnen: 60,84,30,15 - orodos: 60,84,30,15 - random: 60,84,30,15 - spectator: 60,84,30,15 + atreides: 0,84,21,107 + harkonnen: 22,84,45,107 + orodos: 45,84,67,107 + random: 67,84,90,107 + spectator: 67,84,90,107 dialog2: dialog.png background: 513,1,126,126 diff --git a/mods/d2k/maps/test.oramap b/mods/d2k/maps/test.oramap index d97a361db95e889e6125a526de7d228c823abd71..7b592f36c1071c458b2136eabde2fbb6463d7a9d 100644 GIT binary patch delta 613 zcmaFIc8{Yzz?+#xgn@y9gCTMCE{C1xYuCv!F)*+?FfypK^LGRk?=O%x@;nv_^|NOt@pZ&#q?6(O%xcqZ{QBKht z`P&>HUjC6^8T&U{?|;4a*8cL<_0wP6x4X9nLe2dbyQuzm#r?1Eh5p_?{(I-P*&S!^ zT#jgP{awD{rpv7}w!N$`{=WX({r$cFyZa}H}Udih85-@m=JZ~E)3>bv&W=ga?I zJpW$&(fj+i_y4`<|NZ}?_xEq}$GwkdXvp;4KFj;a(%WTace7N2wf|pnsqQT4{HFbX z%kNvCvvRkyU9NjG?dSSw^;zwg>v~E|{y)3_XY-Li^1JF&|B283@4Te>=layEYoEy! z_B|6R>`Ig0X#W4}C;!zM=O>=KI8SNrqPy<5X4gYP7EbQS`*v7ZsjBdwvHU!Ni`}2+ z|NPL>5jW@mnRa!TFOUBGZT|RwN&WKf2$!wD%6E0RhOEZqT$TS_9&kiy)xG`AN@9Uu z|H+DM>{#{v{Q{usz4h#_I!cob8RaKCFtQ1B{9r~&Dw`7+XEAcZlgwmhW*w&0yCxel SOEWn$P4;7!V!O)>aw!1z%|F}# delta 352 zcmcb|@s6!Nz?+#xgn@y9gCTL#R)h270&)okbK4ke_(E3HY3YT0{LFk z<&uQozItzSMD5nS`--?pCZH|ylMR?y1sXcyQ9@~R0Mjf+PIzcd{>-eyv}x;PMHXqM QV8+RIEK+Q5nLr@{03rdZ3IG5A diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml new file mode 100644 index 0000000000..52df17fd4d --- /dev/null +++ b/mods/d2k/rules/atreides.yaml @@ -0,0 +1,148 @@ +CONYARDA: + Inherits: ^CONYARD + Buildable: + Owner: atreides + +PWRA: + Inherits: ^POWER + Buildable: + Prerequisites: conyarda + Owner: atreides + +REFA: + Inherits: ^REFINERY + Buildable: + Prerequisites: pwra + Owner: atreides + RenderBuildingWarFactory: + Image: REFA + +BARRA: + Inherits: ^BARRACKS + Buildable: + Prerequisites: pwra + Owner: atreides + +HIGHTECHA: + Inherits: ^HIGHTECH + Buildable: + Prerequisites: radara + Owner: atreides + +RESEARCHA: + Inherits: ^RESEARCH + Buildable: + Prerequisites: radara,heavya + Owner: atreides + +PALACEA: + Inherits: ^PALACE + Buildable: + Prerequisites: researcha + Owner: atreides + +SILOA: + Inherits: ^SILO + Buildable: + Prerequisites: refa + Owner: atreides + +LIGHTA: + Inherits: ^LIGHT + Buildable: + Prerequisites: refa + Owner: atreides + RenderBuildingWarFactory: + Image: LIGHTA + +HEAVYA: + Inherits: ^HEAVY + Buildable: + Prerequisites: lighta + Owner: atreides + RenderBuildingWarFactory: + Image: HEAVYA + +RADARA: + Inherits: ^RADAR + Buildable: + Prerequisites: barra + Owner: atreides + +STARPORTA: + Inherits: ^STARPORT + Buildable: + Prerequisites: radara + Owner: atreides + ProductionQueue: + QueuedAudio: AI_ORDER.AUD + ReadyAudio: AI_REINF.AUD + OnHoldAudio: AI_HOLD.AUD + CancelledAudio: AI_CANCL.AUD + +WALLA: + Inherits: ^Wall + Buildable: + Prerequisites: conyarda + Owner: atreides + +GUNTOWERA: + Inherits: ^GUNTOWER + Buildable: + Prerequisites: barra + Owner: atreides + +REPAIRA: + Inherits: ^REPAIR + Buildable: + Prerequisites: heavya + Owner: atreides + +#TODO: game has to spawn MCVA, MCVH, MCVO instead of MCV for everyone +MCV: + Inherits: ^MCV + Buildable: + Prerequisites: heavya,repaira + Owner: atreides + Transforms: + Facing: 10 + IntoActor: conyarda + Offset:-1,-1 + TransformSounds: + NoTransformSounds: AI_DPLOY.AUD + RenderUnit: + Image: MCV + +COMBATA: + Inherits: ^COMBAT + Buildable: + Prerequisites: heavya + Owner: atreides + +SONIC: + Inherits: ^Vehicle + Buildable: + Queue: Vehicle + BuildPaletteOrder: 15 + Prerequisites: heavya,researcha + Owner: atreides + Valued: + Cost: 1500 + Tooltip: + Name: Sonic Tank + Description: Fires a sound wave\n Strong vs Infantry.\n Weak vs Tanks + Selectable: + Bounds: 24,24 + Health: + HP: 150 + Armor: + Type: Light + Mobile: + Speed: 8 + RevealsShroud: + Range: 7 + RenderUnit: + AttackFrontal: + PrimaryWeapon: TTankZap + PrimaryOffset: 0,0,0,-5 + AutoTarget: \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 46e4a5e7c8..1a31090e45 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -1,17 +1,18 @@ +#TODO: Currently only uses the Atreides voices. Player: TechTree: ClassicProductionQueue@Building: Type: Building BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: abldgin1.aud - ReadyAudio: conscmp1.aud + QueuedAudio: AI_BUILD.AUD + ReadyAudio: AI_BDRDY.AUD ClassicProductionQueue@Defense: Type: Defense BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: abldgin1.aud - ReadyAudio: conscmp1.aud + QueuedAudio: AI_BUILD.AUD + ReadyAudio: AI_BDRDY.AUD ClassicProductionQueue@Vehicle: Type: Vehicle BuildSpeed: .4 @@ -27,8 +28,8 @@ Player: PlaceBuilding: SupportPowerManager: ConquestVictoryConditions: - WinNotification:misnwon1.aud - LoseNotification:misnlst1.aud + WinNotification:AI_MWIN.AUD + LoseNotification:AI_MFAIL.AUD PowerManager: AllyRepair: PlayerResources: @@ -152,9 +153,6 @@ CRATE: UseCashTick: yes LevelUpCrateAction: SelectionShares: 40 - ExplodeCrateAction@fire: - Weapon: CrateNapalm - SelectionShares: 5 ExplodeCrateAction@boom: Weapon: CrateExplosion SelectionShares: 5 @@ -167,9 +165,6 @@ CRATE: RevealMapCrateAction: SelectionShares: 1 Effect: reveal-map - SupportPowerCrateAction@parabombs: - SelectionShares: 5 - Proxy: powerproxy.parabombs GiveMcvCrateAction: SelectionShares: 2 NoBaseSelectionShares: 9001 diff --git a/mods/d2k/uibits/buttons.png b/mods/d2k/uibits/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..edeff9875f5214dfd921f5077889d9e14e440ce9 GIT binary patch literal 22345 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 T7&C4`^ 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 VhJvE(p-}~)z4|74={p@R{V%IlTF?Lh diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 9886252544..dc3c5a1334 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -5,6 +5,14 @@ PAL="mods/d2k/bits/d2k.pal" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 2 "overlay" mono OpenRA.Utility.exe --shp overlay.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 40 101 "shroud" +mono OpenRA.Utility.exe --shp shroud.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 102 105 "crates" +mono OpenRA.Utility.exe --shp crates.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 106 109 "spicebloom" +mono OpenRA.Utility.exe --shp spicebloom.png 32 + + mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" mono OpenRA.Utility.exe --shp spice.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 206 457 "rifle" --infantry From e0e1011d302160fb8e6eda0ab1a82b8bb7aaba98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 27 May 2012 12:45:35 +0200 Subject: [PATCH 13/36] added Harkonnen --- mods/d2k/chrome.yaml | 4 +- mods/d2k/chrome/lobby.yaml | 12 +- mods/d2k/mod.yaml | 1 + mods/d2k/rules/aircraft.yaml | 2 +- mods/d2k/rules/atreides.yaml | 21 +- mods/d2k/rules/defaults.yaml | 47 +---- mods/d2k/rules/harkonnen.yaml | 144 +++++++++++++ mods/d2k/rules/infantry.yaml | 2 +- mods/d2k/rules/structures.yaml | 53 ++++- mods/d2k/rules/system.yaml | 15 +- mods/d2k/rules/vehicles.yaml | 10 +- mods/d2k/sequences.yaml | 357 ++++++++++++++++++++++++--------- ripD2kGameFiles.sh | 53 ++++- 13 files changed, 534 insertions(+), 187 deletions(-) create mode 100644 mods/d2k/rules/harkonnen.yaml diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index ebc7405138..30d43efffe 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -169,8 +169,8 @@ tabs-normal: tabs.png flags: buttons.png atreides: 0,84,21,107 - harkonnen: 22,84,45,107 - orodos: 45,84,67,107 + harkonnen: 22,84,23,107 + ordos: 45,84,22,107 random: 67,84,90,107 spectator: 67,84,90,107 diff --git a/mods/d2k/chrome/lobby.yaml b/mods/d2k/chrome/lobby.yaml index a3ead71d0d..d28680a9ee 100644 --- a/mods/d2k/chrome/lobby.yaml +++ b/mods/d2k/chrome/lobby.yaml @@ -12,7 +12,7 @@ Background@SERVER_LOBBY: Width:800 Height:20 Font:Bold - Text:OpenRA Multiplayer Lobby + Text:OpenD2k Multiplayer Lobby Background@LOBBY_MAP_BG: X:PARENT_RIGHT-268 Y:50 @@ -70,15 +70,15 @@ Background@SERVER_LOBBY: Y:0 Children: Image@FACTIONFLAG: - Width:30 - Height:15 + Width:23 + Height:23 X:5 - Y:5 + Y:0 Label@FACTIONNAME: Text:Faction - Width:60 + Width:70 Height:25 - X:40 + X:30 Y:0 DropDownButton@TEAM: Text:Team diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 50768b6e07..7973006f43 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -42,6 +42,7 @@ Rules: mods/d2k/rules/aircraft.yaml mods/d2k/rules/infantry.yaml mods/d2k/rules/atreides.yaml + mods/d2k/rules/harkonnen.yaml Sequences: mods/d2k/sequences.yaml diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 33fdaffe1a..d497db00ac 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -5,7 +5,7 @@ CARRYALL: BuildPaletteOrder: 110 Prerequisites: anyhightech BuiltAt: hightecha - Owner: atreides + Owner: atreides,harkonnen Valued: Cost: 1200 Tooltip: diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml index 52df17fd4d..539611f967 100644 --- a/mods/d2k/rules/atreides.yaml +++ b/mods/d2k/rules/atreides.yaml @@ -2,6 +2,10 @@ CONYARDA: Inherits: ^CONYARD Buildable: Owner: atreides + Transforms: + IntoActor: mcva + Offset:1,1 + Facing: 270 PWRA: Inherits: ^POWER @@ -80,26 +84,13 @@ STARPORTA: OnHoldAudio: AI_HOLD.AUD CancelledAudio: AI_CANCL.AUD -WALLA: - Inherits: ^Wall - Buildable: - Prerequisites: conyarda - Owner: atreides - -GUNTOWERA: - Inherits: ^GUNTOWER - Buildable: - Prerequisites: barra - Owner: atreides - REPAIRA: Inherits: ^REPAIR Buildable: Prerequisites: heavya Owner: atreides -#TODO: game has to spawn MCVA, MCVH, MCVO instead of MCV for everyone -MCV: +MCVA: Inherits: ^MCV Buildable: Prerequisites: heavya,repaira @@ -110,8 +101,6 @@ MCV: Offset:-1,-1 TransformSounds: NoTransformSounds: AI_DPLOY.AUD - RenderUnit: - Image: MCV COMBATA: Inherits: ^COMBAT diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 27beb9119a..b08419a8f3 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -162,49 +162,4 @@ Types:Building Sellable: AcceptsSupplies: - GivesBounty: - -^Wall: - Buildable: - Queue: Defense - BuildPaletteOrder: 1000 - SoundOnDamageTransition: - DamagedSound: - DestroyedSound: - Valued: - Cost: 100 - CustomSellValue: - Value: 0 - Tooltip: - Name: Concrete Wall - Description: Stop units and blocks enemy fire. - AppearsOnRadar: - Building: - Dimensions: 1,1 - Footprint: x - BuildSounds: - Adjacent: 7 - TerrainTypes: Clear,Road - Health: - HP: 500 - Armor: - Type: Concrete - Wall: - CrushClasses: heavywall - LineBuild: - Range: 8 - SelectionDecorations: - Selectable: - Priority: 1 - TargetableBuilding: - TargetTypes: Ground - RenderBuildingWall: - HasMakeAnimation: false - Palette: d2k - GivesExperience: - EditorAppearance: - RelativeToTopLeft: yes - AutoTargetIgnore: - ProximityCaptor: - Types:Wall - Sellable: \ No newline at end of file + GivesBounty: \ No newline at end of file diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml new file mode 100644 index 0000000000..8894f23e87 --- /dev/null +++ b/mods/d2k/rules/harkonnen.yaml @@ -0,0 +1,144 @@ +CONYARDH: + Inherits: ^CONYARD + Buildable: + Owner: harkonnen + Transforms: + IntoActor: mcvh + Offset:1,1 + Facing: 270 + +PWRH: + Inherits: ^POWER + Buildable: + Prerequisites: conyardh + Owner: harkonnen + +REFH: + Inherits: ^REFINERY + Buildable: + Prerequisites: pwrh + Owner: harkonnen + RenderBuildingWarFactory: + Image: REFH + +BARRH: + Inherits: ^BARRACKS + Buildable: + Prerequisites: pwrh + Owner: harkonnen + +HIGHTECHH: + Inherits: ^HIGHTECH + Buildable: + Prerequisites: radarh + Owner: harkonnen + +RESEARCHH: + Inherits: ^RESEARCH + Buildable: + Prerequisites: radarh,heavyh + Owner: harkonnen + +PALACEH: + Inherits: ^PALACE + Buildable: + Prerequisites: researchh + Owner: harkonnen + +SILOH: + Inherits: ^SILO + Buildable: + Prerequisites: refh + Owner: harkonnen + +LIGHTH: + Inherits: ^LIGHT + Buildable: + Prerequisites: refh + Owner: harkonnen + RenderBuildingWarFactory: + Image: LIGHTH + +HEAVYH: + Inherits: ^HEAVY + Buildable: + Prerequisites: lighth + Owner: harkonnen + RenderBuildingWarFactory: + Image: HEAVYH + +RADARH: + Inherits: ^RADAR + Buildable: + Prerequisites: barrh + Owner: harkonnen + +STARPORTH: + Inherits: ^STARPORT + Buildable: + Prerequisites: radarh + Owner: harkonnen + ProductionQueue: + QueuedAudio: HI_ORDER.AUD + ReadyAudio: HI_REINF.AUD + OnHoldAudio: HI_HOLD.AUD + CancelledAudio: HI_CANCL.AUD + +REPAIRH: + Inherits: ^REPAIR + Buildable: + Prerequisites: heavyh + Owner: harkonnen + +MCVH: + Inherits: ^MCV + Buildable: + Prerequisites: heavyh,repairh + Owner: harkonnen + Transforms: + Facing: 10 + IntoActor: conyardh + Offset:-1,-1 + TransformSounds: + NoTransformSounds: HI_DPLOY.AUD + +COMBATH: + Inherits: ^COMBAT + Buildable: + Prerequisites: heavyh + Owner: harkonnen + +DEVAST: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 100 + Prerequisites: repairh,researchh + Owner: harkonnen + Valued: + Cost: 1800 + Tooltip: + Name: Devastator + Description: Big and slow tank.\n Strong vs Tanks\n Weak vs Infantry, Aircraft + Health: + HP: 900 + Armor: + Type: Heavy + Mobile: + Speed: 3 + Crushes: crate, infantry + RevealsShroud: + Range: 6 + RenderUnit: + AttackFrontal: + PrimaryWeapon: 120mm + PrimaryLocalOffset: -4,-5,0,0,0, 4,-5,0,0,0 + PrimaryRecoil: 4 + PrimaryRecoilRecovery: 0.7 + AutoTarget: + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + LeavesHusk: + Selectable: + Bounds: 44,38,0,-4 \ No newline at end of file diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index dcdbabbe75..06e000e694 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -3,7 +3,7 @@ RIFLE: Buildable: Queue: Infantry BuildPaletteOrder: 10 - Owner: atreides + Owner: atreides,harkonnen Valued: Cost: 100 Tooltip: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 693b1ee5b2..bd655b9695 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -20,10 +20,6 @@ CustomSellValue: Value: 2500 BaseBuilding: - Transforms: - IntoActor: mcv - Offset:1,1 - Facing: 270 ProductionBar: ^POWER: @@ -355,11 +351,58 @@ LowPowerSlowdown: 3 ProductionBar: -^GUNTOWER: +WALL: + Buildable: + Queue: Defense + BuildPaletteOrder: 1000 + Owner: atreides,harkonnen + SoundOnDamageTransition: + DamagedSound: + DestroyedSound: + Valued: + Cost: 100 + CustomSellValue: + Value: 0 + Tooltip: + Name: Concrete Wall + Description: Stop units and blocks enemy fire. + AppearsOnRadar: + Building: + Dimensions: 1,1 + Footprint: x + BuildSounds: + Adjacent: 7 + TerrainTypes: Clear,Road + Health: + HP: 500 + Armor: + Type: Concrete + Wall: + CrushClasses: heavywall + LineBuild: + Range: 8 + SelectionDecorations: + Selectable: + Priority: 1 + TargetableBuilding: + TargetTypes: Ground + RenderBuildingWall: + HasMakeAnimation: false + Palette: d2k + GivesExperience: + EditorAppearance: + RelativeToTopLeft: yes + AutoTargetIgnore: + ProximityCaptor: + Types:Wall + Sellable: + +GUNTOWER: Inherits: ^Building Buildable: Queue: Defense BuildPaletteOrder: 40 + Owner: atreides,harkonnen Valued: Cost: 600 Tooltip: diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 1a31090e45..22eaedd78f 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -105,9 +105,9 @@ World: Country@2: Name: Atreides Race: atreides -# Country@3: -# Name: Harkonnen -# Race: harkonnen + Country@3: + Name: Harkonnen + Race: harkonnen # Country@4: # Name: Ordos # Race: ordos @@ -134,7 +134,14 @@ World: SpawnMapActors: CreateMPPlayers: MPStartLocations: - SpawnMPUnits: + SpawnMPUnits@atreides: + InitialUnit: mcva + Faction: atreides + SpawnMPUnits@harkonnen: + InitialUnit: mcvh + Faction: harkonnen +# SpawnMPUnits@ordos: +# InitialUnit: mcvo EvaAlerts: SpatialBins: BinSize: 4 diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index ff04b3e593..c73cd08444 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -8,6 +8,7 @@ Tooltip: Name: Mobile Construction Vehicle Description: Deploys into another Construction Yard.\n Unarmed + Icon: mcvicon Selectable: Priority: 3 Bounds: 42,42 @@ -21,6 +22,7 @@ RevealsShroud: Range: 4 RenderUnit: + Image: MCV MustBeDestroyed: BaseBuilding: -AttackMove: @@ -62,7 +64,7 @@ TRIKE: Queue: Vehicle BuildPaletteOrder: 15 Prerequisites: anylight - Owner: atreides + Owner: atreides,harkonnen Valued: Cost: 200 Tooltip: @@ -91,7 +93,7 @@ QUAD: Queue: Vehicle BuildPaletteOrder: 30 Prerequisites: anylight - Owner: atreides + Owner: atreides,harkonnen Valued: Cost: 400 Tooltip: @@ -152,7 +154,7 @@ SIEGE: Queue: Vehicle BuildPaletteOrder: 80 Prerequisites: anyradar - Owner: atreides + Owner: atreides,harkonnen Valued: Cost: 600 Tooltip: @@ -190,7 +192,7 @@ Missile: Queue: Vehicle BuildPaletteOrder: 50 Prerequisites: anyheavy - Owner: atreides + Owner: atreides,harkonnen Mobile: Speed: 6 Health: diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index f5d1e01af2..594a8fb012 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -18,6 +18,124 @@ harvester: Start: 0 Length: 1 +wall: + idle: + Start: 0 + Length: 16 + scratched-idle: + Start: 0 + Length: 16 + damaged-idle: + Start: 16 + Length: 16 + critical-idle: + Start: 16 + Length: 16 + +carryall: + idle: + Start: 0 + Facings: 32 + unload: + Start: 0 + Facings: 32 + +orni: + idle: + Start: 0 + Facings: 32 + +trike: + idle: + Start: 0 + Facings: 32 + +quad: + idle: + Start: 0 + Facings: 32 + + + +siege: + idle: + Start: 0 + Facings: 32 + turret: siegeturret + Start: 0 + Facings: 32 + +missile: + idle: + Start: 0 + Facings: 32 + +sonic: + idle: + Start: 0 + Facings: 32 + +guntower: + idle: + Start: 0 + Facings: 1 + recoil: + Start: 0 + Facings: 1 + make: silomake + Start: 0 + Length: * + damaged-idle: + Start: 0 + Facings: 1 + damaged-recoil: + Start: 0 + Facings: 1 + turret: gunturret + Start: 0 + Facings: 32 + +frigate: + idle: + Start: 0 + Facings: 1 + +#TODO: This is wrong. +rifle: + stand: + Start: 0 + Facings: 8 + stand2: + Start: 8 + Length: 8 + stand3: + Start: 128 + Length: 16 + run: + Start: 16 + Length: 6 + Facings: 8 + shoot: + Start: 64 + Length: 6 + Facings: 8 + prone-stand: + Start: 112 + Length: 4 + Facings: 8 + prone-run: + Start: 144 + Length: 4 + Facings: 8 + standup-0: + Start: 176 + Length: 2 + Facings: 8 + prone-shoot: + Start: 192 + Length: 6 + Facings: 8 + conyarda: idle: Start: 0 @@ -50,20 +168,6 @@ starporta: Start: 0 Length: * -walla: - idle: - Start: 0 - Length: 16 - scratched-idle: - Start: 0 - Length: 16 - damaged-idle: - Start: 16 - Length: 16 - critical-idle: - Start: 16 - Length: 16 - pwra: idle: Start: 0 @@ -190,29 +294,6 @@ heavya: damaged-idle-top: Start: 2 -carryall: - idle: - Start: 0 - Facings: 32 - unload: - Start: 0 - Facings: 32 - -orni: - idle: - Start: 0 - Facings: 32 - -trike: - idle: - Start: 0 - Facings: 32 - -quad: - idle: - Start: 0 - Facings: 32 - combata: idle: Start: 0 @@ -221,84 +302,176 @@ combata: Start: 0 Facings: 32 -siege: +conyardh: idle: Start: 0 - Facings: 32 - turret: siegeturret + make: conmake Start: 0 - Facings: 32 + Length: * + damaged-idle: + Start: 1 -missile: +repairh: idle: Start: 0 - Facings: 32 + make: repairmake + Start: 0 + Length: * + damaged-idle: + Start: 1 -sonic: +starporth: idle: Start: 0 - Facings: 32 + active: + Start: 0 + Length: 1 + damaged-idle: + Start: 1 + damaged-active: + Start: 1 + make: starportmake + Start: 0 + Length: * -guntowera: +pwrh: idle: Start: 0 - Facings: 1 - recoil: + make: wtrpmake Start: 0 - Facings: 1 - make: silomake + Length: * + damaged-idle: + Start: 1 + +barrh: + idle: + Start: 0 + make: barramake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +radarh: + idle: + Start: 0 + make: radarmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +refh: + idle: + Start: 0 + Length: 1 + make: refmake Start: 0 Length: * damaged-idle: Start: 0 - Facings: 1 - damaged-recoil: + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +siloh: + idle: Start: 0 - Facings: 1 - turret: gunturret + Length: 4 + damaged-idle: + Start: 4 + Length: 1 + make: silomake + Start: 0 + Length: * + +hightechh: + idle: + Start: 0 + make: highmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +researchh: + idle: + Start: 0 + make: researchmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +palaceh: + idle: + Start: 0 + make: palacemake + Start: 0 + Length: * + damaged-idle: + Start: 1 + + +lighth: + idle: + Start: 0 + Length: 1 + make: lightmake + Start: 0 + Length: * + damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +heavyh: + idle: + Start: 0 + Length: 1 + make: heavymake + Start: 0 + Length: * + damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +combath: + idle: + Start: 0 + Facings: 32 + turret: combathturret Start: 0 Facings: 32 -frigate: +devast: idle: Start: 0 - Facings: 1 - -#TODO: This is wrong. -rifle: - stand: - Start: 0 - Facings: 8 - stand2: - Start: 8 - Length: 8 - stand3: - Start: 128 - Length: 16 - run: - Start: 16 - Length: 6 - Facings: 8 - shoot: - Start: 64 - Length: 6 - Facings: 8 - prone-stand: - Start: 112 - Length: 4 - Facings: 8 - prone-run: - Start: 144 - Length: 4 - Facings: 8 - standup-0: - Start: 176 - Length: 2 - Facings: 8 - prone-shoot: - Start: 192 - Length: 6 - Facings: 8 + Facings: 32 pips: groups: diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index dc3c5a1334..c40204c01e 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -57,8 +57,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2051 2082 "combath" --vehicle mono OpenRA.Utility.exe --shp combath.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 2083 2114 "devast" --vehicle mono OpenRA.Utility.exe --shp devast.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2115 2146 "combataturret" --vehicle -mono OpenRA.Utility.exe --shp combataturret.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2115 2146 "combathturret" --vehicle +mono OpenRA.Utility.exe --shp combathturret.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 2147 2148 "deathhandmissile" mono OpenRA.Utility.exe --shp deathhandmissile.png 24 #rifleinfantry repetitions? @@ -82,8 +82,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2523 2524 "pwra" --building mono OpenRA.Utility.exe --shp pwra.png 64 mono OpenRA.Utility.exe --r8 $R8 $PAL 2525 2526 "barra" --building mono OpenRA.Utility.exe --shp barra.png 80 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "walla" --wall -mono OpenRA.Utility.exe --shp walla.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2527 2558 "wall" --wall +mono OpenRA.Utility.exe --shp wall.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 2559 2560 "conyarda" --building mono OpenRA.Utility.exe --shp conyarda.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2561 2563 "refa" --building # 2561 is fassade, 2562 is silo top, 2563 is silo top broken @@ -94,12 +94,12 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2566 2570 "siloa" --building mono OpenRA.Utility.exe --shp siloa.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 2571 2572 "repaira" --building mono OpenRA.Utility.exe --shp repaira.png 96 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2573 2588 "guntowera" --building -mono OpenRA.Utility.exe --shp guntowera.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2573 2588 "guntower" --building +mono OpenRA.Utility.exe --shp guntower.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 2589 2620 "gunturret" --building mono OpenRA.Utility.exe --shp gunturret.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 2621 2636 "rockettowera" --building -mono OpenRA.Utility.exe --shp rockettowera.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2621 2636 "rockettower" --building +mono OpenRA.Utility.exe --shp rockettower.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 2637 2668 "rocketturreta" --building mono OpenRA.Utility.exe --shp rocketturreta.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 2669 2670 "researcha" --building @@ -110,6 +110,39 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2673 2675 "lighta" --building mono OpenRA.Utility.exe --shp lighta.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2676 2677 "palacea" --building mono OpenRA.Utility.exe --shp palacea.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2678 2680 "heavyh" --building +mono OpenRA.Utility.exe --shp heavyh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2681 2682 "radarh" --building +mono OpenRA.Utility.exe --shp radarh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2683 2684 "pwrh" --building +mono OpenRA.Utility.exe --shp pwrh.png 64 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2685 2686 "barrh" --building +mono OpenRA.Utility.exe --shp barrh.png 64 +# identical wall +mono OpenRA.Utility.exe --r8 $R8 $PAL 2719 2720 "conyardh" --building +mono OpenRA.Utility.exe --shp conyardh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2721 2723 "refh" --building +mono OpenRA.Utility.exe --shp refh.png 120 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2724 2725 "hightechh" --building +mono OpenRA.Utility.exe --shp hightechh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2726 2730 "siloh" --building +mono OpenRA.Utility.exe --shp siloh.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2731 2732 "repairh" --building +mono OpenRA.Utility.exe --shp repairh.png 96 +#identical guntower +mono OpenRA.Utility.exe --r8 $R8 $PAL 2749 2780 "gunturreth" --building +mono OpenRA.Utility.exe --shp gunturreth.png 48 +#identical rockettower +mono OpenRA.Utility.exe --r8 $R8 $PAL 2797 2828 "rocketturreth" --building +mono OpenRA.Utility.exe --shp rocketturreth.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2829 2830 "researchh" --building +mono OpenRA.Utility.exe --shp researchh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2831 2832 "starporth" --building +mono OpenRA.Utility.exe --shp starporth.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2833 2835 "lighth" --building +mono OpenRA.Utility.exe --shp lighth.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2836 2837 "palaceh" --building +mono OpenRA.Utility.exe --shp palaceh.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 3549 3564 "sandwormmouth" mono OpenRA.Utility.exe --shp sandwormmouth.png 68 @@ -162,8 +195,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 4026 4026 "siegeicon" mono OpenRA.Utility.exe --shp siegeicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4027 4027 "sonicicon" mono OpenRA.Utility.exe --shp sonicicon.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4028 4028 "devastatoricon" -mono OpenRA.Utility.exe --shp devastatoricon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4028 4028 "devasticon" +mono OpenRA.Utility.exe --shp devasticon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4029 4029 "carryallicon" # = 4030 mono OpenRA.Utility.exe --shp carryallicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4031 4031 "orniicon" # = 4062 From a20e30312ef077e391b302a61a3f4568386543dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 27 May 2012 15:17:03 +0200 Subject: [PATCH 14/36] added Ordos --- OpenRA.Utility/Program.cs | 16 +-- mods/d2k/TODO | 9 +- mods/d2k/chrome.yaml | 28 +++- mods/d2k/mod.yaml | 1 + mods/d2k/rules/aircraft.yaml | 2 +- mods/d2k/rules/infantry.yaml | 2 +- mods/d2k/rules/ordos.yaml | 167 +++++++++++++++++++++++ mods/d2k/rules/system.yaml | 57 ++++++-- mods/d2k/rules/vehicles.yaml | 8 +- mods/d2k/sequences.yaml | 248 ++++++++++++++++++++++++++++++++++- ripD2kGameFiles.sh | 39 +++++- 11 files changed, 544 insertions(+), 33 deletions(-) create mode 100644 mods/d2k/rules/ordos.yaml diff --git a/OpenRA.Utility/Program.cs b/OpenRA.Utility/Program.cs index b544a88f94..e3b1efad8c 100644 --- a/OpenRA.Utility/Program.cs +++ b/OpenRA.Utility/Program.cs @@ -54,14 +54,14 @@ namespace OpenRA.Utility { Console.WriteLine("Usage: OpenRA.Utility.exe [OPTION] [ARGS]"); Console.WriteLine(); - Console.WriteLine(" --settings-value KEY Get value of KEY from settings.yaml"); - Console.WriteLine(" --shp PNGFILE FRAMEWIDTH Convert a single PNG with multiple frames appended after another to a SHP"); - Console.WriteLine(" --png SHPFILE PALETTE [--transparent] Convert a SHP to a PNG containing all of its frames, optionally setting up transparency"); - Console.WriteLine(" --extract MOD[,MOD]* FILES Extract files from mod packages"); - Console.WriteLine(" --tmp-png MOD[,MOD]* THEATER FILES Extract terrain tiles to PNG"); - Console.WriteLine(" --remap SRCMOD:PAL DESTMOD:PAL SRCSHP DESTSHP Remap SHPs to another palette"); - Console.WriteLine(" --r8 R8FILE PALETTE STARTFRAME ENDFRAME FILENAME [--transparent] "); - Console.WriteLine(" [--infrantry] [--vehicle] [--projectile] [--building] Convert Dune 2000 DATA.R8 to PNGs choosing start- and endframe as well as unit type for correct offset to append multiple frames to one PNG named by filename optionally setting up transparency"); + Console.WriteLine(" --settings-value KEY Get value of KEY from settings.yaml"); + Console.WriteLine(" --shp PNGFILE FRAMEWIDTH Convert a single PNG with multiple frames appended after another to a SHP"); + Console.WriteLine(" --png SHPFILE PALETTE [--transparent] Convert a SHP to a PNG containing all of its frames, optionally setting up transparency"); + Console.WriteLine(" --extract MOD[,MOD]* FILES Extract files from mod packages"); + Console.WriteLine(" --tmp-png MOD[,MOD]* THEATER FILES Extract terrain tiles to PNG"); + Console.WriteLine(" --remap SRCMOD:PAL DESTMOD:PAL SRCSHP DESTSHP Remap SHPs to another palette"); + Console.WriteLine(" --r8 R8FILE PALETTE STARTFRAME ENDFRAME FILENAME [--transparent]"); + Console.WriteLine(" [--infrantry] [--vehicle] [--projectile] [--building] [--wall] Convert Dune 2000 DATA.R8 to PNGs choosing start- and endframe as well as unit type for correct offset to append multiple frames to one PNG named by filename optionally setting up transparency"); } static string GetNamedArg(string[] args, string arg) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index e5c4626c23..78c48e3173 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -15,11 +15,15 @@ # repair bay should really repair vehicles # ornithocopter should flap (might need new RenderOrni code for proper animation) # R8 converter needs infantry frame resorter -# add infantry +# add infantry dieing animation +# add trooper +# add engineer +# add fremen +# add saboteur +# add deathhand missile (nuke) # add sandworm # add thumper which really attracts sandworms # allow upgrades -# add ordos/harkonnen (avoid redundancy using inheritances) # add voices (Dune 2000/DATA/SFX folder contains .aud files) # muzzles and explosions with lightning (might need engine update) # ingame gamefile extractor at first start when SHPs are not found @@ -28,4 +32,5 @@ # add install rules to makefile (once more polished) # idea: frame 2998 (fremen siech) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) # add sonic tank weapon (currently uses tesla) +# make deviator change the allegiance of ememy units (currently shoots rockets) # replace RA mouse.shp, nopower.shp with Dune 2000 equivalent \ No newline at end of file diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index 30d43efffe..3889680555 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -138,6 +138,12 @@ tabs-selected: tabs.png harkonnen-Vehicle: 80,120,27,41 harkonnen-Plane: 80,160,27,41 harkonnen-Ship: 80,200,27,41 + ordos-Building: 0,0,27,41 + ordos-Defense: 0,40,27,41 + ordos-Infantry: 0,80,27,41 + ordos-Vehicle: 0,120,27,41 + ordos-Plane: 0,160,27,41 + ordos-Ship: 0,200,27,41 tabs-ready: tabs.png atreides-Building: 27,0,27,41 @@ -152,6 +158,12 @@ tabs-ready: tabs.png harkonnen-Vehicle: 107,120,27,41 harkonnen-Plane: 107,160,27,41 harkonnen-Ship: 107,200,27,41 + ordos-Building: 27,0,27,41 + ordos-Defense: 27,40,27,41 + ordos-Infantry: 27,80,27,41 + ordos-Vehicle: 27,120,27,41 + ordos-Plane: 27,160,27,41 + ordos-Ship: 27,200,27,41 tabs-normal: tabs.png atreides-Building: 54,0,27,41 @@ -166,13 +178,19 @@ tabs-normal: tabs.png harkonnen-Vehicle: 134,120,27,41 harkonnen-Plane: 134,160,27,41 harkonnen-Ship: 134,200,27,41 + ordos-Building: 54,0,27,41 + ordos-Defense: 54,40,27,41 + ordos-Infantry: 54,80,27,41 + ordos-Vehicle: 54,120,27,41 + ordos-Plane: 54,160,27,41 + ordos-Ship: 54,200,27,41 flags: buttons.png - atreides: 0,84,21,107 - harkonnen: 22,84,23,107 - ordos: 45,84,22,107 - random: 67,84,90,107 - spectator: 67,84,90,107 + atreides: 0,84,21,23 + harkonnen: 22,84,23,23 + ordos: 45,84,22,23 + random: 67,84,23,23 + spectator: 67,84,23,23 dialog2: dialog.png background: 513,1,126,126 diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 7973006f43..03e759d772 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -43,6 +43,7 @@ Rules: mods/d2k/rules/infantry.yaml mods/d2k/rules/atreides.yaml mods/d2k/rules/harkonnen.yaml + mods/d2k/rules/ordos.yaml Sequences: mods/d2k/sequences.yaml diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index d497db00ac..2d51ce9751 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -5,7 +5,7 @@ CARRYALL: BuildPaletteOrder: 110 Prerequisites: anyhightech BuiltAt: hightecha - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Valued: Cost: 1200 Tooltip: diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index 06e000e694..1ff67fed85 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -3,7 +3,7 @@ RIFLE: Buildable: Queue: Infantry BuildPaletteOrder: 10 - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Valued: Cost: 100 Tooltip: diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml new file mode 100644 index 0000000000..6d02c76903 --- /dev/null +++ b/mods/d2k/rules/ordos.yaml @@ -0,0 +1,167 @@ +CONYARDO: + Inherits: ^CONYARD + Buildable: + Owner: ordos + Transforms: + IntoActor: mcvo + Offset:1,1 + Facing: 270 + +PWRO: + Inherits: ^POWER + Buildable: + Prerequisites: conyardo + Owner: ordos + +REFO: + Inherits: ^REFINERY + Buildable: + Prerequisites: pwro + Owner: ordos + RenderBuildingWarFactory: + Image: REFO + +BARRO: + Inherits: ^BARRACKS + Buildable: + Prerequisites: pwro + Owner: ordos + +HIGHTECHO: + Inherits: ^HIGHTECH + Buildable: + Prerequisites: radaro + Owner: ordos + +RESEARCHO: + Inherits: ^RESEARCH + Buildable: + Prerequisites: radaro,heavyo + Owner: ordos + +PALACEO: + Inherits: ^PALACE + Buildable: + Prerequisites: researcho + Owner: ordos + +SILOO: + Inherits: ^SILO + Buildable: + Prerequisites: refo + Owner: ordos + +LIGHTO: + Inherits: ^LIGHT + Buildable: + Prerequisites: refo + Owner: ordos + RenderBuildingWarFactory: + Image: LIGHTO + +HEAVYO: + Inherits: ^HEAVY + Buildable: + Prerequisites: lighto + Owner: ordos + RenderBuildingWarFactory: + Image: HEAVYO + +RADARO: + Inherits: ^RADAR + Buildable: + Prerequisites: barro + Owner: ordos + +STARPORTO: + Inherits: ^STARPORT + Buildable: + Prerequisites: radaro + Owner: ordos + ProductionQueue: + QueuedAudio: OI_ORDER.AUD + ReadyAudio: OI_REINF.AUD + OnHoldAudio: OI_HOLD.AUD + CancelledAudio: OI_CANCL.AUD + +REPAIRO: + Inherits: ^REPAIR + Buildable: + Prerequisites: heavyo + Owner: ordos + +MCVO: + Inherits: ^MCV + Buildable: + Prerequisites: heavyo,repairo + Owner: ordos + Transforms: + Facing: 10 + IntoActor: conyardo + Offset:-1,-1 + TransformSounds: + NoTransformSounds: OI_DPLOY.AUD + +COMBATO: + Inherits: ^COMBAT + Buildable: + Prerequisites: heavyo + Owner: ordos + +RAIDER: + Inherits: ^Vehicle + Buildable: + Queue: Vehicle + BuildPaletteOrder: 15 + Prerequisites: anylight + Owner: ordos + Valued: + Cost: 200 + Tooltip: + Name: Raider + Description: Weak Scout.\n Decent vs. Infantry + Selectable: + Bounds: 24,24 + Health: + HP: 125 + Armor: + Type: Light + Mobile: + ROT: 15 + Speed: 20 + RevealsShroud: + Range: 8 + RenderUnit: + AttackFrontal: + PrimaryWeapon: M60mg + PrimaryOffset: 0,0,0,-4 + SecondaryWeapon: M60mg + SecondaryOffset: 0,0,0,-4 + AutoTarget: + +DEVIATOR: + Inherits: ^Tank + Valued: + Cost: 800 + Tooltip: + Name: Deviator + Description: Long range artillery.\n Strong vs Infantry, Tanks, Air\n Weak vs Buildings + Buildable: + Queue: Vehicle + BuildPaletteOrder: 50 + Prerequisites: anyheavy + Owner: ordos + Mobile: + Speed: 6 + Health: + HP: 150 + Armor: + Type: Light + RevealsShroud: + Range: 6 + RenderUnit: + AttackFrontal: + PrimaryWeapon: MammothTusk + PrimaryLocalOffset: -7,2,0,0,25, 7,2,0,0,-25 + PrimaryRecoil: 1 + AutoTarget: \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 22eaedd78f..df548ed7b8 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -36,6 +36,32 @@ Player: InitialCash: 5000 ActorGroupProxy: DeveloperMode: +# HackyAI@EasyAI: +# Name:Easy AI +# BuildingFractions: +# refa: 30% +# refh: 30% +# powra: 35% +# powrh: 35% +# barra: 1% +# barrh: 1% +# lighta: 1% +# lighth: 1% +# heavya: 1% +# heavyh: 1% +# researcha: 1% +# researchh: 1% +# repaira: 0.1% +# radara: 10% +# UnitsToBuild: +# trike: 30% +# quad: 40% +# siege: 15% +# combata: 70% +# combath: 70% +# sonic: 25% +# devast: 25% +# SquadSize: 10 PlayerColorPalette: BasePalette: d2k PaletteFormat: d2k @@ -55,7 +81,11 @@ World: -LightPaletteRotator: BuildingInfluence: ChooseBuildTabOnSelect: - -CrateDrop: + CrateSpawner: + Minimum: 1 + Maximum: 3 + SpawnInterval: 120 + WaterChance: 0 PaletteFromCurrentTileset: Name: terrain PaletteFromFile@d2k: @@ -102,15 +132,15 @@ World: ShroudPalette@fog: IsFog: yes Name: fog - Country@2: + Country@Atreides: Name: Atreides Race: atreides - Country@3: + Country@Harkonnen: Name: Harkonnen Race: harkonnen -# Country@4: -# Name: Ordos -# Race: ordos + Country@Ordos: + Name: Ordos + Race: ordos # BibLayer: ResourceLayer: # ResourceType@spice: @@ -140,9 +170,20 @@ World: SpawnMPUnits@harkonnen: InitialUnit: mcvh Faction: harkonnen -# SpawnMPUnits@ordos: -# InitialUnit: mcvo + SpawnMPUnits@ordos: + InitialUnit: mcvo + Faction: ordos EvaAlerts: + RadarUp: + RadarDown: + BuildingCannotPlaceAudio: + CashTickUp: + CashTickDown: + LowPower: + SilosNeeded: + PrimaryBuildingSelected: + AbilityInsufficientPower: + LevelUp: SpatialBins: BinSize: 4 Shroud: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index c73cd08444..b7bdc84710 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -33,7 +33,7 @@ HARVESTER: Queue: Vehicle BuildPaletteOrder: 10 Prerequisites: anyref,anyheavy - Owner: atreides + Owner: atreides,harkonnen,ordos Valued: Cost: 1100 Tooltip: @@ -93,7 +93,7 @@ QUAD: Queue: Vehicle BuildPaletteOrder: 30 Prerequisites: anylight - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Valued: Cost: 400 Tooltip: @@ -154,7 +154,7 @@ SIEGE: Queue: Vehicle BuildPaletteOrder: 80 Prerequisites: anyradar - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Valued: Cost: 600 Tooltip: @@ -192,7 +192,7 @@ Missile: Queue: Vehicle BuildPaletteOrder: 50 Prerequisites: anyheavy - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Mobile: Speed: 6 Health: diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 594a8fb012..4c4b97dc81 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -473,6 +473,182 @@ devast: Start: 0 Facings: 32 +conyardo: + idle: + Start: 0 + make: conmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +repairo: + idle: + Start: 0 + make: repairmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +starporto: + idle: + Start: 0 + active: + Start: 0 + Length: 1 + damaged-idle: + Start: 1 + damaged-active: + Start: 1 + make: starportmake + Start: 0 + Length: * + +pwro: + idle: + Start: 0 + make: wtrpmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +barro: + idle: + Start: 0 + make: barramake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +radaro: + idle: + Start: 0 + make: radarmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +refo: + idle: + Start: 0 + Length: 1 + make: refmake + Start: 0 + Length: * + damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +siloo: + idle: + Start: 0 + Length: 4 + damaged-idle: + Start: 4 + Length: 1 + make: silomake + Start: 0 + Length: * + +hightecho: + idle: + Start: 0 + make: highmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +researcho: + idle: + Start: 0 + make: researchmake + Start: 0 + Length: * + damaged-idle: + Start: 1 + +palaceo: + idle: + Start: 0 + make: palacemake + Start: 0 + Length: * + damaged-idle: + Start: 1 + + +lighto: + idle: + Start: 0 + Length: 1 + make: lightmake + Start: 0 + Length: * + damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +heavyo: + idle: + Start: 0 + Length: 1 + make: heavymake + Start: 0 + Length: * + damaged-idle: + Start: 0 + build-top: + Start: 1 + Length: 1 + damaged-build-top: + Start: 2 + Length: 1 + idle-top: + Start: 1 + damaged-idle-top: + Start: 2 + +combato: + idle: + Start: 0 + Facings: 32 + turret: combatoturret + Start: 0 + Facings: 32 + +raider: + idle: + Start: 0 + Facings: 32 + +deviator: + idle: + Start: 0 + Facings: 32 + pips: groups: Start: 8 @@ -509,6 +685,12 @@ powerdown: disabled: speed Start: 3 +poweroff: + offline: + Start: 0 + Length: * + Tick: 160 + rank: rank: Start: 0 @@ -606,4 +788,68 @@ litning: Length: 4 dim: Start: 4 - Length: 4 \ No newline at end of file + Length: 4 + +crate: + idle: scrate + Start: 0 + water: wwcrate + Start: 0 + Length: * + Tick: 500 + land: sh-crate + Start: 0 + +crate-effects: + speed: speed + Start: 0 + Length: * + dollar: dollar + Start: 0 + Length: * + reveal-map: earth + Start: 0 + Length: * + hide-map: empulse + Start: 0 + Length: * + fpower: fpower + Start: 0 + Length: * + gps: gpsbox + Start: 0 + Length: * + invuln: invulbox + Start: 0 + Length: * + heal: invun + Start: 0 + Length: * + nuke: missile2 + Start: 0 + Length: * + parabombs: parabox + Start: 0 + Length: * + sonar: sonarbox + Start: 0 + Length: * + stealth: stealth2 + Start: 0 + Length: * + timequake: tquake + Start: 0 + Length: * + armor: armor + Start: 0 + Length: * + chrono: chronbox + Start: 0 + Length: * + airstrike: deviator + Start: 0 + Length: * + levelup: levelup + Start: 0 + Length: * + Tick: 200 \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index c40204c01e..5a46b494c6 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -143,6 +143,39 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 2833 2835 "lighth" --building mono OpenRA.Utility.exe --shp lighth.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 2836 2837 "palaceh" --building mono OpenRA.Utility.exe --shp palaceh.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2838 2840 "heavyo" --building +mono OpenRA.Utility.exe --shp heavyo.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2841 2842 "radaro" --building +mono OpenRA.Utility.exe --shp radaro.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2843 2844 "pwro" --building +mono OpenRA.Utility.exe --shp pwro.png 64 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2845 2846 "barro" --building +mono OpenRA.Utility.exe --shp barro.png 64 +# identical wall +mono OpenRA.Utility.exe --r8 $R8 $PAL 2879 2880 "conyardo" --building +mono OpenRA.Utility.exe --shp conyardo.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2881 2883 "refo" --building +mono OpenRA.Utility.exe --shp refo.png 120 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2884 2885 "hightecho" --building +mono OpenRA.Utility.exe --shp hightecho.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2886 2890 "siloo" --building +mono OpenRA.Utility.exe --shp siloo.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2891 2892 "repairo" --building +mono OpenRA.Utility.exe --shp repairo.png 96 +#identical guntower +mono OpenRA.Utility.exe --r8 $R8 $PAL 2909 2940 "gunturreto" --building +mono OpenRA.Utility.exe --shp gunturreto.png 48 +#identical rockettower +mono OpenRA.Utility.exe --r8 $R8 $PAL 2957 2988 "rocketturreto" --building +mono OpenRA.Utility.exe --shp rocketturreto.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2989 2990 "researcho" --building +mono OpenRA.Utility.exe --shp researcho.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2991 2992 "starporto" --building +mono OpenRA.Utility.exe --shp starporto.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2993 2995 "lighto" --building +mono OpenRA.Utility.exe --shp lighto.png 96 +mono OpenRA.Utility.exe --r8 $R8 $PAL 2996 2997 "palaceo" --building +mono OpenRA.Utility.exe --shp palaceo.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 3549 3564 "sandwormmouth" mono OpenRA.Utility.exe --shp sandwormmouth.png 68 @@ -230,8 +263,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 4060 4060 "barrhicon" mono OpenRA.Utility.exe --shp barrhicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4061 4061 "barroicon" mono OpenRA.Utility.exe --shp barroicon.png 60 -mono OpenRA.Utility.exe --r8 $R8 $PAL 4063 4063 "wallaicon" # = 4061..4062 -mono OpenRA.Utility.exe --shp wallaicon.png 60 +mono OpenRA.Utility.exe --r8 $R8 $PAL 4063 4063 "wallicon" # = 4061..4062 +mono OpenRA.Utility.exe --shp wallicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4066 4066 "refaicon" mono OpenRA.Utility.exe --shp refaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4067 4067 "refhicon" @@ -286,7 +319,7 @@ mono OpenRA.Utility.exe --shp repairaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4097 4097 "repairhicon" mono OpenRA.Utility.exe --shp repairhicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4098 4098 "repairoicon" -mono OpenRA.Utility.exe --shp repairhicon.png 60 +mono OpenRA.Utility.exe --shp repairoicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4099 4099 "researchaicon" mono OpenRA.Utility.exe --shp researchaicon.png 60 mono OpenRA.Utility.exe --r8 $R8 $PAL 4100 4100 "researchhicon" From 2a312911cb48e2bcb0e627edb4314296c4c81f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 27 May 2012 18:28:52 +0200 Subject: [PATCH 15/36] fixes repair pad and update TODO --- mods/d2k/TODO | 16 ++++++++++------ mods/d2k/rules/aircraft.yaml | 3 +-- mods/d2k/rules/defaults.yaml | 6 ++++-- mods/d2k/rules/system.yaml | 15 ++++++++++++++- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 78c48e3173..2d6a30a079 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -8,11 +8,10 @@ # chimney animation (refinery) missing # create a tileset extractor for gamefiles to remove copyrighted content from distribution # replace ore with spice and mines with spice blooms -# add Smudge Types +# add Smudge Types (stored in SHPs not in tileset) # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # support separate turret sequence with RenderBuildingTurreted -# repair bay should really repair vehicles # ornithocopter should flap (might need new RenderOrni code for proper animation) # R8 converter needs infantry frame resorter # add infantry dieing animation @@ -25,12 +24,17 @@ # add thumper which really attracts sandworms # allow upgrades # add voices (Dune 2000/DATA/SFX folder contains .aud files) -# muzzles and explosions with lightning (might need engine update) +# add SOUND.TS .wav file extractor to RA.Utility.exe +# convert .wav to .aud or support .wav files for Dune 2000 sounds +# add muzzles and explosions with lightning (might need engine update) # ingame gamefile extractor at first start when SHPs are not found -# create a shellmap +# create a shellmap (currently just a blank placeholder) # rework chrome UI, dialoges, tabs # add install rules to makefile (once more polished) -# idea: frame 2998 (fremen siech) could become a tunnel to make Ordos really insidious (similiar mechanism to paratroopers powerproxy) # add sonic tank weapon (currently uses tesla) # make deviator change the allegiance of ememy units (currently shoots rockets) -# replace RA mouse.shp, nopower.shp with Dune 2000 equivalent \ No newline at end of file +# replace RA mouse.shp, nopower.shp with Dune 2000 equivalent +# add bots (blocked by issue #2184) +# complete Arrakis tileset (blocked by issue #2178) +# allow frigate to deliver 5 units at once to starport +# starport prices should vary \ No newline at end of file diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 2d51ce9751..3e31d5d373 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -18,7 +18,6 @@ CARRYALL: RevealsShroud: Range: 12 Helicopter: - RearmBuildings: hightecha InitialFacing: 0 ROT: 5 Speed: 15 @@ -63,7 +62,7 @@ ORNI: Buildable: Queue: Plane BuildPaletteOrder: 90 - Prerequisites: hightecha + Prerequisites: researcha BuiltAt: hightecha Owner: atreides Valued: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index b08419a8f3..b9a5a7e09a 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -14,7 +14,6 @@ Voice: VehicleVoice TargetableUnit: TargetTypes: Ground - Repairable: Passenger: CargoType: Vehicle AttackMove: @@ -28,6 +27,8 @@ Types:Vehicle GivesBounty: WithSmoke: + Repairable: + RepairBuildings: repaira,repairh,repairo ^Tank: AppearsOnRadar: @@ -45,7 +46,6 @@ Voice: VehicleVoice TargetableUnit: TargetTypes: Ground - Repairable: Passenger: CargoType: Vehicle AttackMove: @@ -59,6 +59,8 @@ Types:Tank GivesBounty: WithSmoke: + Repairable: + RepairBuildings: repaira,repairh,repairo ^Infantry: AppearsOnRadar: diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index df548ed7b8..2b3d8889d8 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -41,26 +41,38 @@ Player: # BuildingFractions: # refa: 30% # refh: 30% +# refo: 30% # powra: 35% # powrh: 35% +# powro: 35% # barra: 1% # barrh: 1% +# barro: 1% # lighta: 1% # lighth: 1% +# lighto: 1% # heavya: 1% # heavyh: 1% +# heavyo: 1% # researcha: 1% # researchh: 1% +# researcho: 1% # repaira: 0.1% +# repairh: 0.1% +# repairo: 0.1% # radara: 10% +# radaro: 10% +# radarh: 10% # UnitsToBuild: # trike: 30% +# raider: 30% # quad: 40% # siege: 15% # combata: 70% # combath: 70% # sonic: 25% # devast: 25% +# deviator: 25% # SquadSize: 10 PlayerColorPalette: BasePalette: d2k @@ -213,10 +225,11 @@ CRATE: RevealMapCrateAction: SelectionShares: 1 Effect: reveal-map +#TODO: Currently only gives you an Atreides MCV GiveMcvCrateAction: SelectionShares: 2 NoBaseSelectionShares: 9001 - Unit: mcv + Unit: mcva GiveUnitCrateAction@trike: SelectionShares: 7 Unit: trike From 4984d079606902f3ecb3003ed0d7a4455222d189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 10:36:17 +0200 Subject: [PATCH 16/36] made HackyAI more flexible for Dune 2000 mod --- OpenRA.Mods.RA/AI/HackyAI.cs | 31 ++++++++------ mods/d2k/rules/system.yaml | 80 +++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 50 deletions(-) diff --git a/OpenRA.Mods.RA/AI/HackyAI.cs b/OpenRA.Mods.RA/AI/HackyAI.cs index 5145b3bc21..d16127e785 100644 --- a/OpenRA.Mods.RA/AI/HackyAI.cs +++ b/OpenRA.Mods.RA/AI/HackyAI.cs @@ -34,8 +34,10 @@ namespace OpenRA.Mods.RA.AI public readonly int SquadSize = 8; public readonly int AssignRolesInterval = 20; public readonly string RallypointTestBuilding = "fact"; // temporary hack to maintain previous rallypoint behavior. - public readonly string[] UnitQueues = { "Vehicle", "Infantry", "Plane" }; + public readonly string[] UnitQueues = {"Vehicle", "Infantry", "Plane"}; public readonly bool ShouldRepairBuildings = true; + public readonly string HarvesterUnit = "harv"; + public readonly string[] BaseBuildUnit = {"mcv"}; string IBotInfo.Name { get { return this.Name; } } @@ -66,6 +68,7 @@ namespace OpenRA.Mods.RA.AI { bool enabled; public int ticks; + public string FoundBaseBuildUnit; public Player p; PowerManager playerPower; readonly BuildingInfo rallypointTestBuilding; // temporary hack @@ -182,7 +185,7 @@ namespace OpenRA.Mods.RA.AI ticks++; - if (ticks == 10) + if (ticks == 1) DeployMcv(self); if (ticks % feedbackTime == 0) @@ -261,14 +264,14 @@ namespace OpenRA.Mods.RA.AI assignRolesTicks = Info.AssignRolesInterval; var newUnits = self.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == p && a.Actor.Info != Rules.Info["mcv"] + .Where(a => a.Actor.Owner == p && a.Actor.Info != Rules.Info[FoundBaseBuildUnit] && !activeUnits.Contains(a.Actor)) .Select(a => a.Actor).ToArray(); foreach (var a in newUnits) { BotDebug("AI: Found a newly built unit"); - if (a.Info == Rules.Info["harv"]) + if (a.Info == Rules.Info[Info.HarvesterUnit]) world.IssueOrder( new Order( "Harvest", a, false ) ); else unitsHangingAroundTheBase.Add(a); @@ -418,16 +421,20 @@ namespace OpenRA.Mods.RA.AI void DeployMcv(Actor self) { /* find our mcv and deploy it */ - var mcv = self.World.Actors - .FirstOrDefault(a => a.Owner == p && a.Info == Rules.Info["mcv"]); - - if (mcv != null) + foreach (var m in Info.BaseBuildUnit) { - baseCenter = mcv.Location; - world.IssueOrder(new Order("DeployTransform", mcv, false)); + var mcv = self.World.Actors + .FirstOrDefault(a => a.Owner == p && a.Info == Rules.Info[m]); + + if (mcv != null) + { + baseCenter = mcv.Location; + world.IssueOrder(new Order("DeployTransform", mcv, false)); + FoundBaseBuildUnit = m; //remember the type to exclude it from attack forces + } + else + BotDebug("AI: Can't find BaseBuildUnit {0}.", m); } - else - BotDebug("AI: Can't find the MCV."); } internal IEnumerable FindQueues(string category) diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 2b3d8889d8..d12f542f2e 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -36,44 +36,48 @@ Player: InitialCash: 5000 ActorGroupProxy: DeveloperMode: -# HackyAI@EasyAI: -# Name:Easy AI -# BuildingFractions: -# refa: 30% -# refh: 30% -# refo: 30% -# powra: 35% -# powrh: 35% -# powro: 35% -# barra: 1% -# barrh: 1% -# barro: 1% -# lighta: 1% -# lighth: 1% -# lighto: 1% -# heavya: 1% -# heavyh: 1% -# heavyo: 1% -# researcha: 1% -# researchh: 1% -# researcho: 1% -# repaira: 0.1% -# repairh: 0.1% -# repairo: 0.1% -# radara: 10% -# radaro: 10% -# radarh: 10% -# UnitsToBuild: -# trike: 30% -# raider: 30% -# quad: 40% -# siege: 15% -# combata: 70% -# combath: 70% -# sonic: 25% -# devast: 25% -# deviator: 25% -# SquadSize: 10 + HackyAI@EasyAI: + Name:Easy AI + RallypointTestBuilding: conyarda + HarvesterUnit: harvester + BaseBuildUnit: mcva,mcvh,mcvo + BuildingFractions: + refa: 30% + refh: 30% + refo: 30% + powra: 35% + powrh: 35% + powro: 35% + barra: 1% + barrh: 1% + barro: 1% + lighta: 1% + lighth: 1% + lighto: 1% + heavya: 1% + heavyh: 1% + heavyo: 1% + researcha: 1% + researchh: 1% + researcho: 1% + repaira: 0.1% + repairh: 0.1% + repairo: 0.1% + radara: 10% + radaro: 10% + radarh: 10% + UnitsToBuild: + trike: 30% + raider: 30% + quad: 40% + siege: 15% + combata: 70% + combath: 70% + combato: 70% + sonic: 25% + devast: 25% + deviator: 25% + SquadSize: 10 PlayerColorPalette: BasePalette: d2k PaletteFormat: d2k From 8e74df6155d9ef621a4ad758069aca5c9501dbce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 10:37:10 +0200 Subject: [PATCH 17/36] fixing RALint.exe d2k and ordos missing defense buildings --- mods/d2k/rules/defaults.yaml | 6 ++++++ mods/d2k/rules/structures.yaml | 4 ++-- mods/d2k/sequences.yaml | 8 +++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index b9a5a7e09a..ab551367a8 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -110,6 +110,9 @@ TargetableAircraft: TargetTypes: Air GroundedTargetTypes: Ground + Plane: + RepairBuildings: repaira,repairo,repairh + RearmBuildings: hightecha HiddenUnderFog: GainsExperience: GivesExperience: @@ -129,6 +132,9 @@ ^Helicopter: Inherits: ^Plane + Helicopter: + RepairBuildings: repaira,repairo,repairh + RearmBuildings: hightecha ^Building: AppearsOnRadar: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index bd655b9695..462db8330b 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -355,7 +355,7 @@ WALL: Buildable: Queue: Defense BuildPaletteOrder: 1000 - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos SoundOnDamageTransition: DamagedSound: DestroyedSound: @@ -402,7 +402,7 @@ GUNTOWER: Buildable: Queue: Defense BuildPaletteOrder: 40 - Owner: atreides,harkonnen + Owner: atreides,harkonnen,ordos Valued: Cost: 600 Tooltip: diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 4c4b97dc81..70cb4251e3 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -852,4 +852,10 @@ crate-effects: levelup: levelup Start: 0 Length: * - Tick: 200 \ No newline at end of file + Tick: 200 + +allyrepair: + repair: + Start: 0 + Length: * + Tick: 160 \ No newline at end of file From ec7795fa993be5c8901a7f9da402614aa8978c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 14:00:43 +0200 Subject: [PATCH 18/36] added more Dune 2000 EVA voices currently Atreides only --- mods/d2k/TODO | 6 +++--- mods/d2k/rules/system.yaml | 27 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 2d6a30a079..e8b997cea2 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -1,5 +1,5 @@ # make structures appear earlier when errecting from ground -# harvester unload frames missing (too few DATA.R8 frames in general) +# harvester harvest and unload frames missing (too few DATA.R8 frames in general) # carryalls should automatically transport harvesters (needs complex logic) # windtrap animations missing # outpost animations missing @@ -22,8 +22,9 @@ # add deathhand missile (nuke) # add sandworm # add thumper which really attracts sandworms +# add neutral buildings: emperor palace, fremen siech, smugglers house # allow upgrades -# add voices (Dune 2000/DATA/SFX folder contains .aud files) +# allow different EVA voices for each faction (currently Atreides only) # add SOUND.TS .wav file extractor to RA.Utility.exe # convert .wav to .aud or support .wav files for Dune 2000 sounds # add muzzles and explosions with lightning (might need engine update) @@ -34,7 +35,6 @@ # add sonic tank weapon (currently uses tesla) # make deviator change the allegiance of ememy units (currently shoots rockets) # replace RA mouse.shp, nopower.shp with Dune 2000 equivalent -# add bots (blocked by issue #2184) # complete Arrakis tileset (blocked by issue #2178) # allow frigate to deliver 5 units at once to starport # starport prices should vary \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index d12f542f2e..d4e180193e 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -6,25 +6,41 @@ Player: BuildSpeed: .4 LowPowerSlowdown: 3 QueuedAudio: AI_BUILD.AUD + OnHoldAudio: AI_HOLD.AUD ReadyAudio: AI_BDRDY.AUD + CancelledAudio: AI_CANCL.AUD ClassicProductionQueue@Defense: Type: Defense BuildSpeed: .4 LowPowerSlowdown: 3 QueuedAudio: AI_BUILD.AUD + OnHoldAudio: AI_HOLD.AUD ReadyAudio: AI_BDRDY.AUD + CancelledAudio: AI_CANCL.AUD ClassicProductionQueue@Vehicle: Type: Vehicle BuildSpeed: .4 LowPowerSlowdown: 3 + ReadyAudio: AI_UNRDY.AUD + QueuedAudio:AI_TRAIN.AUD + OnHoldAudio: AI_HOLD.AUD + CancelledAudio: AI_CANCL.AUD ClassicProductionQueue@Infantry: Type: Infantry BuildSpeed: .4 LowPowerSlowdown: 3 + ReadyAudio: AI_UNRDY.AUD + QueuedAudio:AI_TRAIN.AUD + OnHoldAudio: AI_HOLD.AUD + CancelledAudio: AI_CANCL.AUD ClassicProductionQueue@Plane: Type: Plane BuildSpeed: .4 LowPowerSlowdown: 3 + ReadyAudio: AI_UNRDY.AUD + QueuedAudio:AI_TRAIN.AUD + OnHoldAudio: AI_HOLD.AUD + CancelledAudio: AI_CANCL.AUD PlaceBuilding: SupportPowerManager: ConquestVictoryConditions: @@ -86,6 +102,7 @@ Player: DebugResourceOreCapacity: -GpsWatcher: BaseAttackNotifier: + Audio: AI_ATACK.AUD World: OpenWidgetAtGameStart: @@ -189,15 +206,17 @@ World: SpawnMPUnits@ordos: InitialUnit: mcvo Faction: ordos +#TODO: These are just the Atreides sounds. EvaAlerts: RadarUp: RadarDown: - BuildingCannotPlaceAudio: + BuildingCannotPlaceAudio: AI_PLACE.AUD CashTickUp: CashTickDown: - LowPower: - SilosNeeded: - PrimaryBuildingSelected: + NewOptions: AI_NEWOP.AUD + LowPower: AI_POWER.AUD + SilosNeeded: AI_SILOS.AUD + PrimaryBuildingSelected: AI_PRMRY.AUD AbilityInsufficientPower: LevelUp: SpatialBins: From 27fa99852b9eaf592cd801f97b64e72d15440e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 20:14:56 +0200 Subject: [PATCH 19/36] add D2k crates, started fixing infantry infantry directions are correct, but movement is still wrong --- OpenRA.Utility/Command.cs | 50 ++++++++++++++++++++++++++------ OpenRA.Utility/R8Reader.cs | 5 ++-- mods/d2k/TODO | 3 +- mods/d2k/rules/system.yaml | 4 +-- mods/d2k/sequences.yaml | 58 +++++++++++++++++++++++--------------- ripD2kGameFiles.sh | 8 ++++-- 6 files changed, 89 insertions(+), 39 deletions(-) diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index 660f32a993..4d8ca09b00 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -122,14 +122,49 @@ namespace OpenRA.Utility int OffsetY = 0; int x = 0; - - if (args.Contains("--vehicle")) //resorting to RA/CnC compatible counter-clockwise frame order + + frame = srcImage[startFrame]; + + //TODO: This is not enough as the run and shoot animation are next to each other for each sequence in RA/CnC. + if (args.Contains("--infantry")) //resorting to RA/CnC compatible counter-clockwise frame order + { + endFrame = startFrame-1; + for (int e = 8; e < FrameCount+1; e=e+8) //assuming 8 facings each animation set + { + + for (int f = startFrame+e-1; f > endFrame; f--) + { + OffsetX = frame.FrameWidth/2 - frame.Width/2; + OffsetY = frame.FrameHeight/2 - frame.Height/2; + + Console.WriteLine("calculated OffsetX: {0}", OffsetX); + Console.WriteLine("calculated OffsetY: {0}", OffsetY); + + var data = bitmap.LockBits(new Rectangle(x+OffsetX, 0+OffsetY, frame.Width, frame.Height), ImageLockMode.WriteOnly, + PixelFormat.Format8bppIndexed); + + for (var i = 0; i < frame.Height; i++) + Marshal.Copy(frame.Image, i * frame.Width, + new IntPtr(data.Scan0.ToInt64() + i * data.Stride), frame.Width); + + bitmap.UnlockBits(data); + + x += frame.FrameWidth; + + frame = srcImage[f]; + Console.WriteLine("f: {0}", f); + } + endFrame = startFrame+e-1; + frame = srcImage[startFrame+e]; + Console.WriteLine("e: {0}", e); + Console.WriteLine("FrameCount: {0}", FrameCount); + } + } + else if (args.Contains("--vehicle")) //resorting to RA/CnC compatible counter-clockwise frame order { frame = srcImage[startFrame]; - - endFrame--; - startFrame--; - for (int f = endFrame; f > startFrame; f--) + + for (int f = endFrame-1; f > startFrame-1; f--) { OffsetX = frame.FrameWidth/2 - frame.OffsetX; OffsetY = frame.FrameHeight/2 - frame.OffsetY; @@ -184,8 +219,7 @@ namespace OpenRA.Utility for (int f = startFrame; f < endFrame; f++) { frame = srcImage[f]; - - if (args.Contains("--infantry")) + if (args.Contains("--infantrydeath")) { OffsetX = frame.FrameWidth/2 - frame.Width/2; OffsetY = frame.FrameHeight/2 - frame.Height/2; diff --git a/OpenRA.Utility/R8Reader.cs b/OpenRA.Utility/R8Reader.cs index 4901d9cc5e..f71f9aa76c 100644 --- a/OpenRA.Utility/R8Reader.cs +++ b/OpenRA.Utility/R8Reader.cs @@ -82,11 +82,10 @@ namespace OpenRA.Utility for (int i = 0; i < 256; i++) reader.ReadUInt16(); } - else if (ID == 2 && PaletteHandle != 0) + else if (ID == 2 && PaletteHandle != 0) // image with custom palette { - // ignore image with custom palette for (int i = 0; i < Width*Height; i++) - reader.ReadByte(); + Image[i] = reader.ReadByte(); } else //standard palette or 16 Bpp { diff --git a/mods/d2k/TODO b/mods/d2k/TODO index e8b997cea2..da7961d321 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -37,4 +37,5 @@ # replace RA mouse.shp, nopower.shp with Dune 2000 equivalent # complete Arrakis tileset (blocked by issue #2178) # allow frigate to deliver 5 units at once to starport -# starport prices should vary \ No newline at end of file +# starport prices should vary +# add shroud (Dune's 32x32 tiles differ completely from RA/CnC) \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index d4e180193e..2c22feae51 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -52,8 +52,8 @@ Player: InitialCash: 5000 ActorGroupProxy: DeveloperMode: - HackyAI@EasyAI: - Name:Easy AI + HackyAI@Omnius: + Name:Omnius RallypointTestBuilding: conyarda HarvesterUnit: harvester BaseBuildUnit: mcva,mcvh,mcvo diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index 70cb4251e3..adfc80b937 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -100,41 +100,59 @@ frigate: Start: 0 Facings: 1 -#TODO: This is wrong. rifle: stand: Start: 0 Facings: 8 stand2: - Start: 8 - Length: 8 + Start: 0 + Facings: 8 stand3: - Start: 128 - Length: 16 + Start: 0 + Facings: 8 run: - Start: 16 + Start: 8 Length: 6 Facings: 8 shoot: - Start: 64 - Length: 6 + Start: 56 + Length: 5 Facings: 8 prone-stand: - Start: 112 - Length: 4 + Start: 104 + Length: 1 Facings: 8 prone-run: - Start: 144 - Length: 4 + Start: 112 + Length: 3 Facings: 8 standup-0: - Start: 176 - Length: 2 + Start: 96 + Length: 1 Facings: 8 prone-shoot: - Start: 192 - Length: 6 + Start: 136 + Length: 5 Facings: 8 + die1: rifledeath + Start: 0 + Length: 5 + die2: rifledeath + Start: 5 + Length: 7 + die3: rifledeath + Start: 12 + Length: 7 + die4: rifledeath + Start: 19 + Length: 7 + die5: rifledeath + Start: 26 + Length: 7 + die-crushed: rifledeath + Start: 33 + Length: 7 + Tick: 1600 conyarda: idle: @@ -791,13 +809,9 @@ litning: Length: 4 crate: - idle: scrate + idle: crates Start: 0 - water: wwcrate - Start: 0 - Length: * - Tick: 500 - land: sh-crate + land: crates Start: 0 crate-effects: diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 5a46b494c6..7d362d6212 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -5,8 +5,8 @@ PAL="mods/d2k/bits/d2k.pal" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 2 "overlay" mono OpenRA.Utility.exe --shp overlay.png 32 -mono OpenRA.Utility.exe --r8 $R8 $PAL 40 101 "shroud" -mono OpenRA.Utility.exe --shp shroud.png 32 +#mono OpenRA.Utility.exe --r8 $R8 $PAL 40 101 "shadow" +#mono OpenRA.Utility.exe --shp shadow.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 102 105 "crates" mono OpenRA.Utility.exe --shp crates.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 106 109 "spicebloom" @@ -15,8 +15,10 @@ mono OpenRA.Utility.exe --shp spicebloom.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" mono OpenRA.Utility.exe --shp spice.png 48 -mono OpenRA.Utility.exe --r8 $R8 $PAL 206 457 "rifle" --infantry +mono OpenRA.Utility.exe --r8 $R8 $PAL 206 381 "rifle" --infantry mono OpenRA.Utility.exe --shp rifle.png 48 +mono OpenRA.Utility.exe --r8 $R8 $PAL 382 457 "rifledeath" --infantrydeath +mono OpenRA.Utility.exe --shp rifledeath.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 458 693 "rocket" --infantry mono OpenRA.Utility.exe --shp rocket.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 694 929 "fremen" --infantry From d9c4aada8aa24b234b5ed67d72b46b915ca2ba10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 20:29:15 +0200 Subject: [PATCH 20/36] updated the README so people can try this on their own --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README b/README index fb900c5b8c..29dd89bc6d 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ OpenRA is a Libre/Free Real Time Strategy game engine supporting early Westwood games like Command & Conquer and Command & Conquer: Red Alert. -Distributed mods include a reimagining and updating of both the Red Alert and Command & Conquer multiplayer games. +Distributed mods include a reimagining and updating of both the Red Alert and Command & Conquer multiplayer games. This repository tries to add Dune 2000. It is already a standalone mod, but still falls back to Red Alert gamefiles at some times. -Please read INSTALL on how to install an OpenRA development environment and HACKING for an overview of the engine. +Please read INSTALL on how to install an OpenRA development environment, HACKING for an overview of the engine and mods/d2k/TODO to find out about the still missing features. You need to copy "Dune 2000/Data/GAMESFX" and "Dune 2000/DATA/DATA.R8" to ~/.openra/Content/d2k/ and run the bash script ripD2kGameFiles.sh before starting the d2k mod. \ No newline at end of file From 5ab5bc9f7c0c320527cd1d91dc2f7110afefc6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Mon, 28 May 2012 23:36:46 +0200 Subject: [PATCH 21/36] removed need to define Harvester/BaseBuildingUnit manually --- OpenRA.Mods.RA/AI/HackyAI.cs | 27 ++++++++++----------------- mods/d2k/TODO | 1 - mods/d2k/rules/system.yaml | 7 +++++-- mods/d2k/sequences.yaml | 4 ++-- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/OpenRA.Mods.RA/AI/HackyAI.cs b/OpenRA.Mods.RA/AI/HackyAI.cs index d16127e785..be02529d02 100644 --- a/OpenRA.Mods.RA/AI/HackyAI.cs +++ b/OpenRA.Mods.RA/AI/HackyAI.cs @@ -36,8 +36,6 @@ namespace OpenRA.Mods.RA.AI public readonly string RallypointTestBuilding = "fact"; // temporary hack to maintain previous rallypoint behavior. public readonly string[] UnitQueues = {"Vehicle", "Infantry", "Plane"}; public readonly bool ShouldRepairBuildings = true; - public readonly string HarvesterUnit = "harv"; - public readonly string[] BaseBuildUnit = {"mcv"}; string IBotInfo.Name { get { return this.Name; } } @@ -68,7 +66,6 @@ namespace OpenRA.Mods.RA.AI { bool enabled; public int ticks; - public string FoundBaseBuildUnit; public Player p; PowerManager playerPower; readonly BuildingInfo rallypointTestBuilding; // temporary hack @@ -264,14 +261,14 @@ namespace OpenRA.Mods.RA.AI assignRolesTicks = Info.AssignRolesInterval; var newUnits = self.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == p && a.Actor.Info != Rules.Info[FoundBaseBuildUnit] + .Where(a => a.Actor.Owner == p && !a.Actor.HasTrait() && !activeUnits.Contains(a.Actor)) .Select(a => a.Actor).ToArray(); foreach (var a in newUnits) { BotDebug("AI: Found a newly built unit"); - if (a.Info == Rules.Info[Info.HarvesterUnit]) + if (a.HasTrait()) world.IssueOrder( new Order( "Harvest", a, false ) ); else unitsHangingAroundTheBase.Add(a); @@ -421,20 +418,16 @@ namespace OpenRA.Mods.RA.AI void DeployMcv(Actor self) { /* find our mcv and deploy it */ - foreach (var m in Info.BaseBuildUnit) - { - var mcv = self.World.Actors - .FirstOrDefault(a => a.Owner == p && a.Info == Rules.Info[m]); + var mcv = self.World.Actors + .FirstOrDefault(a => a.Owner == p && a.HasTrait()); - if (mcv != null) - { - baseCenter = mcv.Location; - world.IssueOrder(new Order("DeployTransform", mcv, false)); - FoundBaseBuildUnit = m; //remember the type to exclude it from attack forces - } - else - BotDebug("AI: Can't find BaseBuildUnit {0}.", m); + if (mcv != null) + { + baseCenter = mcv.Location; + world.IssueOrder(new Order("DeployTransform", mcv, false)); } + else + BotDebug("AI: Can't find BaseBuildUnit."); } internal IEnumerable FindQueues(string category) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index da7961d321..3c2d789564 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -14,7 +14,6 @@ # support separate turret sequence with RenderBuildingTurreted # ornithocopter should flap (might need new RenderOrni code for proper animation) # R8 converter needs infantry frame resorter -# add infantry dieing animation # add trooper # add engineer # add fremen diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 2c22feae51..10356cf2c9 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -9,6 +9,7 @@ Player: OnHoldAudio: AI_HOLD.AUD ReadyAudio: AI_BDRDY.AUD CancelledAudio: AI_CANCL.AUD + BlockedAudio: AI_NROOM.AUD ClassicProductionQueue@Defense: Type: Defense BuildSpeed: .4 @@ -17,6 +18,7 @@ Player: OnHoldAudio: AI_HOLD.AUD ReadyAudio: AI_BDRDY.AUD CancelledAudio: AI_CANCL.AUD + BlockedAudio: AI_NROOM.AUD ClassicProductionQueue@Vehicle: Type: Vehicle BuildSpeed: .4 @@ -25,6 +27,7 @@ Player: QueuedAudio:AI_TRAIN.AUD OnHoldAudio: AI_HOLD.AUD CancelledAudio: AI_CANCL.AUD + BlockedAudio: AI_NROOM.AUD ClassicProductionQueue@Infantry: Type: Infantry BuildSpeed: .4 @@ -33,6 +36,7 @@ Player: QueuedAudio:AI_TRAIN.AUD OnHoldAudio: AI_HOLD.AUD CancelledAudio: AI_CANCL.AUD + BlockedAudio: AI_NROOM.AUD ClassicProductionQueue@Plane: Type: Plane BuildSpeed: .4 @@ -41,6 +45,7 @@ Player: QueuedAudio:AI_TRAIN.AUD OnHoldAudio: AI_HOLD.AUD CancelledAudio: AI_CANCL.AUD + BlockedAudio: AI_NROOM.AUD PlaceBuilding: SupportPowerManager: ConquestVictoryConditions: @@ -55,8 +60,6 @@ Player: HackyAI@Omnius: Name:Omnius RallypointTestBuilding: conyarda - HarvesterUnit: harvester - BaseBuildUnit: mcva,mcvh,mcvo BuildingFractions: refa: 30% refh: 30% diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index adfc80b937..cd53a93baa 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -150,8 +150,8 @@ rifle: Start: 26 Length: 7 die-crushed: rifledeath - Start: 33 - Length: 7 + Start: 54 + Length: 22 Tick: 1600 conyarda: From cffaabb3bfb8737a57736bb95e2d2fd2f41e025b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 2 Jun 2012 11:41:18 +0200 Subject: [PATCH 22/36] added d2k mouse pointer, fixed aircrafts --- mods/d2k/bits/cursor.pal | Bin 768 -> 0 bytes mods/d2k/cursors.yaml | 161 +++++++++++++-------------------- mods/d2k/rules/aircraft.yaml | 8 +- mods/d2k/rules/defaults.yaml | 6 -- mods/d2k/rules/structures.yaml | 2 + mods/d2k/rules/system.yaml | 2 +- ripD2kGameFiles.sh | 6 ++ 7 files changed, 80 insertions(+), 105 deletions(-) delete mode 100644 mods/d2k/bits/cursor.pal diff --git a/mods/d2k/bits/cursor.pal b/mods/d2k/bits/cursor.pal deleted file mode 100644 index bb63fcdd50490a6ace83199cf15196a1e551c57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWlX>5{7;5QV#v78wGj7yAT)^T#DeE+w)r215IPWK<`0|4kh^=V|qs}{yR z)(Lb-lJ&FKUJv_zUDw@qyWJUvvA0aqv~1gUJjZc7*Y*7nAt!YFz;OeFbVv?icwh&#yrBF(A>NpHXDaS@#I@Nd0Wgd^`;d&jf%X9gAl*_evOxb)+ z$By(3u4P>FKolrvh+r4Tb`)C3H+|P|tPP!Cw7b&dNO||^+K;aZ;Qrmtqq_9sd@8#- zS6`{jlPZngKhM`~zFp3juIXx_szMa3APJ3v6y7y}eu4 z)B1pQgjK@N@^`!cj?=5{uSa#M#E|ipWGciGMU@wD2j!NV?p?gK!j0jJZs6*~z9i0h zNKzEVw&xp`9oAJKIO4gPr+X5cL9q3Gu&nX9R@1*wEl&Bg@ogWD#^JQ{VI`+=<421MGttfJm#3KaJG+ Date: Sat, 2 Jun 2012 15:36:31 +0200 Subject: [PATCH 23/36] added spice as a ressource still needs work though --- OpenRA.Mods.D2k/D2kLoadScreen.cs | 4 ++-- README | 2 +- mods/d2k/TODO | 4 ++-- mods/d2k/maps/test.oramap | Bin 1118 -> 1141 bytes mods/d2k/rules/defaults.yaml | 6 +++--- mods/d2k/rules/system.yaml | 27 +++++++++++---------------- mods/d2k/tilesets/arrakis.yaml | 6 ++++++ mods/d2k/voices.yaml | 2 +- ripD2kGameFiles.sh | 14 +++++++++----- 9 files changed, 35 insertions(+), 30 deletions(-) diff --git a/OpenRA.Mods.D2k/D2kLoadScreen.cs b/OpenRA.Mods.D2k/D2kLoadScreen.cs index 2136ae8a04..bfa77774ea 100644 --- a/OpenRA.Mods.D2k/D2kLoadScreen.cs +++ b/OpenRA.Mods.D2k/D2kLoadScreen.cs @@ -9,6 +9,7 @@ #endregion using System.Collections.Generic; +using System.IO; using System.Drawing; using OpenRA.FileFormats; using OpenRA.Graphics; @@ -36,8 +37,7 @@ namespace OpenRA.Mods.D2k // can display loadscreen as early as possible r = Game.Renderer; if (r == null) return; - - var s = new Sheet("mods/d2k/uibits/loadscreen.png"); + var s = new Sheet(Path.Combine(Path.Combine(Path.Combine("mods", "d2k"), "uibits"), "loadscreen.png")); Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); diff --git a/README b/README index 29dd89bc6d..c4b4efc183 100644 --- a/README +++ b/README @@ -2,4 +2,4 @@ OpenRA is a Libre/Free Real Time Strategy game engine supporting early Westwood Distributed mods include a reimagining and updating of both the Red Alert and Command & Conquer multiplayer games. This repository tries to add Dune 2000. It is already a standalone mod, but still falls back to Red Alert gamefiles at some times. -Please read INSTALL on how to install an OpenRA development environment, HACKING for an overview of the engine and mods/d2k/TODO to find out about the still missing features. You need to copy "Dune 2000/Data/GAMESFX" and "Dune 2000/DATA/DATA.R8" to ~/.openra/Content/d2k/ and run the bash script ripD2kGameFiles.sh before starting the d2k mod. \ No newline at end of file +Please read INSTALL on how to install an OpenRA development environment, HACKING for an overview of the engine and mods/d2k/TODO to find out about the still missing features. You need to copy "Dune 2000/Data/GAMESFX" and "Dune 2000/DATA/DATA.R8" and "Dune 2000/DATA/MOUSE.R8" to ~/.openra/Content/d2k/ and run the bash script ripD2kGameFiles.sh before starting the d2k mod. \ No newline at end of file diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 3c2d789564..32c7c0a3b1 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -7,7 +7,8 @@ # welding animation (factories) missing # chimney animation (refinery) missing # create a tileset extractor for gamefiles to remove copyrighted content from distribution -# replace ore with spice and mines with spice blooms +# replace mines with spice blooms +# spice tiles do not fit # add Smudge Types (stored in SHPs not in tileset) # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls @@ -33,7 +34,6 @@ # add install rules to makefile (once more polished) # add sonic tank weapon (currently uses tesla) # make deviator change the allegiance of ememy units (currently shoots rockets) -# replace RA mouse.shp, nopower.shp with Dune 2000 equivalent # complete Arrakis tileset (blocked by issue #2178) # allow frigate to deliver 5 units at once to starport # starport prices should vary diff --git a/mods/d2k/maps/test.oramap b/mods/d2k/maps/test.oramap index 7b592f36c1071c458b2136eabde2fbb6463d7a9d..f2dc2e50a9760d694beca262489d3494f1edaa54 100644 GIT binary patch delta 643 zcmcb|@s*=Kz?+#xgn@y9gF&VGki(jj=Mqhs7#LU`7#Y}sqPd9$dP$jiZ||P%yJaB3 zdf_~$E~|0QkBJqxE5G=K_?mPwB_6QIEj?H9P^UKa>8;HQFKzEJ1NAX5B;4&)J8tIw zrX%ZzcuK0#r9w2o&VlGJ`17lzPzvcYkU89-~W0S_t)-`Pu|^m z<4kNXYs8j%_Q}3W&fd8i(eQ5nyZt-<|2zHH+VbC*H(P(N|8sg?eHyd8@0|Km^Xh*! zpPl>vXZb(P>VNew`OV7b)xd?-<=@ZW^#1?9gyOeb?W?~0)2#cy_wOxv+p7N}`~Tmo zd)qH}cYoLY`uzRh-22b{Kl*GL_iw!Z|1DkLWM0a=)x4y6t9HrWzx?2^MG)7|)>SyU=%1^9c34=c zs_>t&{5*k+-Jj?G{Ls=7H)p@R#DDK!<-0muLsn0|!zh`#x1QZqXVI&_)*4BIq3`cI z3U;rk`p?%D;d1qNdB71RV8p{gLw3;r^uO2g!3f=2hClUxZgqW)-v2e)9;_pIKO;&) j+8n?%laUjiq9%W0)?o(nCM&W?Ge%9eWszq40!}6XVCXl{ delta 664 zcmey$agU=uz?+#xgn@y9gCTMCE{C1xYuCv!F)*+?FfypK^LGRk?=O%x@;nv_^|NOt@pZ&#q?6(O%xcqZ{QBKht z`P&>HUjC6^8T&U{?|;4a*8cL<_0wP6x4X9nLe2dbyQuzm#r?1Eh5p_?{(I-P*&S!^ zT#jgP{awD{rpv7}w!N$`{=WX({r$cFyZa}H}Udih85-@m=JZ~E)3>bv&W=ga?I zJpW$&(fj+i_y4`<|NZ}?_xEq}$GwkdXvp;4KFj;a(%WTace7N2wf|pnsqQT4{HFbX z%kNvCvvRkyU9NjG?dSSw^;zwg>v~E|{y)3_XY-Li^1D(~|B283@4Te>=layEYoEy! z_B|6R>`Ig0X#W4}C;!zM=O>=KI8SNrqPy<5X4gYP7EbQS`*v7ZsjBdwvHU!Ni`}2+ z|NPL>5jW@mnRa!TFOUBGZT|RwN&WKf2$!vs?=eb-Uj1Dja71aV%@&YBR%Ea890B=?{kQ@^bW&`QFK-CNk08#%q^Z)<= diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index b9a5a7e09a..650b2c5157 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -6,7 +6,7 @@ Clear: 80 Rough: 40 Road: 100 - Ore: 70 + Spice: 70 Beach: 40 ROT: 5 SelectionDecorations: @@ -38,7 +38,7 @@ Clear: 80 Rough: 70 Road: 100 - Ore: 70 + Spice: 70 Beach: 70 ROT: 5 SelectionDecorations: @@ -77,7 +77,7 @@ Clear: 90 Rough: 80 Road: 100 - Ore: 80 + Spice: 80 Beach: 80 SelectionDecorations: Selectable: diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index b89f4c3f53..66e5a89148 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -100,10 +100,6 @@ Player: PlayerColorPalette: BasePalette: d2k PaletteFormat: d2k - DebugResourceCash: - DebugResourceOre: - DebugResourceOreCapacity: - -GpsWatcher: BaseAttackNotifier: Audio: AI_ATACK.AUD @@ -112,9 +108,7 @@ World: Widget: INGAME_ROOT ObserverWidget: OBSERVER_ROOT ScreenShaker: - -WaterPaletteRotation: NukePaletteEffect: - -LightPaletteRotator: BuildingInfluence: ChooseBuildTabOnSelect: CrateSpawner: @@ -179,15 +173,16 @@ World: Race: ordos # BibLayer: ResourceLayer: -# ResourceType@spice: -# ResourceType: 1 -# Palette: d2k -# SpriteNames: spice #? -# ValuePerUnit: 25 -# Name: Spice -# PipColor: Yellow -# AllowedTerrainTypes: Sand -# AllowUnderActors: false + ResourceType@spice: + ResourceType: 1 + Palette: d2k + TerrainType: Spice + SpriteNames: spice0 + ValuePerUnit: 35 + Name: Spice + PipColor: Yellow + AllowedTerrainTypes: Clear + AllowUnderActors: false # SmudgeLayer@SCORCH: # Type:Scorch # SmokePercentage:50 @@ -232,7 +227,7 @@ CRATE: Name: Crate Crate: Lifetime: 120 - TerrainTypes: Clear, Rough, Road, Water, Ore, Beach + TerrainTypes: Clear, Rough, Road, Water, Beach GiveCashCrateAction: Amount: 1000 SelectionShares: 50 diff --git a/mods/d2k/tilesets/arrakis.yaml b/mods/d2k/tilesets/arrakis.yaml index b32dcd1fe0..403a0c1de3 100644 --- a/mods/d2k/tilesets/arrakis.yaml +++ b/mods/d2k/tilesets/arrakis.yaml @@ -12,6 +12,12 @@ Terrain: AcceptSmudge: True IsWater: False Color: 255,255,255,255 + TerrainType@Spice: + Type: Spice + Buildable: False + AcceptSmudge: False + IsWater: False + Color: 255,255,255,255 Templates: Template@0: diff --git a/mods/d2k/voices.yaml b/mods/d2k/voices.yaml index 852581dcca..43d6e6a85c 100644 --- a/mods/d2k/voices.yaml +++ b/mods/d2k/voices.yaml @@ -1,4 +1,4 @@ -# requires Dune 2000/DATA/GAMESFX copied to OpenRA/Content/d2k +# requires Dune 2000/DATA/GAMESFX copied to ~/.openra/Content/d2k GenericVoice: Variants: diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 8767030ea7..631fbb4ca0 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -1,5 +1,5 @@ #!/bin/bash -R8="/home/matthias/.openra/Content/d2k/DATA.R8" +R8="$HOME/.openra/Content/d2k/DATA.R8" PAL="mods/d2k/bits/d2k.pal" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 2 "overlay" @@ -13,8 +13,8 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 106 109 "spicebloom" mono OpenRA.Utility.exe --shp spicebloom.png 32 -mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" -mono OpenRA.Utility.exe --shp spice.png 48 +#mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" +#mono OpenRA.Utility.exe --shp spice.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 206 381 "rifle" --infantry mono OpenRA.Utility.exe --shp rifle.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 382 457 "rifledeath" --infantrydeath @@ -376,10 +376,14 @@ mono OpenRA.Utility.exe --shp windtrap_anim.png 96 mono OpenRA.Utility.exe --r8 $R8 $PAL 4820 4840 "missile_launch" mono OpenRA.Utility.exe --shp missile_launch.png 96 -R8="/home/matthias/.openra/Content/d2k/MOUSE.R8" -PAL="mods/d2k/bits/d2k.pal" +R8="$HOME/.openra/Content/d2k/MOUSE.R8" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 264 "mouse" --transparent mono OpenRA.Utility.exe --shp mouse.png 48 +R8="$HOME/.openra/Content/d2k/BLOXBASE.R8" +mono OpenRA.Utility.exe --r8 $R8 $PAL 0 799 "BLOXBASE" +#mono OpenRA.Utility.exe --r8 $R8 $PAL 748 757 "spice0" +#mono OpenRA.Utility.exe --shp spice0.png 32 + mv *.shp mods/d2k/bits \ No newline at end of file From accaf027fef9790b8937cd83499efbfd5cd7a4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 2 Jun 2012 17:46:31 +0200 Subject: [PATCH 24/36] added (broken) content installer, moved instruction to GUI still depends on the hacky bash script and CD extractor crashes --- OpenRA.Mods.D2k/D2kLoadScreen.cs | 20 ++- OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj | 2 + .../Widgets/Logic/D2kInstallFromCDLogic.cs | 119 ++++++++++++++++++ .../Widgets/Logic/D2kInstallLogic.cs | 35 ++++++ README | 4 +- mods/d2k/chrome/gameinit.yaml | 103 +++++++-------- mods/d2k/mod.yaml | 3 + 7 files changed, 221 insertions(+), 65 deletions(-) create mode 100644 OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs create mode 100644 OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs diff --git a/OpenRA.Mods.D2k/D2kLoadScreen.cs b/OpenRA.Mods.D2k/D2kLoadScreen.cs index bfa77774ea..146d1e250e 100644 --- a/OpenRA.Mods.D2k/D2kLoadScreen.cs +++ b/OpenRA.Mods.D2k/D2kLoadScreen.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.D2k // can display loadscreen as early as possible r = Game.Renderer; if (r == null) return; - var s = new Sheet(Path.Combine(Path.Combine(Path.Combine("mods", "d2k"), "uibits"), "loadscreen.png")); + var s = new Sheet("mods/d2k/uibits/loadscreen.png"); Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); @@ -73,9 +73,21 @@ namespace OpenRA.Mods.D2k void TestAndContinue() { Ui.ResetAll(); - Game.LoadShellMap(); - Ui.ResetAll(); - Ui.OpenWindow("MAINMENU_BG"); + if (!FileSystem.Exists(Info["TestFile"])) + { + var args = new WidgetArgs() + { + { "continueLoading", () => TestAndContinue() }, + { "installData", Info } + }; + Ui.OpenWindow(Info["InstallerMenuWidget"], args); + } + else + { + Game.LoadShellMap(); + Ui.ResetAll(); + Ui.OpenWindow("MAINMENU_BG"); + } } } } \ No newline at end of file diff --git a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj index 42540d4f24..1c47421063 100644 --- a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj +++ b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj @@ -58,6 +58,8 @@ + + diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs new file mode 100644 index 0000000000..340a462624 --- /dev/null +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs @@ -0,0 +1,119 @@ +#region Copyright & License Information +/* + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.IO; +using System.Linq; +using System.Threading; +using OpenRA.FileFormats; +using OpenRA.FileFormats.Graphics; +using OpenRA.Widgets; + +namespace OpenRA.Mods.D2k.Widgets.Logic +{ + public class D2kInstallFromCDLogic + { + Widget panel; + ProgressBarWidget progressBar; + LabelWidget statusLabel; + Action continueLoading; + ButtonWidget retryButton, backButton; + Widget installingContainer, insertDiskContainer; + + [ObjectCreator.UseCtor] + public D2kInstallFromCDLogic(Widget widget, Action continueLoading) + { + this.continueLoading = continueLoading; + panel = widget.Get("INSTALL_FROMCD_PANEL"); + progressBar = panel.Get("PROGRESS_BAR"); + statusLabel = panel.Get("STATUS_LABEL"); + + backButton = panel.Get("BACK_BUTTON"); + backButton.OnClick = Ui.CloseWindow; + + retryButton = panel.Get("RETRY_BUTTON"); + retryButton.OnClick = CheckForDisk; + + installingContainer = panel.Get("INSTALLING"); + insertDiskContainer = panel.Get("INSERT_DISK"); + CheckForDisk(); + } + + void CheckForDisk() + { + Func ValidDiskFilter = diskRoot => File.Exists(diskRoot+Path.DirectorySeparatorChar+"MAIN.MIX") && + File.Exists(new string[] { diskRoot, "setup", "setup.z" }.Aggregate(Path.Combine)); + + var path = InstallUtils.GetMountedDisk(ValidDiskFilter); + + if (path != null) + Install(path); + else + { + insertDiskContainer.IsVisible = () => true; + installingContainer.IsVisible = () => false; + } + } + + void Install(string source) + { + backButton.IsDisabled = () => true; + retryButton.IsDisabled = () => true; + insertDiskContainer.IsVisible = () => false; + installingContainer.IsVisible = () => true; + + var dest = new string[] { Platform.SupportDir, "Content", "d2k" }.Aggregate(Path.Combine); + var copyFiles = new string[] { "music/ambush.aud" }; + + var extractPackage = "setup/setup.z"; + var extractFiles = new string[] { "DATA.R8", "MOUSE.R8", "BLOXBASE.R8" }; + + var installCounter = 0; + var installTotal = copyFiles.Count() + extractFiles.Count(); + var onProgress = (Action)(s => Game.RunAfterTick(() => + { + progressBar.Percentage = installCounter*100/installTotal; + installCounter++; + + statusLabel.GetText = () => s; + })); + + var onError = (Action)(s => Game.RunAfterTick(() => + { + statusLabel.GetText = () => "Error: "+s; + backButton.IsDisabled = () => false; + retryButton.IsDisabled = () => false; + })); + + var t = new Thread( _ => + { + try + { + if (!InstallUtils.CopyFiles(source, copyFiles, dest, onProgress, onError)) + return; + + if (!InstallUtils.ExtractFromPackage(source, extractPackage, extractFiles, dest, onProgress, onError)) + return; + + Game.RunAfterTick(() => + { + Ui.CloseWindow(); + continueLoading(); + }); + } + catch + { + onError("Installation failed"); + } + }) { IsBackground = true }; + t.Start(); + } + } +} diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs new file mode 100644 index 0000000000..712355ffa7 --- /dev/null +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs @@ -0,0 +1,35 @@ +#region Copyright & License Information +/* + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Widgets; + +namespace OpenRA.Mods.D2k.Widgets.Logic +{ + public class D2kInstallLogic + { + [ObjectCreator.UseCtor] + public D2kInstallLogic(Widget widget, Dictionary installData, Action continueLoading) + { + var panel = widget.Get("INSTALL_PANEL"); + var args = new WidgetArgs() + { + { "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } }, + { "installData", installData } + }; + + panel.Get("INSTALL_BUTTON").OnClick = () => + Ui.OpenWindow("INSTALL_FROMCD_PANEL", args); + + panel.Get("QUIT_BUTTON").OnClick = Game.Exit; + } + } +} diff --git a/README b/README index c4b4efc183..97a5a6d9d8 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ OpenRA is a Libre/Free Real Time Strategy game engine supporting early Westwood games like Command & Conquer and Command & Conquer: Red Alert. -Distributed mods include a reimagining and updating of both the Red Alert and Command & Conquer multiplayer games. This repository tries to add Dune 2000. It is already a standalone mod, but still falls back to Red Alert gamefiles at some times. +Distributed mods include a reimagining and updating of both the Red Alert and Command & Conquer multiplayer games. -Please read INSTALL on how to install an OpenRA development environment, HACKING for an overview of the engine and mods/d2k/TODO to find out about the still missing features. You need to copy "Dune 2000/Data/GAMESFX" and "Dune 2000/DATA/DATA.R8" and "Dune 2000/DATA/MOUSE.R8" to ~/.openra/Content/d2k/ and run the bash script ripD2kGameFiles.sh before starting the d2k mod. \ No newline at end of file +Please read INSTALL on how to install an OpenRA development environment and HACKING for an overview of the engine. \ No newline at end of file diff --git a/mods/d2k/chrome/gameinit.yaml b/mods/d2k/chrome/gameinit.yaml index 41b0fba569..b7b0296b56 100644 --- a/mods/d2k/chrome/gameinit.yaml +++ b/mods/d2k/chrome/gameinit.yaml @@ -1,16 +1,16 @@ Background@INSTALL_PANEL: - Logic:RAInstallLogic + Logic:D2kInstallLogic X:(WINDOW_RIGHT - WIDTH)/2 Y:(WINDOW_BOTTOM - HEIGHT)/2 - Width:500 - Height:160 + Width:600 + Height:300 Children: Label@TITLE: X:0 Y:20 Width:PARENT_RIGHT Height:25 - Text:Install Required + Text:Content files missing Align:Center Font:Bold Label@DESC1: @@ -18,28 +18,56 @@ Background@INSTALL_PANEL: Y:50 Width:PARENT_RIGHT Height:25 - Text:OpenRA requires the original Red Alert game content. + Text:This is the work in progress Dune 2000 mod. Align:Center Label@DESC2: X:0 Y:70 Width:PARENT_RIGHT Height:25 - Text:Content can be downloaded, or copied from the install CD. + Text:It requires the original Dune 2000 (and still some Red Alert game) content. Align:Center - Button@DOWNLOAD_BUTTON: - X:PARENT_RIGHT - 280 - Y:PARENT_BOTTOM - 45 - Width:120 + Label@DESC4: + X:0 + Y:110 + Width:PARENT_RIGHT Height:25 - Text:Download - Font:Bold + Text:You need to copy "Dune 2000/Data/GAMESFX", "Dune 2000/DATA/DATA.R8" + Align:Center + Label@DESC5: + X:0 + Y:130 + Width:PARENT_RIGHT + Height:25 + Text:and "Dune 2000/DATA/MOUSE.R8" from your local Dune 2000 installation + Align:Center + Label@DESC6: + X:0 + Y:150 + Width:PARENT_RIGHT + Height:25 + Text:to ~/.openra/Content/d2k/ and run the bash script ripD2kGameFiles.sh + Align:Center + Label@DESC7: + X:0 + Y:170 + Width:PARENT_RIGHT + Height:25 + Text:to convert the content. In the future this GUI should do this + Align:Center + Label@DESC8: + X:0 + Y:190 + Width:PARENT_RIGHT + Height:25 + Text:automatically using your Dune 2000 CD (won't work yet). + Align:Center Button@INSTALL_BUTTON: X:PARENT_RIGHT - 420 Y:PARENT_BOTTOM - 45 - Width:120 + Width:150 Height:25 - Text:Use CD + Text:Use CD (will crash) Font:Bold Button@QUIT_BUTTON: X:PARENT_RIGHT - 140 @@ -49,51 +77,8 @@ Background@INSTALL_PANEL: Text:Quit Font:Bold -Background@INSTALL_DOWNLOAD_PANEL: - Logic:DownloadPackagesLogic - X:(WINDOW_RIGHT - WIDTH)/2 - Y:(WINDOW_BOTTOM - HEIGHT)/2 - Width:500 - Height:160 - Children: - Label@TITLE: - X:0 - Y:20 - Width:PARENT_RIGHT - Height:25 - Text:Downloading Red Alert Content - Align:Center - Font:Bold - ProgressBar@PROGRESS_BAR: - X:50 - Y:55 - Width:PARENT_RIGHT - 100 - Height:25 - Label@STATUS_LABEL: - X:50 - Y:80 - Width:PARENT_RIGHT - 100 - Height:25 - Align:Left - Button@RETRY_BUTTON: - X:PARENT_RIGHT - 280 - Y:PARENT_BOTTOM - 45 - Width:120 - Height:25 - Visible: false - Text:Retry - Font:Bold - Key:return - Button@CANCEL_BUTTON: - X:PARENT_RIGHT - 140 - Y:PARENT_BOTTOM - 45 - Width:120 - Height:25 - Text:Cancel - Font:Bold - Key:escape Background@INSTALL_FROMCD_PANEL: - Logic:RAInstallFromCDLogic + Logic:D2kInstallFromCDLogic X:(WINDOW_RIGHT - WIDTH)/2 Y:(WINDOW_BOTTOM - HEIGHT)/2 Width:500 @@ -138,7 +123,7 @@ Background@INSTALL_FROMCD_PANEL: Y:70 Width:PARENT_RIGHT Height:25 - Text:Please insert one of the Red Alert install CDs then click Retry. + Text:Please insert the Dune 2000 install CDs then click Retry. Align:Center Button@RETRY_BUTTON: X:PARENT_RIGHT - 280 diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 03e759d772..eba4fbec75 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -81,6 +81,7 @@ Voices: TileSets: mods/d2k/tilesets/arrakis.yaml +# mods/d2k/tilesets/bloxbase.yaml TileSize: 32 @@ -90,6 +91,8 @@ Music: Movies: LoadScreen: D2kLoadScreen + InstallerMenuWidget: INSTALL_PANEL + TestFile: DATA.R8 ServerTraits: LobbyCommands From 83ee6b758e0c7ab4ebdc4633c85a2fafe17de51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 2 Jun 2012 21:17:42 +0200 Subject: [PATCH 25/36] fix CD rip logic a little will still fail on setup.z --- OpenRA.Mods.D2k/D2kLoadScreen.cs | 1 - .../Widgets/Logic/D2kInstallFromCDLogic.cs | 20 +++++++++++-------- .../Widgets/Logic/D2kInstallLogic.cs | 4 ++-- mods/d2k/chrome/gameinit.yaml | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/OpenRA.Mods.D2k/D2kLoadScreen.cs b/OpenRA.Mods.D2k/D2kLoadScreen.cs index 146d1e250e..9bd9c709da 100644 --- a/OpenRA.Mods.D2k/D2kLoadScreen.cs +++ b/OpenRA.Mods.D2k/D2kLoadScreen.cs @@ -77,7 +77,6 @@ namespace OpenRA.Mods.D2k { var args = new WidgetArgs() { - { "continueLoading", () => TestAndContinue() }, { "installData", Info } }; Ui.OpenWindow(Info["InstallerMenuWidget"], args); diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs index 340a462624..666d18e9bb 100644 --- a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs @@ -23,14 +23,12 @@ namespace OpenRA.Mods.D2k.Widgets.Logic Widget panel; ProgressBarWidget progressBar; LabelWidget statusLabel; - Action continueLoading; ButtonWidget retryButton, backButton; Widget installingContainer, insertDiskContainer; [ObjectCreator.UseCtor] - public D2kInstallFromCDLogic(Widget widget, Action continueLoading) + public D2kInstallFromCDLogic(Widget widget) { - this.continueLoading = continueLoading; panel = widget.Get("INSTALL_FROMCD_PANEL"); progressBar = panel.Get("PROGRESS_BAR"); statusLabel = panel.Get("STATUS_LABEL"); @@ -46,12 +44,18 @@ namespace OpenRA.Mods.D2k.Widgets.Logic CheckForDisk(); } + public static bool IsValidDisk(string diskRoot) + { + var files = new string[][] { + new [] { diskRoot, "music", "ambush.aud" }, + }; + + return files.All(f => File.Exists(f.Aggregate(Path.Combine))); + } + void CheckForDisk() { - Func ValidDiskFilter = diskRoot => File.Exists(diskRoot+Path.DirectorySeparatorChar+"MAIN.MIX") && - File.Exists(new string[] { diskRoot, "setup", "setup.z" }.Aggregate(Path.Combine)); - - var path = InstallUtils.GetMountedDisk(ValidDiskFilter); + var path = InstallUtils.GetMountedDisk(IsValidDisk); if (path != null) Install(path); @@ -105,7 +109,7 @@ namespace OpenRA.Mods.D2k.Widgets.Logic Game.RunAfterTick(() => { Ui.CloseWindow(); - continueLoading(); + Game.Exit(); }); } catch diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs index 712355ffa7..72eabdf13b 100644 --- a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallLogic.cs @@ -17,12 +17,12 @@ namespace OpenRA.Mods.D2k.Widgets.Logic public class D2kInstallLogic { [ObjectCreator.UseCtor] - public D2kInstallLogic(Widget widget, Dictionary installData, Action continueLoading) + public D2kInstallLogic(Widget widget, Dictionary installData) { var panel = widget.Get("INSTALL_PANEL"); var args = new WidgetArgs() { - { "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } }, + { "afterInstall", () => { Ui.CloseWindow(); Game.Exit(); } }, { "installData", installData } }; diff --git a/mods/d2k/chrome/gameinit.yaml b/mods/d2k/chrome/gameinit.yaml index b7b0296b56..94d60d5bb4 100644 --- a/mods/d2k/chrome/gameinit.yaml +++ b/mods/d2k/chrome/gameinit.yaml @@ -67,7 +67,7 @@ Background@INSTALL_PANEL: Y:PARENT_BOTTOM - 45 Width:150 Height:25 - Text:Use CD (will crash) + Text:Use CD (broken) Font:Bold Button@QUIT_BUTTON: X:PARENT_RIGHT - 140 From 749301899ec63805ec6813922862ed564da37774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Tue, 5 Jun 2012 18:14:17 +0200 Subject: [PATCH 26/36] added smudge palette problems and engine does not care for terrain type --- .../Widgets/Logic/D2kInstallFromCDLogic.cs | 1 + mods/d2k/TODO | 10 ++++++---- mods/d2k/rules/system.yaml | 13 ++++-------- mods/d2k/weapons.yaml | 20 +++++++++---------- ripD2kGameFiles.sh | 14 ++++++++++--- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs index 666d18e9bb..7054b8f856 100644 --- a/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kInstallFromCDLogic.cs @@ -48,6 +48,7 @@ namespace OpenRA.Mods.D2k.Widgets.Logic { var files = new string[][] { new [] { diskRoot, "music", "ambush.aud" }, + new [] { diskRoot, "setup", "setup.z" }, }; return files.All(f => File.Exists(f.Aggregate(Path.Combine))); diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 32c7c0a3b1..f6b7b6661d 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -6,10 +6,9 @@ # construction yard crane animations missing # welding animation (factories) missing # chimney animation (refinery) missing -# create a tileset extractor for gamefiles to remove copyrighted content from distribution +# create a tileset extractor for gamefiles to remove copyrighted content from distribution (convert BLOX*.R8 to TMP files) # replace mines with spice blooms # spice tiles do not fit -# add Smudge Types (stored in SHPs not in tileset) # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # support separate turret sequence with RenderBuildingTurreted @@ -34,7 +33,10 @@ # add install rules to makefile (once more polished) # add sonic tank weapon (currently uses tesla) # make deviator change the allegiance of ememy units (currently shoots rockets) -# complete Arrakis tileset (blocked by issue #2178) +# complete Arrakis tileset (blocked by TilesetBuilder crashing on export) # allow frigate to deliver 5 units at once to starport # starport prices should vary -# add shroud (Dune's 32x32 tiles differ completely from RA/CnC) \ No newline at end of file +# reinforcements have arrived is played twice when ordering via starport +# add shroud (Dune's 32x32 tiles differ completely from RA/CnC) +# black spots on buildings should be transparent +# gamefile extraction (setup/setup.z) from CD fails \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 66e5a89148..fccac040a4 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -183,15 +183,10 @@ World: PipColor: Yellow AllowedTerrainTypes: Clear AllowUnderActors: false -# SmudgeLayer@SCORCH: -# Type:Scorch -# SmokePercentage:50 -# Types:sc1,sc2,sc3,sc4,sc5,sc6 -# Depths:1,1,1,1,1,1 -# SmudgeLayer@CRATER: -# Type:Crater -# Types:cr1,cr2,cr3,cr4,cr5,cr6 -# Depths:5,5,5,5,5,5 + SmudgeLayer@CRATER: + Type:Crater + Types:rockcrater1,rockcrater2,sandcrater1,sandcrater2 + Depths:15,15,15,15 SpawnMapActors: CreateMPPlayers: MPStartLocations: diff --git a/mods/d2k/weapons.yaml b/mods/d2k/weapons.yaml index 24a4525852..7332824180 100644 --- a/mods/d2k/weapons.yaml +++ b/mods/d2k/weapons.yaml @@ -42,7 +42,7 @@ Dragon: Explosion: med_explosion WaterExplosion: med_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 50 ImpactSound: kaboom12 @@ -75,7 +75,7 @@ QuadRockets: Explosion: med_explosion WaterExplosion: med_splash ImpactSound: kaboom12 -# SmudgeType: Crater + SmudgeType: Crater Damage: 35 TurretGun: @@ -95,7 +95,7 @@ TurretGun: Explosion: small_explosion WaterExplosion: small_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 60 25mm: @@ -115,7 +115,7 @@ TurretGun: Explosion: small_explosion WaterExplosion: small_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 16 90mm: @@ -135,7 +135,7 @@ TurretGun: Explosion: small_explosion WaterExplosion: small_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 30 105mm: @@ -157,7 +157,7 @@ TurretGun: Explosion: small_explosion WaterExplosion: small_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 40 120mm: @@ -178,7 +178,7 @@ TurretGun: Explosion: small_explosion WaterExplosion: small_splash InfDeath: 3 -# SmudgeType: Crater + SmudgeType: Crater Damage: 50 227mm: @@ -210,7 +210,7 @@ TurretGun: Explosion: med_explosion WaterExplosion: med_splash ImpactSound: kaboom12 -# SmudgeType: Crater + SmudgeType: Crater Damage: 25 #for rocket turret @@ -242,7 +242,7 @@ MammothTusk: Explosion: med_explosion WaterExplosion: med_splash InfDeath: 2 -# SmudgeType: Crater + SmudgeType: Crater Damage: 45 155mm: @@ -268,7 +268,7 @@ MammothTusk: Explosion: large_explosion WaterExplosion: med_splash InfDeath: 2 -# SmudgeType: Crater + SmudgeType: Crater Damage: 220 TTankZap: diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 631fbb4ca0..29ab3bc0c1 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -11,10 +11,16 @@ mono OpenRA.Utility.exe --r8 $R8 $PAL 102 105 "crates" mono OpenRA.Utility.exe --shp crates.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 106 109 "spicebloom" mono OpenRA.Utility.exe --shp spicebloom.png 32 +# stars, arrow-up +mono OpenRA.Utility.exe --r8 $R8 $PAL 114 129 "rockcrater1" +mono OpenRA.Utility.exe --shp rockcrater1.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 130 145 "rockcrater2" +mono OpenRA.Utility.exe --shp rockcrater2.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 146 161 "sandcrater1" +mono OpenRA.Utility.exe --shp sandcrater1.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 162 177 "sandcrater2" +mono OpenRA.Utility.exe --shp sandcrater2.png 32 - -#mono OpenRA.Utility.exe --r8 $R8 $PAL 194 205 "spice" -#mono OpenRA.Utility.exe --shp spice.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 206 381 "rifle" --infantry mono OpenRA.Utility.exe --shp rifle.png 48 mono OpenRA.Utility.exe --r8 $R8 $PAL 382 457 "rifledeath" --infantrydeath @@ -383,6 +389,8 @@ mono OpenRA.Utility.exe --shp mouse.png 48 R8="$HOME/.openra/Content/d2k/BLOXBASE.R8" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 799 "BLOXBASE" +mono OpenRA.Utility.exe --r8 $R8 $PAL 0 0 "sand0" + #mono OpenRA.Utility.exe --r8 $R8 $PAL 748 757 "spice0" #mono OpenRA.Utility.exe --shp spice0.png 32 From 676210422f7d92106c15168d2894898b26d504be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Tue, 5 Jun 2012 19:50:44 +0200 Subject: [PATCH 27/36] added spice bloom indestructable, seeds ressources like mine or blossom tree --- mods/d2k/TODO | 3 +-- mods/d2k/maps/test.oramap | Bin 1141 -> 1171 bytes mods/d2k/rules/system.yaml | 23 +++++++++++++++++++++-- mods/d2k/sequences.yaml | 12 +++++++++++- ripD2kGameFiles.sh | 6 +++--- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/mods/d2k/TODO b/mods/d2k/TODO index f6b7b6661d..5aa2e0c759 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -7,8 +7,7 @@ # welding animation (factories) missing # chimney animation (refinery) missing # create a tileset extractor for gamefiles to remove copyrighted content from distribution (convert BLOX*.R8 to TMP files) -# replace mines with spice blooms -# spice tiles do not fit +# add more spice tiles and make them fit # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # support separate turret sequence with RenderBuildingTurreted diff --git a/mods/d2k/maps/test.oramap b/mods/d2k/maps/test.oramap index f2dc2e50a9760d694beca262489d3494f1edaa54..dc387a59ae17316f634916e56d101befbbde1405 100644 GIT binary patch delta 498 zcmV@6aWAK2mmCU#jy=o0)L#vK$x7Bu#y1)0G9&*00;m80BvD# zE_q>XY_(ELZreZ%U7M%S0kn|pG;Ou2>NG%+I4LBjS8Lug0 z@qc6nJwQG1-i0dLAoE^f6hY}o0c?sEAdmkaRO4YrSB zIL+mJ91p-vq&l{H(ppHW>>PEJBDarTkZWgu45_kj8Xqad3Ko;p&>aP`9eui@fdgvs zEUwT9=wJ~2`oYFq7j%DUT_T)aJF`PZ%YVw4tlP>BQ_+qk) z#Tnh9I9tZR%HH2t#qkwQgSK}@)GwBdB5|(+kv~RTzM?JvJMCnjY5&Ci+wA82)0FZ< z)lhfr(*Gr)s50ZD#|JBrOV{DFa?4e|ET@m7Fb_IG%C{k9agvwC=@HOU*4V3#c0bys z?q}Sp$WLBSJugjyt&YRqzX^lZ4E?>d4bTiay)DV=%0Nf?me4ypO5dGIrr%IY0Rl4s o6aWAK2mmCU#ghXBGYp)?K$x7Bu#y1)0GE?O1T6*<1ONa40N+91ZU6uP delta 468 zcmV;_0W1EK3H1mKP)h>@6aWAK2mmB|!m$ll0)KnLKs4+f^>hIM04W0i00;m80BvD# zE_q>XY_(ELPQyS9UDv0`0kUWcRFD;+PzgZ+B?ZZ z2Y)D9Ub&Db3uIm?jAAJL`eGXjT^&u4q-If;#o1}q>s0DlYG;%ER5rkoYi$z+n5ME0 zx&?3@sfg8zv=)&(nWK)<u><_;Mxe}E;{LVrUJq#BCf6&9^#HQovgzPMfDr^${+$8?Vp ztQZ3;`*3X)$1gG^+Qu1iPb?Wl5}pMj|C?;~MK=3)*#Y0mzUTdIcH8>Hl+sPtP}J=D z_v?*uo){lJK3SohyBdctH`z%i+3;`_wu9~|+0T@0yqjj@={FKorfnXi5rDGQ{UKSA zd?vYKXWtTfXFKc0sUCU*P)h*Ap|oFd%{38>>c%V0RR9glVAib K2J`~}0001tq{lk| diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index fccac040a4..b5ab2127a7 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -126,7 +126,7 @@ World: Filename: d2k.pal PaletteFromFile@effect: Name: effect - Filename: d2k.pal + Filename: temperat.pal PaletteFromRGBA@shadow: Name: shadow R: 0 @@ -264,4 +264,23 @@ mpspawn: waypoint: Waypoint: - RenderEditorOnly: \ No newline at end of file + RenderEditorOnly: + +SPICEBLOOM: + RenderBuilding: + Palette: d2k + Building: + Footprint: x + Dimensions: 1,1 + AppearsOnRadar: + EditorAppearance: + RelativeToTopLeft: yes + ProximityCaptor: + Types:Tree + BelowUnits: + Tooltip: + Name: Spice Bloom + SeedsResource: + ResourceType: Spice + RadarColorFromTerrain: + Terrain: Spice \ No newline at end of file diff --git a/mods/d2k/sequences.yaml b/mods/d2k/sequences.yaml index cd53a93baa..3ef0bea688 100644 --- a/mods/d2k/sequences.yaml +++ b/mods/d2k/sequences.yaml @@ -872,4 +872,14 @@ allyrepair: repair: Start: 0 Length: * - Tick: 160 \ No newline at end of file + Tick: 160 + +spicebloom: + make: + Start: 0 + Length: 3 + active: + Start: 2 + Length: 1 + idle: + Start: 2 \ No newline at end of file diff --git a/ripD2kGameFiles.sh b/ripD2kGameFiles.sh index 29ab3bc0c1..265c94d9b1 100755 --- a/ripD2kGameFiles.sh +++ b/ripD2kGameFiles.sh @@ -9,7 +9,7 @@ mono OpenRA.Utility.exe --shp overlay.png 32 #mono OpenRA.Utility.exe --shp shadow.png 32 mono OpenRA.Utility.exe --r8 $R8 $PAL 102 105 "crates" mono OpenRA.Utility.exe --shp crates.png 32 -mono OpenRA.Utility.exe --r8 $R8 $PAL 106 109 "spicebloom" +mono OpenRA.Utility.exe --r8 $R8 $PAL 107 109 "spicebloom" mono OpenRA.Utility.exe --shp spicebloom.png 32 # stars, arrow-up mono OpenRA.Utility.exe --r8 $R8 $PAL 114 129 "rockcrater1" @@ -391,7 +391,7 @@ R8="$HOME/.openra/Content/d2k/BLOXBASE.R8" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 799 "BLOXBASE" mono OpenRA.Utility.exe --r8 $R8 $PAL 0 0 "sand0" -#mono OpenRA.Utility.exe --r8 $R8 $PAL 748 757 "spice0" -#mono OpenRA.Utility.exe --shp spice0.png 32 +mono OpenRA.Utility.exe --r8 $R8 $PAL 748 749 "spice0" +mono OpenRA.Utility.exe --shp spice0.png 32 mv *.shp mods/d2k/bits \ No newline at end of file From 8f1d06ff31487f92b43e1c06192885ef59a91ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 7 Jun 2012 19:22:45 +0200 Subject: [PATCH 28/36] added TilesetBuilder2 and fixed it for Dune 2000 does not support TerrainTypes other than "clear" yet --- Makefile | 14 +- OpenRA.TilesetBuilder/Form1.Designer.cs | 326 --- OpenRA.TilesetBuilder/Form1.cs | 278 -- OpenRA.TilesetBuilder/Form1.resx | 334 --- .../OpenRA.TilesetBuilder.csproj | 228 +- OpenRA.TilesetBuilder/Program.cs | 63 +- .../Properties/AssemblyInfo.cs | 82 +- .../Properties/Resources.Designer.cs | 142 +- .../Properties/Settings.Designer.cs | 60 +- OpenRA.TilesetBuilder/Surface.cs | 263 +- OpenRA.TilesetBuilder/Surface.resx | 123 + OpenRA.TilesetBuilder/Template.cs | 48 +- OpenRA.TilesetBuilder/frmBuilder.Designer.cs | 349 +++ OpenRA.TilesetBuilder/frmBuilder.cs | 447 ++++ OpenRA.TilesetBuilder/frmBuilder.resx | 509 ++++ OpenRA.TilesetBuilder/frmNew.Designer.cs | 228 ++ OpenRA.TilesetBuilder/frmNew.cs | 88 + OpenRA.TilesetBuilder/frmNew.resx | 120 + .../tilesetbuilder_icon copy.ico | Bin 0 -> 4286 bytes mods/d2k/TODO | 4 +- mods/d2k/bits/arrakis.pal | Bin 0 -> 768 bytes mods/d2k/maps/bloxbase-test.oramap | Bin 0 -> 592 bytes mods/d2k/maps/test.oramap | Bin 1171 -> 1190 bytes mods/d2k/mod.yaml | 3 +- .../raw/{d2k_BLOXBASE.bmp => BLOXBASE.bmp} | Bin .../raw/{d2k_BLOXBASE.tsx => BLOXBASE.tsx} | 0 mods/d2k/raw/BLOXBAT.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/BLOXBGBS.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/BLOXICE.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/BLOXTREE.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/BLOXWAST.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/BLOXXMAS.bmp | Bin 0 -> 820278 bytes mods/d2k/raw/output/bloxbase.yaml | 2369 +++++++++++++++++ mods/d2k/tilesets/bloxbase.yaml | 2369 +++++++++++++++++ mods/d2k/tilesets/bloxbase/bloxbase.pal | Bin 0 -> 768 bytes mods/d2k/tilesets/bloxbase/t00.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t01.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t02.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t03.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t04.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t05.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t06.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t07.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t08.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t09.blo | Bin 0 -> 15445 bytes mods/d2k/tilesets/bloxbase/t10.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t100.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t101.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t102.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t103.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t104.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t105.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t106.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t107.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t108.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t109.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t11.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t110.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t111.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t112.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t113.blo | Bin 0 -> 3121 bytes mods/d2k/tilesets/bloxbase/t114.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t115.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t116.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t117.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t118.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t119.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t12.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t120.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t121.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t122.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t123.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t124.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t125.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t126.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t127.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t128.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t129.blo | Bin 0 -> 9283 bytes mods/d2k/tilesets/bloxbase/t13.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t130.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t131.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t132.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t133.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t134.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t135.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t136.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t137.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t138.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t139.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t14.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t140.blo | Bin 0 -> 8256 bytes mods/d2k/tilesets/bloxbase/t141.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t142.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t143.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t144.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t145.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t146.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t147.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t148.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t149.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t15.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t150.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t151.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t152.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t153.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t154.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t155.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t156.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t157.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t158.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t159.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t16.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t160.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t161.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t162.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t163.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t164.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t165.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t166.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t167.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t168.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t169.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t17.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t170.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t171.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t172.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t173.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t174.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t175.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t176.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t177.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t178.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t179.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t18.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t180.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t181.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t182.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t183.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t184.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t185.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t186.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t187.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t188.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t189.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t19.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t190.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t191.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t192.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t193.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t194.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t195.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t196.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t197.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t198.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t199.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t20.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t200.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t201.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t202.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t203.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t204.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t205.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t206.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t207.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t208.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t209.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t21.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t210.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t211.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t212.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t213.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t214.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t215.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t216.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t217.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t218.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t219.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t22.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t220.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t221.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t222.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t223.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t224.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t225.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t226.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t227.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t228.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t229.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t23.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t230.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t231.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t232.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t233.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t234.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t235.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t236.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t237.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t238.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t239.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t24.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t240.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t241.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t242.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t243.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t244.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t245.blo | Bin 0 -> 10310 bytes mods/d2k/tilesets/bloxbase/t246.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t247.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t248.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t249.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t25.blo | Bin 0 -> 9283 bytes mods/d2k/tilesets/bloxbase/t250.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t251.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t252.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t253.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t254.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t255.blo | Bin 0 -> 9283 bytes mods/d2k/tilesets/bloxbase/t256.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t257.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t258.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t259.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t26.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t27.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t28.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t29.blo | Bin 0 -> 9283 bytes mods/d2k/tilesets/bloxbase/t30.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t31.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t32.blo | Bin 0 -> 8256 bytes mods/d2k/tilesets/bloxbase/t33.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t34.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t35.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t36.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t37.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t38.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t39.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t40.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t41.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t42.blo | Bin 0 -> 9283 bytes mods/d2k/tilesets/bloxbase/t43.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t44.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t45.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t46.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t47.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t48.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t49.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t50.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t51.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t52.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t53.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t54.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t55.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t56.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t57.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t58.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t59.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t60.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t61.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t62.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t63.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t64.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t65.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t66.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t67.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t68.blo | Bin 0 -> 6202 bytes mods/d2k/tilesets/bloxbase/t69.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t70.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t71.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t72.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t73.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t74.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t75.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t76.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t77.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t78.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t79.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t80.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t81.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t82.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t83.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t84.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t85.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t86.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t87.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t88.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t89.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t90.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t91.blo | Bin 0 -> 2094 bytes mods/d2k/tilesets/bloxbase/t92.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t93.blo | Bin 0 -> 1067 bytes mods/d2k/tilesets/bloxbase/t94.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t95.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t96.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t97.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t98.blo | Bin 0 -> 4148 bytes mods/d2k/tilesets/bloxbase/t99.blo | Bin 0 -> 4148 bytes tsbdefaults.yaml | 46 + 296 files changed, 7113 insertions(+), 1380 deletions(-) delete mode 100644 OpenRA.TilesetBuilder/Form1.Designer.cs delete mode 100644 OpenRA.TilesetBuilder/Form1.cs delete mode 100644 OpenRA.TilesetBuilder/Form1.resx create mode 100644 OpenRA.TilesetBuilder/Surface.resx create mode 100644 OpenRA.TilesetBuilder/frmBuilder.Designer.cs create mode 100644 OpenRA.TilesetBuilder/frmBuilder.cs create mode 100644 OpenRA.TilesetBuilder/frmBuilder.resx create mode 100644 OpenRA.TilesetBuilder/frmNew.Designer.cs create mode 100644 OpenRA.TilesetBuilder/frmNew.cs create mode 100644 OpenRA.TilesetBuilder/frmNew.resx create mode 100644 OpenRA.TilesetBuilder/tilesetbuilder_icon copy.ico create mode 100644 mods/d2k/bits/arrakis.pal create mode 100644 mods/d2k/maps/bloxbase-test.oramap rename mods/d2k/raw/{d2k_BLOXBASE.bmp => BLOXBASE.bmp} (100%) rename mods/d2k/raw/{d2k_BLOXBASE.tsx => BLOXBASE.tsx} (100%) create mode 100644 mods/d2k/raw/BLOXBAT.bmp create mode 100644 mods/d2k/raw/BLOXBGBS.bmp create mode 100644 mods/d2k/raw/BLOXICE.bmp create mode 100644 mods/d2k/raw/BLOXTREE.bmp create mode 100644 mods/d2k/raw/BLOXWAST.bmp create mode 100644 mods/d2k/raw/BLOXXMAS.bmp create mode 100644 mods/d2k/raw/output/bloxbase.yaml create mode 100644 mods/d2k/tilesets/bloxbase.yaml create mode 100644 mods/d2k/tilesets/bloxbase/bloxbase.pal create mode 100644 mods/d2k/tilesets/bloxbase/t00.blo create mode 100644 mods/d2k/tilesets/bloxbase/t01.blo create mode 100644 mods/d2k/tilesets/bloxbase/t02.blo create mode 100644 mods/d2k/tilesets/bloxbase/t03.blo create mode 100644 mods/d2k/tilesets/bloxbase/t04.blo create mode 100644 mods/d2k/tilesets/bloxbase/t05.blo create mode 100644 mods/d2k/tilesets/bloxbase/t06.blo create mode 100644 mods/d2k/tilesets/bloxbase/t07.blo create mode 100644 mods/d2k/tilesets/bloxbase/t08.blo create mode 100644 mods/d2k/tilesets/bloxbase/t09.blo create mode 100644 mods/d2k/tilesets/bloxbase/t10.blo create mode 100644 mods/d2k/tilesets/bloxbase/t100.blo create mode 100644 mods/d2k/tilesets/bloxbase/t101.blo create mode 100644 mods/d2k/tilesets/bloxbase/t102.blo create mode 100644 mods/d2k/tilesets/bloxbase/t103.blo create mode 100644 mods/d2k/tilesets/bloxbase/t104.blo create mode 100644 mods/d2k/tilesets/bloxbase/t105.blo create mode 100644 mods/d2k/tilesets/bloxbase/t106.blo create mode 100644 mods/d2k/tilesets/bloxbase/t107.blo create mode 100644 mods/d2k/tilesets/bloxbase/t108.blo create mode 100644 mods/d2k/tilesets/bloxbase/t109.blo create mode 100644 mods/d2k/tilesets/bloxbase/t11.blo create mode 100644 mods/d2k/tilesets/bloxbase/t110.blo create mode 100644 mods/d2k/tilesets/bloxbase/t111.blo create mode 100644 mods/d2k/tilesets/bloxbase/t112.blo create mode 100644 mods/d2k/tilesets/bloxbase/t113.blo create mode 100644 mods/d2k/tilesets/bloxbase/t114.blo create mode 100644 mods/d2k/tilesets/bloxbase/t115.blo create mode 100644 mods/d2k/tilesets/bloxbase/t116.blo create mode 100644 mods/d2k/tilesets/bloxbase/t117.blo create mode 100644 mods/d2k/tilesets/bloxbase/t118.blo create mode 100644 mods/d2k/tilesets/bloxbase/t119.blo create mode 100644 mods/d2k/tilesets/bloxbase/t12.blo create mode 100644 mods/d2k/tilesets/bloxbase/t120.blo create mode 100644 mods/d2k/tilesets/bloxbase/t121.blo create mode 100644 mods/d2k/tilesets/bloxbase/t122.blo create mode 100644 mods/d2k/tilesets/bloxbase/t123.blo create mode 100644 mods/d2k/tilesets/bloxbase/t124.blo create mode 100644 mods/d2k/tilesets/bloxbase/t125.blo create mode 100644 mods/d2k/tilesets/bloxbase/t126.blo create mode 100644 mods/d2k/tilesets/bloxbase/t127.blo create mode 100644 mods/d2k/tilesets/bloxbase/t128.blo create mode 100644 mods/d2k/tilesets/bloxbase/t129.blo create mode 100644 mods/d2k/tilesets/bloxbase/t13.blo create mode 100644 mods/d2k/tilesets/bloxbase/t130.blo create mode 100644 mods/d2k/tilesets/bloxbase/t131.blo create mode 100644 mods/d2k/tilesets/bloxbase/t132.blo create mode 100644 mods/d2k/tilesets/bloxbase/t133.blo create mode 100644 mods/d2k/tilesets/bloxbase/t134.blo create mode 100644 mods/d2k/tilesets/bloxbase/t135.blo create mode 100644 mods/d2k/tilesets/bloxbase/t136.blo create mode 100644 mods/d2k/tilesets/bloxbase/t137.blo create mode 100644 mods/d2k/tilesets/bloxbase/t138.blo create mode 100644 mods/d2k/tilesets/bloxbase/t139.blo create mode 100644 mods/d2k/tilesets/bloxbase/t14.blo create mode 100644 mods/d2k/tilesets/bloxbase/t140.blo create mode 100644 mods/d2k/tilesets/bloxbase/t141.blo create mode 100644 mods/d2k/tilesets/bloxbase/t142.blo create mode 100644 mods/d2k/tilesets/bloxbase/t143.blo create mode 100644 mods/d2k/tilesets/bloxbase/t144.blo create mode 100644 mods/d2k/tilesets/bloxbase/t145.blo create mode 100644 mods/d2k/tilesets/bloxbase/t146.blo create mode 100644 mods/d2k/tilesets/bloxbase/t147.blo create mode 100644 mods/d2k/tilesets/bloxbase/t148.blo create mode 100644 mods/d2k/tilesets/bloxbase/t149.blo create mode 100644 mods/d2k/tilesets/bloxbase/t15.blo create mode 100644 mods/d2k/tilesets/bloxbase/t150.blo create mode 100644 mods/d2k/tilesets/bloxbase/t151.blo create mode 100644 mods/d2k/tilesets/bloxbase/t152.blo create mode 100644 mods/d2k/tilesets/bloxbase/t153.blo create mode 100644 mods/d2k/tilesets/bloxbase/t154.blo create mode 100644 mods/d2k/tilesets/bloxbase/t155.blo create mode 100644 mods/d2k/tilesets/bloxbase/t156.blo create mode 100644 mods/d2k/tilesets/bloxbase/t157.blo create mode 100644 mods/d2k/tilesets/bloxbase/t158.blo create mode 100644 mods/d2k/tilesets/bloxbase/t159.blo create mode 100644 mods/d2k/tilesets/bloxbase/t16.blo create mode 100644 mods/d2k/tilesets/bloxbase/t160.blo create mode 100644 mods/d2k/tilesets/bloxbase/t161.blo create mode 100644 mods/d2k/tilesets/bloxbase/t162.blo create mode 100644 mods/d2k/tilesets/bloxbase/t163.blo create mode 100644 mods/d2k/tilesets/bloxbase/t164.blo create mode 100644 mods/d2k/tilesets/bloxbase/t165.blo create mode 100644 mods/d2k/tilesets/bloxbase/t166.blo create mode 100644 mods/d2k/tilesets/bloxbase/t167.blo create mode 100644 mods/d2k/tilesets/bloxbase/t168.blo create mode 100644 mods/d2k/tilesets/bloxbase/t169.blo create mode 100644 mods/d2k/tilesets/bloxbase/t17.blo create mode 100644 mods/d2k/tilesets/bloxbase/t170.blo create mode 100644 mods/d2k/tilesets/bloxbase/t171.blo create mode 100644 mods/d2k/tilesets/bloxbase/t172.blo create mode 100644 mods/d2k/tilesets/bloxbase/t173.blo create mode 100644 mods/d2k/tilesets/bloxbase/t174.blo create mode 100644 mods/d2k/tilesets/bloxbase/t175.blo create mode 100644 mods/d2k/tilesets/bloxbase/t176.blo create mode 100644 mods/d2k/tilesets/bloxbase/t177.blo create mode 100644 mods/d2k/tilesets/bloxbase/t178.blo create mode 100644 mods/d2k/tilesets/bloxbase/t179.blo create mode 100644 mods/d2k/tilesets/bloxbase/t18.blo create mode 100644 mods/d2k/tilesets/bloxbase/t180.blo create mode 100644 mods/d2k/tilesets/bloxbase/t181.blo create mode 100644 mods/d2k/tilesets/bloxbase/t182.blo create mode 100644 mods/d2k/tilesets/bloxbase/t183.blo create mode 100644 mods/d2k/tilesets/bloxbase/t184.blo create mode 100644 mods/d2k/tilesets/bloxbase/t185.blo create mode 100644 mods/d2k/tilesets/bloxbase/t186.blo create mode 100644 mods/d2k/tilesets/bloxbase/t187.blo create mode 100644 mods/d2k/tilesets/bloxbase/t188.blo create mode 100644 mods/d2k/tilesets/bloxbase/t189.blo create mode 100644 mods/d2k/tilesets/bloxbase/t19.blo create mode 100644 mods/d2k/tilesets/bloxbase/t190.blo create mode 100644 mods/d2k/tilesets/bloxbase/t191.blo create mode 100644 mods/d2k/tilesets/bloxbase/t192.blo create mode 100644 mods/d2k/tilesets/bloxbase/t193.blo create mode 100644 mods/d2k/tilesets/bloxbase/t194.blo create mode 100644 mods/d2k/tilesets/bloxbase/t195.blo create mode 100644 mods/d2k/tilesets/bloxbase/t196.blo create mode 100644 mods/d2k/tilesets/bloxbase/t197.blo create mode 100644 mods/d2k/tilesets/bloxbase/t198.blo create mode 100644 mods/d2k/tilesets/bloxbase/t199.blo create mode 100644 mods/d2k/tilesets/bloxbase/t20.blo create mode 100644 mods/d2k/tilesets/bloxbase/t200.blo create mode 100644 mods/d2k/tilesets/bloxbase/t201.blo create mode 100644 mods/d2k/tilesets/bloxbase/t202.blo create mode 100644 mods/d2k/tilesets/bloxbase/t203.blo create mode 100644 mods/d2k/tilesets/bloxbase/t204.blo create mode 100644 mods/d2k/tilesets/bloxbase/t205.blo create mode 100644 mods/d2k/tilesets/bloxbase/t206.blo create mode 100644 mods/d2k/tilesets/bloxbase/t207.blo create mode 100644 mods/d2k/tilesets/bloxbase/t208.blo create mode 100644 mods/d2k/tilesets/bloxbase/t209.blo create mode 100644 mods/d2k/tilesets/bloxbase/t21.blo create mode 100644 mods/d2k/tilesets/bloxbase/t210.blo create mode 100644 mods/d2k/tilesets/bloxbase/t211.blo create mode 100644 mods/d2k/tilesets/bloxbase/t212.blo create mode 100644 mods/d2k/tilesets/bloxbase/t213.blo create mode 100644 mods/d2k/tilesets/bloxbase/t214.blo create mode 100644 mods/d2k/tilesets/bloxbase/t215.blo create mode 100644 mods/d2k/tilesets/bloxbase/t216.blo create mode 100644 mods/d2k/tilesets/bloxbase/t217.blo create mode 100644 mods/d2k/tilesets/bloxbase/t218.blo create mode 100644 mods/d2k/tilesets/bloxbase/t219.blo create mode 100644 mods/d2k/tilesets/bloxbase/t22.blo create mode 100644 mods/d2k/tilesets/bloxbase/t220.blo create mode 100644 mods/d2k/tilesets/bloxbase/t221.blo create mode 100644 mods/d2k/tilesets/bloxbase/t222.blo create mode 100644 mods/d2k/tilesets/bloxbase/t223.blo create mode 100644 mods/d2k/tilesets/bloxbase/t224.blo create mode 100644 mods/d2k/tilesets/bloxbase/t225.blo create mode 100644 mods/d2k/tilesets/bloxbase/t226.blo create mode 100644 mods/d2k/tilesets/bloxbase/t227.blo create mode 100644 mods/d2k/tilesets/bloxbase/t228.blo create mode 100644 mods/d2k/tilesets/bloxbase/t229.blo create mode 100644 mods/d2k/tilesets/bloxbase/t23.blo create mode 100644 mods/d2k/tilesets/bloxbase/t230.blo create mode 100644 mods/d2k/tilesets/bloxbase/t231.blo create mode 100644 mods/d2k/tilesets/bloxbase/t232.blo create mode 100644 mods/d2k/tilesets/bloxbase/t233.blo create mode 100644 mods/d2k/tilesets/bloxbase/t234.blo create mode 100644 mods/d2k/tilesets/bloxbase/t235.blo create mode 100644 mods/d2k/tilesets/bloxbase/t236.blo create mode 100644 mods/d2k/tilesets/bloxbase/t237.blo create mode 100644 mods/d2k/tilesets/bloxbase/t238.blo create mode 100644 mods/d2k/tilesets/bloxbase/t239.blo create mode 100644 mods/d2k/tilesets/bloxbase/t24.blo create mode 100644 mods/d2k/tilesets/bloxbase/t240.blo create mode 100644 mods/d2k/tilesets/bloxbase/t241.blo create mode 100644 mods/d2k/tilesets/bloxbase/t242.blo create mode 100644 mods/d2k/tilesets/bloxbase/t243.blo create mode 100644 mods/d2k/tilesets/bloxbase/t244.blo create mode 100644 mods/d2k/tilesets/bloxbase/t245.blo create mode 100644 mods/d2k/tilesets/bloxbase/t246.blo create mode 100644 mods/d2k/tilesets/bloxbase/t247.blo create mode 100644 mods/d2k/tilesets/bloxbase/t248.blo create mode 100644 mods/d2k/tilesets/bloxbase/t249.blo create mode 100644 mods/d2k/tilesets/bloxbase/t25.blo create mode 100644 mods/d2k/tilesets/bloxbase/t250.blo create mode 100644 mods/d2k/tilesets/bloxbase/t251.blo create mode 100644 mods/d2k/tilesets/bloxbase/t252.blo create mode 100644 mods/d2k/tilesets/bloxbase/t253.blo create mode 100644 mods/d2k/tilesets/bloxbase/t254.blo create mode 100644 mods/d2k/tilesets/bloxbase/t255.blo create mode 100644 mods/d2k/tilesets/bloxbase/t256.blo create mode 100644 mods/d2k/tilesets/bloxbase/t257.blo create mode 100644 mods/d2k/tilesets/bloxbase/t258.blo create mode 100644 mods/d2k/tilesets/bloxbase/t259.blo create mode 100644 mods/d2k/tilesets/bloxbase/t26.blo create mode 100644 mods/d2k/tilesets/bloxbase/t27.blo create mode 100644 mods/d2k/tilesets/bloxbase/t28.blo create mode 100644 mods/d2k/tilesets/bloxbase/t29.blo create mode 100644 mods/d2k/tilesets/bloxbase/t30.blo create mode 100644 mods/d2k/tilesets/bloxbase/t31.blo create mode 100644 mods/d2k/tilesets/bloxbase/t32.blo create mode 100644 mods/d2k/tilesets/bloxbase/t33.blo create mode 100644 mods/d2k/tilesets/bloxbase/t34.blo create mode 100644 mods/d2k/tilesets/bloxbase/t35.blo create mode 100644 mods/d2k/tilesets/bloxbase/t36.blo create mode 100644 mods/d2k/tilesets/bloxbase/t37.blo create mode 100644 mods/d2k/tilesets/bloxbase/t38.blo create mode 100644 mods/d2k/tilesets/bloxbase/t39.blo create mode 100644 mods/d2k/tilesets/bloxbase/t40.blo create mode 100644 mods/d2k/tilesets/bloxbase/t41.blo create mode 100644 mods/d2k/tilesets/bloxbase/t42.blo create mode 100644 mods/d2k/tilesets/bloxbase/t43.blo create mode 100644 mods/d2k/tilesets/bloxbase/t44.blo create mode 100644 mods/d2k/tilesets/bloxbase/t45.blo create mode 100644 mods/d2k/tilesets/bloxbase/t46.blo create mode 100644 mods/d2k/tilesets/bloxbase/t47.blo create mode 100644 mods/d2k/tilesets/bloxbase/t48.blo create mode 100644 mods/d2k/tilesets/bloxbase/t49.blo create mode 100644 mods/d2k/tilesets/bloxbase/t50.blo create mode 100644 mods/d2k/tilesets/bloxbase/t51.blo create mode 100644 mods/d2k/tilesets/bloxbase/t52.blo create mode 100644 mods/d2k/tilesets/bloxbase/t53.blo create mode 100644 mods/d2k/tilesets/bloxbase/t54.blo create mode 100644 mods/d2k/tilesets/bloxbase/t55.blo create mode 100644 mods/d2k/tilesets/bloxbase/t56.blo create mode 100644 mods/d2k/tilesets/bloxbase/t57.blo create mode 100644 mods/d2k/tilesets/bloxbase/t58.blo create mode 100644 mods/d2k/tilesets/bloxbase/t59.blo create mode 100644 mods/d2k/tilesets/bloxbase/t60.blo create mode 100644 mods/d2k/tilesets/bloxbase/t61.blo create mode 100644 mods/d2k/tilesets/bloxbase/t62.blo create mode 100644 mods/d2k/tilesets/bloxbase/t63.blo create mode 100644 mods/d2k/tilesets/bloxbase/t64.blo create mode 100644 mods/d2k/tilesets/bloxbase/t65.blo create mode 100644 mods/d2k/tilesets/bloxbase/t66.blo create mode 100644 mods/d2k/tilesets/bloxbase/t67.blo create mode 100644 mods/d2k/tilesets/bloxbase/t68.blo create mode 100644 mods/d2k/tilesets/bloxbase/t69.blo create mode 100644 mods/d2k/tilesets/bloxbase/t70.blo create mode 100644 mods/d2k/tilesets/bloxbase/t71.blo create mode 100644 mods/d2k/tilesets/bloxbase/t72.blo create mode 100644 mods/d2k/tilesets/bloxbase/t73.blo create mode 100644 mods/d2k/tilesets/bloxbase/t74.blo create mode 100644 mods/d2k/tilesets/bloxbase/t75.blo create mode 100644 mods/d2k/tilesets/bloxbase/t76.blo create mode 100644 mods/d2k/tilesets/bloxbase/t77.blo create mode 100644 mods/d2k/tilesets/bloxbase/t78.blo create mode 100644 mods/d2k/tilesets/bloxbase/t79.blo create mode 100644 mods/d2k/tilesets/bloxbase/t80.blo create mode 100644 mods/d2k/tilesets/bloxbase/t81.blo create mode 100644 mods/d2k/tilesets/bloxbase/t82.blo create mode 100644 mods/d2k/tilesets/bloxbase/t83.blo create mode 100644 mods/d2k/tilesets/bloxbase/t84.blo create mode 100644 mods/d2k/tilesets/bloxbase/t85.blo create mode 100644 mods/d2k/tilesets/bloxbase/t86.blo create mode 100644 mods/d2k/tilesets/bloxbase/t87.blo create mode 100644 mods/d2k/tilesets/bloxbase/t88.blo create mode 100644 mods/d2k/tilesets/bloxbase/t89.blo create mode 100644 mods/d2k/tilesets/bloxbase/t90.blo create mode 100644 mods/d2k/tilesets/bloxbase/t91.blo create mode 100644 mods/d2k/tilesets/bloxbase/t92.blo create mode 100644 mods/d2k/tilesets/bloxbase/t93.blo create mode 100644 mods/d2k/tilesets/bloxbase/t94.blo create mode 100644 mods/d2k/tilesets/bloxbase/t95.blo create mode 100644 mods/d2k/tilesets/bloxbase/t96.blo create mode 100644 mods/d2k/tilesets/bloxbase/t97.blo create mode 100644 mods/d2k/tilesets/bloxbase/t98.blo create mode 100644 mods/d2k/tilesets/bloxbase/t99.blo create mode 100644 tsbdefaults.yaml diff --git a/Makefile b/Makefile index 6e44e59f3a..879cbb07ab 100644 --- a/Makefile +++ b/Makefile @@ -137,15 +137,19 @@ ralint: $(ralint_TARGET) # Builds and exports tilesets from a bitmap tsbuild_SRCS := $(shell find OpenRA.TilesetBuilder/ -iname '*.cs') -tsbuild_TARGET = TilesetBuilder.exe +tsbuild_TARGET = OpenRA.TilesetBuilder.exe tsbuild_KIND = winexe tsbuild_DEPS = $(fileformats_TARGET) $(game_TARGET) tsbuild_LIBS = $(COMMON_LIBS) $(tsbuild_DEPS) System.Windows.Forms.dll -tsbuild_EXTRA = -resource:OpenRA.TilesetBuilder.Form1.resources +tsbuild_EXTRA = -resource:OpenRA.TilesetBuilder.frmBuilder.resources -resource:OpenRA.TilesetBuilder.frmNew.resources -resource:OpenRA.TilesetBuilder.Surface.resources PROGRAMS += tsbuild -OpenRA.TilesetBuilder.Form1.resources: - resgen2 OpenRA.TilesetBuilder/Form1.resx OpenRA.TilesetBuilder.Form1.resources 1> /dev/null -tsbuild: OpenRA.TilesetBuilder.Form1.resources $(tsbuild_TARGET) +OpenRA.TilesetBuilder.frmBuilder.resources: + resgen2 OpenRA.TilesetBuilder/frmBuilder.resx OpenRA.TilesetBuilder.frmBuilder.resources 1> /dev/null +OpenRA.TilesetBuilder.frmNew.resources: + resgen2 OpenRA.TilesetBuilder/frmNew.resx OpenRA.TilesetBuilder.frmNew.resources 1> /dev/null +OpenRA.TilesetBuilder.Surface.resources: + resgen2 OpenRA.TilesetBuilder/Surface.resx OpenRA.TilesetBuilder.Surface.resources 1> /dev/null +tsbuild: OpenRA.TilesetBuilder.frmBuilder.resources OpenRA.TilesetBuilder.frmNew.resources OpenRA.TilesetBuilder.Surface.resources $(tsbuild_TARGET) # # Launchers / Utilities diff --git a/OpenRA.TilesetBuilder/Form1.Designer.cs b/OpenRA.TilesetBuilder/Form1.Designer.cs deleted file mode 100644 index 6c5336a3fc..0000000000 --- a/OpenRA.TilesetBuilder/Form1.Designer.cs +++ /dev/null @@ -1,326 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -namespace OpenRA.TilesetBuilder -{ - partial class Form1 - { - ///

- /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); - this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); - this.panel1 = new System.Windows.Forms.Panel(); - this.surface1 = new OpenRA.TilesetBuilder.Surface(); - this.toolStrip1 = new System.Windows.Forms.ToolStrip(); - this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton14 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton12 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton11 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton10 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton9 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton8 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton7 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton6 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton13 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); - this.toolStripContainer1.ContentPanel.SuspendLayout(); - this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); - this.toolStripContainer1.SuspendLayout(); - this.panel1.SuspendLayout(); - this.toolStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // toolStripContainer1 - // - // - // toolStripContainer1.ContentPanel - // - this.toolStripContainer1.ContentPanel.Controls.Add(this.panel1); - this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(745, 571); - this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); - this.toolStripContainer1.Name = "toolStripContainer1"; - this.toolStripContainer1.Size = new System.Drawing.Size(745, 596); - this.toolStripContainer1.TabIndex = 0; - this.toolStripContainer1.Text = "toolStripContainer1"; - // - // toolStripContainer1.TopToolStripPanel - // - this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1); - // - // panel1 - // - this.panel1.AutoScroll = true; - this.panel1.Controls.Add(this.surface1); - this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(0, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(745, 571); - this.panel1.TabIndex = 0; - // - // surface1 - // - this.surface1.BackColor = System.Drawing.Color.Black; - this.surface1.Location = new System.Drawing.Point(0, 0); - this.surface1.Name = "surface1"; - this.surface1.Size = new System.Drawing.Size(598, 372); - this.surface1.TabIndex = 2; - this.surface1.Text = "surface1"; - // - // toolStrip1 - // - this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None; - this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripButton2, - this.toolStripButton14, - this.toolStripButton3, - this.toolStripSeparator1, - this.toolStripButton4, - this.toolStripButton12, - this.toolStripButton11, - this.toolStripButton10, - this.toolStripButton9, - this.toolStripButton8, - this.toolStripButton7, - this.toolStripButton6, - this.toolStripButton5, - this.toolStripButton13, - this.toolStripButton1}); - this.toolStrip1.Location = new System.Drawing.Point(3, 0); - this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(602, 25); - this.toolStrip1.TabIndex = 0; - // - // toolStripButton2 - // - this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); - this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton2.Name = "toolStripButton2"; - this.toolStripButton2.Size = new System.Drawing.Size(51, 22); - this.toolStripButton2.Text = "Save"; - this.toolStripButton2.Click += new System.EventHandler(this.SaveClicked); - // - // toolStripButton14 - // - this.toolStripButton14.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton14.Image"))); - this.toolStripButton14.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton14.Name = "toolStripButton14"; - this.toolStripButton14.Size = new System.Drawing.Size(60, 22); - this.toolStripButton14.Text = "Export"; - this.toolStripButton14.Click += new System.EventHandler(this.ExportClicked); - // - // toolStripButton3 - // - this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); - this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton3.Name = "toolStripButton3"; - this.toolStripButton3.Size = new System.Drawing.Size(104, 22); - this.toolStripButton3.Text = "Show Overlays"; - this.toolStripButton3.Click += new System.EventHandler(this.ShowOverlaysClicked); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // toolStripButton4 - // - this.toolStripButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); - this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton4.Name = "toolStripButton4"; - this.toolStripButton4.Size = new System.Drawing.Size(25, 22); - this.toolStripButton4.Tag = "0"; - this.toolStripButton4.Text = "tt0"; - this.toolStripButton4.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton12 - // - this.toolStripButton12.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton12.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton12.Image"))); - this.toolStripButton12.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton12.Name = "toolStripButton12"; - this.toolStripButton12.Size = new System.Drawing.Size(25, 22); - this.toolStripButton12.Tag = "1"; - this.toolStripButton12.Text = "tt1"; - this.toolStripButton12.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton11 - // - this.toolStripButton11.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton11.Image"))); - this.toolStripButton11.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton11.Name = "toolStripButton11"; - this.toolStripButton11.Size = new System.Drawing.Size(25, 22); - this.toolStripButton11.Tag = "2"; - this.toolStripButton11.Text = "tt2"; - this.toolStripButton11.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton10 - // - this.toolStripButton10.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton10.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton10.Image"))); - this.toolStripButton10.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton10.Name = "toolStripButton10"; - this.toolStripButton10.Size = new System.Drawing.Size(25, 22); - this.toolStripButton10.Tag = "3"; - this.toolStripButton10.Text = "tt3"; - this.toolStripButton10.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton9 - // - this.toolStripButton9.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton9.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton9.Image"))); - this.toolStripButton9.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton9.Name = "toolStripButton9"; - this.toolStripButton9.Size = new System.Drawing.Size(25, 22); - this.toolStripButton9.Tag = "4"; - this.toolStripButton9.Text = "tt4"; - this.toolStripButton9.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton8 - // - this.toolStripButton8.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton8.Image"))); - this.toolStripButton8.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton8.Name = "toolStripButton8"; - this.toolStripButton8.Size = new System.Drawing.Size(25, 22); - this.toolStripButton8.Tag = "5"; - this.toolStripButton8.Text = "tt5"; - this.toolStripButton8.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton7 - // - this.toolStripButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton7.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton7.Image"))); - this.toolStripButton7.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton7.Name = "toolStripButton7"; - this.toolStripButton7.Size = new System.Drawing.Size(25, 22); - this.toolStripButton7.Tag = "6"; - this.toolStripButton7.Text = "tt6"; - this.toolStripButton7.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton6 - // - this.toolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton6.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton6.Image"))); - this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton6.Name = "toolStripButton6"; - this.toolStripButton6.Size = new System.Drawing.Size(25, 22); - this.toolStripButton6.Tag = "7"; - this.toolStripButton6.Text = "tt7"; - this.toolStripButton6.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton5 - // - this.toolStripButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); - this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton5.Name = "toolStripButton5"; - this.toolStripButton5.Size = new System.Drawing.Size(25, 22); - this.toolStripButton5.Tag = "8"; - this.toolStripButton5.Text = "tt8"; - this.toolStripButton5.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // toolStripButton13 - // - this.toolStripButton13.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton13.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton13.Image"))); - this.toolStripButton13.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton13.Name = "toolStripButton13"; - this.toolStripButton13.Size = new System.Drawing.Size(25, 22); - this.toolStripButton13.Tag = "9"; - this.toolStripButton13.Text = "tt9"; - // - // toolStripButton1 - // - this.toolStripButton1.Checked = true; - this.toolStripButton1.CheckState = System.Windows.Forms.CheckState.Checked; - this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); - this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton1.Name = "toolStripButton1"; - this.toolStripButton1.Size = new System.Drawing.Size(88, 22); - this.toolStripButton1.Text = "Template Tool"; - this.toolStripButton1.Click += new System.EventHandler(this.TerrainTypeSelectorClicked); - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(745, 596); - this.Controls.Add(this.toolStripContainer1); - this.Name = "Form1"; - this.Text = "Tileset Builder"; - this.toolStripContainer1.ContentPanel.ResumeLayout(false); - this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false); - this.toolStripContainer1.TopToolStripPanel.PerformLayout(); - this.toolStripContainer1.ResumeLayout(false); - this.toolStripContainer1.PerformLayout(); - this.panel1.ResumeLayout(false); - this.toolStrip1.ResumeLayout(false); - this.toolStrip1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ToolStripContainer toolStripContainer1; - private System.Windows.Forms.Panel panel1; - private Surface surface1; - private System.Windows.Forms.ToolStrip toolStrip1; - private System.Windows.Forms.ToolStripButton toolStripButton1; - private System.Windows.Forms.ToolStripButton toolStripButton2; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripButton toolStripButton3; - private System.Windows.Forms.ToolStripButton toolStripButton4; - private System.Windows.Forms.ToolStripButton toolStripButton12; - private System.Windows.Forms.ToolStripButton toolStripButton11; - private System.Windows.Forms.ToolStripButton toolStripButton10; - private System.Windows.Forms.ToolStripButton toolStripButton9; - private System.Windows.Forms.ToolStripButton toolStripButton8; - private System.Windows.Forms.ToolStripButton toolStripButton7; - private System.Windows.Forms.ToolStripButton toolStripButton6; - private System.Windows.Forms.ToolStripButton toolStripButton5; - private System.Windows.Forms.ToolStripButton toolStripButton13; - private System.Windows.Forms.ToolStripButton toolStripButton14; - - } -} - diff --git a/OpenRA.TilesetBuilder/Form1.cs b/OpenRA.TilesetBuilder/Form1.cs deleted file mode 100644 index 1c1c084360..0000000000 --- a/OpenRA.TilesetBuilder/Form1.cs +++ /dev/null @@ -1,278 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using System.Xml; -using OpenRA.FileFormats; - -namespace OpenRA.TilesetBuilder -{ - public partial class Form1 : Form - { - string srcfile; - int size; - - public Form1( string src, int size ) - { - srcfile = src; - this.size = size; - InitializeComponent(); - surface1.TileSize = size; - surface1.Image = (Bitmap)Image.FromFile(src); - surface1.Image.SetResolution(96, 96); // people keep being noobs about DPI, and GDI+ cares. - surface1.TerrainTypes = new int[surface1.Image.Width / size, surface1.Image.Height / size]; /* all passable by default */ - surface1.Templates = new List