From 643154de15703184c9e78e957da077067ccc7679 Mon Sep 17 00:00:00 2001 From: James Dunne Date: Fri, 29 Jun 2012 22:38:24 -0500 Subject: [PATCH 01/36] Harvesters obey player when told to stop or move somewhere else. --- OpenRA.Mods.RA/Harvester.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index 20ff2da840..4514a1c9c8 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -51,6 +51,7 @@ namespace OpenRA.Mods.RA public CPos? LastOrderLocation = null; [Sync] public int ContentValue { get { return contents.Sum(c => c.Key.ValuePerUnit * c.Value); } } readonly HarvesterInfo Info; + bool idleSmart = true; public Harvester(Actor self, HarvesterInfo info) { @@ -191,6 +192,9 @@ namespace OpenRA.Mods.RA public void TickIdle(Actor self) { + // Should we be intelligent while idle? + if (!idleSmart) return; + // Are we not empty? Deliver resources: if (!IsEmpty) { @@ -262,6 +266,7 @@ namespace OpenRA.Mods.RA { // NOTE: An explicit harvest order allows the harvester to decide which refinery to deliver to. LinkProc(self, OwnerLinkedProc = null); + idleSmart = true; var mobile = self.Trait(); self.CancelActivity(); @@ -316,11 +321,18 @@ namespace OpenRA.Mods.RA if (IsEmpty) return; + idleSmart = true; + self.SetTargetLine(Target.FromOrder(order), Color.Green); self.CancelActivity(); self.QueueActivity(new DeliverResources()); } + else if (order.OrderString == "Stop" || order.OrderString == "Move") + { + // Turn off idle smarts to obey the stop/move: + idleSmart = false; + } } CPos? FindNextResourceForBot(Actor self) From 3754e791e5574ebadb04b5ccf24f545a0bec1c1a Mon Sep 17 00:00:00 2001 From: James Dunne Date: Fri, 29 Jun 2012 22:55:45 -0500 Subject: [PATCH 02/36] Fix for null ref exception after refinery is sold. --- OpenRA.Mods.RA/Harvester.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index 4514a1c9c8..f646fd7867 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -148,7 +148,7 @@ namespace OpenRA.Mods.RA { // Check that we're not in a critical location and being useless (refinery drop-off): var lastproc = LastLinkedProc ?? LinkedProc; - if (lastproc != null) + if (lastproc != null && !lastproc.Destroyed) { var deliveryLoc = lastproc.Location + lastproc.Trait().DeliverOffset; if (self.Location == deliveryLoc) From 9845d0e035721f7da472f1e0598e6f27d7c99122 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 30 Jun 2012 16:05:33 +1200 Subject: [PATCH 03/36] fixed #2260 - spec chat should use contrast --- mods/ra/chrome/ingame.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ra/chrome/ingame.yaml b/mods/ra/chrome/ingame.yaml index 022239407c..2931692d18 100644 --- a/mods/ra/chrome/ingame.yaml +++ b/mods/ra/chrome/ingame.yaml @@ -333,11 +333,13 @@ Container@OBSERVER_ROOT: Height: 200 DrawBackground: False RemoveTime:250 + UseContrast: yes ChatEntry@CHAT_ENTRY: X:250 Y:WINDOW_BOTTOM - HEIGHT Width: 760 Height: 30 + UseContrast: yes Background@PERF_BG: ClickThrough:true Background:dialog4 From 3a87b934a6adfe6fd1887ebf7c78906f3dd62684 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 30 Jun 2012 16:10:13 +1200 Subject: [PATCH 04/36] fixed #2257 - reenable PrimaryBuilding support for afld/hpad --- mods/ra/rules/structures.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 795943cd18..7c683deb15 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -948,6 +948,7 @@ HPAD: Reservable: IronCurtainable: ProductionBar: + PrimaryBuilding: AFLD: Inherits: ^Building @@ -998,6 +999,7 @@ AFLD: SelectTargetSound: slcttgt1.aud ProductionBar: SupportPowerChargeBar: + PrimaryBuilding: POWR: Inherits: ^Building From 9a66d7b5305c8e26d06e9f43ad568307f4268edf Mon Sep 17 00:00:00 2001 From: James Dunne Date: Fri, 29 Jun 2012 23:16:07 -0500 Subject: [PATCH 05/36] Harvesters will return to ordered-to location if told to harvest a specific cell while full after delivery instead of the last successfully harvested cell which may be far away. --- OpenRA.Mods.RA/Harvester.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index f646fd7867..a0633791a1 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -268,8 +268,9 @@ namespace OpenRA.Mods.RA LinkProc(self, OwnerLinkedProc = null); idleSmart = true; - var mobile = self.Trait(); self.CancelActivity(); + + var mobile = self.Trait(); if (order.TargetLocation != CPos.Zero) { var loc = order.TargetLocation; @@ -295,7 +296,7 @@ namespace OpenRA.Mods.RA else { // A bot order gives us a CPos.Zero TargetLocation, so find some good resources for him: - CPos? loc = FindNextResourceForBot(self); + var loc = FindNextResourceForBot(self); // No more resources? Oh well. if (!loc.HasValue) return; @@ -306,6 +307,8 @@ namespace OpenRA.Mods.RA LastOrderLocation = loc; } + // This prevents harvesters returning to an empty patch when the player orders them to a new patch: + LastHarvestedCell = LastOrderLocation; self.QueueActivity(new FindResources()); } else if (order.OrderString == "Deliver") From 1d4f1c657f618de915f4db21247a0d394bdb24fd Mon Sep 17 00:00:00 2001 From: James Dunne Date: Fri, 29 Jun 2012 23:25:02 -0500 Subject: [PATCH 06/36] Fix for crash after selling all refineries. --- OpenRA.Mods.RA/Harvester.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index a0633791a1..4199aa7a66 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -62,6 +62,7 @@ namespace OpenRA.Mods.RA public void SetProcLines(Actor proc) { if (proc == null) return; + if (proc.Destroyed) return; var linkedHarvs = proc.World.ActorsWithTrait() .Where(a => a.Trait.LinkedProc == proc) From b9365a149f2e7abc7af26c2180cc1cd07673ee64 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 30 Jun 2012 17:06:15 +1200 Subject: [PATCH 07/36] remove old crates list --- OpenRA.Mods.RA/Crate.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index 5e622c6e0f..ab70385f22 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -14,17 +14,6 @@ using OpenRA.FileFormats; using OpenRA.Traits; using OpenRA.Mods.RA.Buildings; -/* - * Crates left to implement: -HealBase=1,INVUN ; all buildings to full strength -ICBM=1,MISSILE2 ; nuke missile one time shot -Sonar=3,SONARBOX ; one time sonar pulse -Squad=20,NONE ; squad of random infantry -Unit=20,NONE ; vehicle -Invulnerability=3,INVULBOX,1.0 ; invulnerability (duration in minutes) -TimeQuake=3,TQUAKE ; time quake -*/ - namespace OpenRA.Mods.RA { class CrateInfo : ITraitInfo, Requires From 9201b1cced627df2667ec97af4a5cebfa6abcb29 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 09:04:49 +1200 Subject: [PATCH 08/36] fixed #2198 - crates are collected when landing on top of a unit --- OpenRA.Mods.RA/Crate.cs | 11 ++++++++++- OpenRA.Mods.RA/Effects/Parachute.cs | 3 +++ OpenRA.Mods.RA/TraitsInterfaces.cs | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index ab70385f22..6ccbc9f274 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA } // ITeleportable is required for paradrop - class Crate : ITick, IOccupySpace, ITeleportable, ICrushable, ISync + class Crate : ITick, IOccupySpace, ITeleportable, ICrushable, ISync, INotifyParachuteLanded { readonly Actor self; [Sync] int ticks; @@ -62,6 +62,15 @@ namespace OpenRA.Mods.RA n -= s.Second; } + public void OnLanded() + { + var landedOn = self.World.ActorMap.GetUnitsAt(self.Location) + .FirstOrDefault(a => a != self); + + if (landedOn != null) + OnCrush(landedOn); + } + public void Tick(Actor self) { if( ++ticks >= Info.Lifetime * 25 ) diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index 318bce35ee..eede52a569 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -67,6 +67,9 @@ namespace OpenRA.Mods.RA.Effects cargo.CancelActivity(); cargo.Trait().SetPosition(cargo, loc); w.Add(cargo); + + foreach( var npl in cargo.TraitsImplementing() ) + npl.OnLanded(); }); } diff --git a/OpenRA.Mods.RA/TraitsInterfaces.cs b/OpenRA.Mods.RA/TraitsInterfaces.cs index e4f4f2d32d..18b2619777 100755 --- a/OpenRA.Mods.RA/TraitsInterfaces.cs +++ b/OpenRA.Mods.RA/TraitsInterfaces.cs @@ -42,4 +42,6 @@ namespace OpenRA.Mods.RA { void OnNotifyResourceClaimLost(Actor self, ResourceClaim claim, Actor claimer); } + + public interface INotifyParachuteLanded { void OnLanded(); } } From 11da96fe22121227fd9b77c8b1471d42d5f5a3d0 Mon Sep 17 00:00:00 2001 From: James Dunne Date: Sat, 30 Jun 2012 01:07:55 -0500 Subject: [PATCH 09/36] Fix for #2277: Failing to load sounds/music should never crash. --- OpenRA.Game/Sound.cs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index a557a7fde3..7adcd5aed0 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -29,6 +29,12 @@ namespace OpenRA static ISoundSource LoadSound(string filename) { + if (!FileSystem.Exists(filename)) + { + Log.Write("debug", "LoadSound, file does not exist: {0}", filename); + return null; + } + return LoadSoundRaw(AudLoader.LoadSound(FileSystem.Open(filename))); } @@ -140,10 +146,12 @@ namespace OpenRA } StopMusic(); + var sound = sounds[m.Filename]; + if (sound == null) return; + + music = soundEngine.Play2D(sound, false, true, float2.Zero, MusicVolume); currentMusic = m; MusicPlaying = true; - var sound = sounds[m.Filename]; - music = soundEngine.Play2D(sound, false, true, float2.Zero, MusicVolume); } public static void PlayMusic() @@ -357,6 +365,11 @@ namespace OpenRA public ISound Play2D(ISoundSource sound, bool loop, bool relative, float2 pos, float volume) { + if (sound == null) + { + Log.Write("debug", "Attempt to Play2D a null `ISoundSource`"); + return null; + } int source = GetSourceFromPool(); return new OpenAlSound(source, (sound as OpenAlSoundSource).buffer, loop, relative, pos, volume); } @@ -369,6 +382,8 @@ namespace OpenRA public void PauseSound(ISound sound, bool paused) { + if (sound == null) return; + int key = ((OpenAlSound)sound).source; int state; Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); @@ -410,6 +425,8 @@ namespace OpenRA public void StopSound(ISound sound) { + if (sound == null) return; + int key = ((OpenAlSound)sound).source; int state; Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); From 579ff04f68145f51acc6e71d0171ce4d824abf2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 11:48:14 +0200 Subject: [PATCH 10/36] fixes #2253 rough mouse-cursor for infantry-only areas blue move cursor for d2k rally points --- OpenRA.Mods.RA/Move/Mobile.cs | 2 ++ mods/cnc/cursors.yaml | 5 +++++ mods/d2k/cursors.yaml | 9 +++++++-- mods/ra/cursors.yaml | 5 +++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.RA/Move/Mobile.cs b/OpenRA.Mods.RA/Move/Mobile.cs index 6b68c8d1f4..a9dd43d6b7 100755 --- a/OpenRA.Mods.RA/Move/Mobile.cs +++ b/OpenRA.Mods.RA/Move/Mobile.cs @@ -456,6 +456,8 @@ namespace OpenRA.Mods.RA.Move { IsQueued = forceQueued; cursor = "move"; + if (self.World.LocalPlayer.Shroud.IsExplored(location) && self.World.GetTerrainType(location) == "Rough") + cursor = "move-rough"; if (!self.World.Map.IsInMap(location) || (self.World.LocalPlayer.Shroud.IsExplored(location) && unitType.MovementCostForCell(self.World, location) == int.MaxValue)) cursor = "move-blocked"; diff --git a/mods/cnc/cursors.yaml b/mods/cnc/cursors.yaml index a566ef647b..854dd17291 100644 --- a/mods/cnc/cursors.yaml +++ b/mods/cnc/cursors.yaml @@ -197,6 +197,11 @@ Cursors: length:4 x:12 y:12 + move-rough: + start:0 + length: 8 + x: 12 + y: 12 attackmove:cursor attackmove: diff --git a/mods/d2k/cursors.yaml b/mods/d2k/cursors.yaml index e001140b8b..eda2e1e1dc 100644 --- a/mods/d2k/cursors.yaml +++ b/mods/d2k/cursors.yaml @@ -180,12 +180,12 @@ Cursors: x: 12 y: 12 ability: - start:96 + start:72 length: 8 x: 12 y: 12 ability-minimap: - start:96 + start:72 length: 8 x: 12 y: 12 @@ -237,6 +237,11 @@ Cursors: length: 1 x: 12 y: 12 + move-rough: + start:256 + length: 8 + x: 12 + y: 12 nopower: cursor powerdown-blocked: diff --git a/mods/ra/cursors.yaml b/mods/ra/cursors.yaml index 24842a8825..beef006a23 100644 --- a/mods/ra/cursors.yaml +++ b/mods/ra/cursors.yaml @@ -91,6 +91,11 @@ Cursors: length: 4 x: 12 y: 12 + move-rough: + start:10 + length: 4 + x: 12 + y: 12 move-blocked: start:14 x: 12 From 63d21eac8c90d2c276a84a32261b23a8f4f7c811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 14:22:57 +0200 Subject: [PATCH 11/36] arrakis tileset categorized for editor thanks to CombineCnR --- mods/d2k/tilesets/arrakis.yaml | 427 ++++++++++++++++++++++++++++++++- 1 file changed, 422 insertions(+), 5 deletions(-) diff --git a/mods/d2k/tilesets/arrakis.yaml b/mods/d2k/tilesets/arrakis.yaml index 355f682020..49ae901df3 100644 --- a/mods/d2k/tilesets/arrakis.yaml +++ b/mods/d2k/tilesets/arrakis.yaml @@ -69,6 +69,7 @@ Templates: Id: 1 Image: BASE01 Size: 2,2 + Category: Dune PickAny: False Tiles: 0: Sand @@ -79,6 +80,7 @@ Templates: Id: 2 Image: BASE02 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Rough @@ -89,6 +91,7 @@ Templates: Id: 3 Image: BASE03 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Rough @@ -99,6 +102,7 @@ Templates: Id: 4 Image: BASE04 Size: 2,2 + Category: Dune PickAny: False Tiles: 0: Sand @@ -109,6 +113,7 @@ Templates: Id: 5 Image: BASE05 Size: 2,2 + Category: Dune PickAny: False Tiles: 0: Dune @@ -119,6 +124,7 @@ Templates: Id: 6 Image: BASE06 Size: 2,2 + Category: Dune PickAny: False Tiles: 1: Dune @@ -129,6 +135,7 @@ Templates: Id: 7 Image: BASE07 Size: 2,2 + Category: Dune PickAny: False Tiles: 1: Dune @@ -139,6 +146,7 @@ Templates: Id: 8 Image: BASE08 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 1: Cliff @@ -149,6 +157,7 @@ Templates: Id: 9 Image: BASE09 Size: 1,2 + Category: SandyCliff PickAny: False Tiles: 0: Transition @@ -157,6 +166,7 @@ Templates: Id: 10 Image: BASE10 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -167,6 +177,7 @@ Templates: Id: 11 Image: BASE11 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -177,6 +188,7 @@ Templates: Id: 12 Image: BASE12 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 3: Cliff @@ -187,6 +199,7 @@ Templates: Id: 13 Image: BASE13 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -197,6 +210,7 @@ Templates: Id: 14 Image: BASE14 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 3: Cliff @@ -207,6 +221,7 @@ Templates: Id: 15 Image: BASE15 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -217,6 +232,7 @@ Templates: Id: 16 Image: BASE16 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 3: Cliff @@ -227,6 +243,7 @@ Templates: Id: 17 Image: BASE17 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -237,6 +254,7 @@ Templates: Id: 18 Image: BASE18 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -247,6 +265,7 @@ Templates: Id: 19 Image: BASE19 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -257,6 +276,7 @@ Templates: Id: 20 Image: BASE20 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -267,6 +287,7 @@ Templates: Id: 21 Image: BASE21 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -277,6 +298,7 @@ Templates: Id: 22 Image: BASE22 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Rough @@ -287,6 +309,7 @@ Templates: Id: 23 Image: BASE23 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Rough @@ -297,6 +320,7 @@ Templates: Id: 24 Image: BASE24 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -307,6 +331,7 @@ Templates: Id: 25 Image: BASE25 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -317,6 +342,7 @@ Templates: Id: 26 Image: BASE26 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -327,6 +353,7 @@ Templates: Id: 27 Image: BASE27 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Rough @@ -337,6 +364,7 @@ Templates: Id: 28 Image: BASE28 Size: 2,2 + Category: Rock PickAny: False Tiles: 1: Rough @@ -347,6 +375,7 @@ Templates: Id: 29 Image: BASE29 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -357,6 +386,7 @@ Templates: Id: 30 Image: BASE30 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -367,6 +397,7 @@ Templates: Id: 31 Image: BASE31 Size: 2,3 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -379,6 +410,7 @@ Templates: Id: 32 Image: BASE32 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 1: Transition @@ -389,6 +421,7 @@ Templates: Id: 33 Image: BASE33 Size: 2,3 + Category: SandyCliff PickAny: False Tiles: 1: Sand @@ -401,6 +434,7 @@ Templates: Id: 34 Image: BASE34 Size: 2,3 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -413,6 +447,7 @@ Templates: Id: 35 Image: BASE35 Size: 2,3 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -425,6 +460,7 @@ Templates: Id: 36 Image: BASE36 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -435,6 +471,7 @@ Templates: Id: 37 Image: BASE37 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -445,6 +482,7 @@ Templates: Id: 38 Image: BASE38 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -455,6 +493,7 @@ Templates: Id: 39 Image: BASE39 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -465,6 +504,7 @@ Templates: Id: 40 Image: BASE40 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -475,6 +515,7 @@ Templates: Id: 41 Image: BASE41 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -485,6 +526,7 @@ Templates: Id: 42 Image: BASE42 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -495,6 +537,7 @@ Templates: Id: 43 Image: BASE43 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 0: Cliff @@ -505,6 +548,7 @@ Templates: Id: 44 Image: BASE44 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -515,6 +559,7 @@ Templates: Id: 45 Image: BASE45 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 1: Transition @@ -525,6 +570,7 @@ Templates: Id: 46 Image: BASE46 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 3: Transition @@ -535,6 +581,7 @@ Templates: Id: 47 Image: BASE47 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 2: Cliff @@ -545,6 +592,7 @@ Templates: Id: 48 Image: BASE48 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 3: Cliff @@ -555,6 +603,7 @@ Templates: Id: 49 Image: BASE49 Size: 3,2 + Category: SandyCliff PickAny: False Tiles: 2: Cliff @@ -567,6 +616,7 @@ Templates: Id: 50 Image: BASE50 Size: 3,2 + Category: SandyCliff PickAny: False Tiles: 2: Cliff @@ -579,6 +629,7 @@ Templates: Id: 51 Image: BASE51 Size: 3,2 + Category: SandyCliff PickAny: False Tiles: 5: Sand @@ -591,6 +642,7 @@ Templates: Id: 52 Image: BASE52 Size: 3,2 + Category: SandyCliff PickAny: False Tiles: 5: Cliff @@ -603,6 +655,7 @@ Templates: Id: 53 Image: BASE53 Size: 2,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Sand @@ -641,6 +694,7 @@ Templates: Id: 58 Image: BASE58 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -648,6 +702,7 @@ Templates: Id: 59 Image: BASE59 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -655,6 +710,7 @@ Templates: Id: 60 Image: BASE60 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Sand @@ -662,6 +718,7 @@ Templates: Id: 61 Image: BASE61 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -669,6 +726,7 @@ Templates: Id: 62 Image: BASE62 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -676,6 +734,7 @@ Templates: Id: 63 Image: BASE63 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -683,6 +742,7 @@ Templates: Id: 64 Image: BASE64 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -690,6 +750,7 @@ Templates: Id: 65 Image: BASE65 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 3: Transition @@ -700,6 +761,7 @@ Templates: Id: 66 Image: BASE66 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -707,6 +769,7 @@ Templates: Id: 67 Image: BASE67 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -714,6 +777,7 @@ Templates: Id: 68 Image: BASE68 Size: 2,1 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -722,6 +786,7 @@ Templates: Id: 69 Image: BASE69 Size: 2,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -730,6 +795,7 @@ Templates: Id: 70 Image: BASE70 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -740,6 +806,7 @@ Templates: Id: 71 Image: BASE71 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -747,6 +814,7 @@ Templates: Id: 72 Image: BASE72 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -754,6 +822,7 @@ Templates: Id: 73 Image: BASE73 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -761,6 +830,7 @@ Templates: Id: 74 Image: BASE74 Size: 1,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -769,6 +839,7 @@ Templates: Id: 75 Image: BASE75 Size: 1,2 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -777,6 +848,7 @@ Templates: Id: 76 Image: BASE76 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -784,6 +856,7 @@ Templates: Id: 77 Image: BASE77 Size: 2,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -792,6 +865,7 @@ Templates: Id: 78 Image: BASE78 Size: 2,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -800,6 +874,7 @@ Templates: Id: 79 Image: BASE79 Size: 2,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -808,6 +883,7 @@ Templates: Id: 80 Image: BASE80 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -815,6 +891,7 @@ Templates: Id: 81 Image: BASE81 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -822,6 +899,7 @@ Templates: Id: 82 Image: BASE82 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -829,6 +907,7 @@ Templates: Id: 83 Image: BASE83 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -836,6 +915,7 @@ Templates: Id: 84 Image: BASE84 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -843,6 +923,7 @@ Templates: Id: 85 Image: BASE85 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -850,6 +931,7 @@ Templates: Id: 86 Image: BASE86 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -857,6 +939,7 @@ Templates: Id: 87 Image: BASE87 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -864,6 +947,7 @@ Templates: Id: 88 Image: BASE88 Size: 3,1 + Category: Brick PickAny: False Tiles: 0: Concrete @@ -873,6 +957,7 @@ Templates: Id: 89 Image: BASE89 Size: 1,1 + Category: Brick PickAny: False Tiles: 0: Concrete @@ -880,6 +965,7 @@ Templates: Id: 90 Image: BASE90 Size: 3,2 + Category: Brick PickAny: False Tiles: 0: Concrete @@ -892,6 +978,7 @@ Templates: Id: 91 Image: BASE91 Size: 3,3 + Category: Brick PickAny: False Tiles: 2: Concrete @@ -907,6 +994,7 @@ Templates: Id: 92 Image: BASE92 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -914,6 +1002,7 @@ Templates: Id: 93 Image: BASE93 Size: 3,2 + Category: Brick PickAny: False Tiles: 5: Concrete @@ -926,6 +1015,7 @@ Templates: Id: 94 Image: BASE94 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 1: Rock @@ -936,6 +1026,7 @@ Templates: Id: 95 Image: BASE95 Size: 1,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -944,6 +1035,7 @@ Templates: Id: 96 Image: BASE96 Size: 3,3 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -959,6 +1051,7 @@ Templates: Id: 97 Image: BASE97 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -969,6 +1062,7 @@ Templates: Id: 98 Image: BASE98 Size: 1,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -977,6 +1071,7 @@ Templates: Id: 99 Image: BASE99 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -984,6 +1079,7 @@ Templates: Id: 100 Image: BASE100 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -991,6 +1087,7 @@ Templates: Id: 101 Image: BASE101 Size: 3,3 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -1006,6 +1103,7 @@ Templates: Id: 102 Image: BASE102 Size: 3,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -1018,6 +1116,7 @@ Templates: Id: 103 Image: BASE103 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -1028,6 +1127,7 @@ Templates: Id: 104 Image: BASE104 Size: 2,1 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1036,6 +1136,7 @@ Templates: Id: 105 Image: BASE105 Size: 2,1 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1044,6 +1145,7 @@ Templates: Id: 106 Image: BASE106 Size: 1,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1052,6 +1154,7 @@ Templates: Id: 107 Image: BASE107 Size: 1,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1060,6 +1163,7 @@ Templates: Id: 108 Image: BASE108 Size: 1,1 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Cliff @@ -1067,6 +1171,7 @@ Templates: Id: 109 Image: BASE109 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -1074,14 +1179,16 @@ Templates: Id: 110 Image: BASE110 Size: 2,1 + Category: SandyCliff PickAny: False Tiles: - 0: Sand + 0: Cliff 1: Cliff Template@111: Id: 111 Image: BASE111 Size: 2,1 + Category: SandyCliff PickAny: False Tiles: 1: Cliff @@ -1090,6 +1197,7 @@ Templates: Id: 112 Image: BASE112 Size: 1,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -1098,6 +1206,7 @@ Templates: Id: 113 Image: BASE113 Size: 4,2 + Category: Rock-Detail PickAny: False Tiles: 3: Rough @@ -1112,6 +1221,7 @@ Templates: Id: 114 Image: BASE114 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 1: Rough @@ -1122,6 +1232,7 @@ Templates: Id: 115 Image: BASE115 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -1129,6 +1240,7 @@ Templates: Id: 116 Image: BASE116 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1136,6 +1248,7 @@ Templates: Id: 117 Image: BASE117 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1146,6 +1259,7 @@ Templates: Id: 118 Image: BASE118 Size: 3,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1158,6 +1272,7 @@ Templates: Id: 119 Image: BASE119 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1168,6 +1283,7 @@ Templates: Id: 120 Image: BASE120 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1176,6 +1292,7 @@ Templates: Id: 121 Image: BASE121 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -1184,6 +1301,7 @@ Templates: Id: 122 Image: BASE122 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -1192,6 +1310,7 @@ Templates: Id: 123 Image: BASE123 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1199,6 +1318,7 @@ Templates: Id: 124 Image: BASE124 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -1206,6 +1326,7 @@ Templates: Id: 125 Image: BASE125 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -1564,6 +1685,7 @@ Templates: Id: 176 Image: BASE176 Size: 3,3 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Rock @@ -1579,6 +1701,7 @@ Templates: Id: 177 Image: BASE177 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1589,6 +1712,7 @@ Templates: Id: 178 Image: BASE178 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -1599,6 +1723,7 @@ Templates: Id: 179 Image: BASE179 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1609,6 +1734,7 @@ Templates: Id: 180 Image: BASE180 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1619,6 +1745,7 @@ Templates: Id: 181 Image: BASE181 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1629,6 +1756,7 @@ Templates: Id: 182 Image: BASE182 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1639,6 +1767,7 @@ Templates: Id: 183 Image: BASE183 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Cliff @@ -1649,6 +1778,7 @@ Templates: Id: 184 Image: BASE184 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Cliff @@ -1659,6 +1789,7 @@ Templates: Id: 185 Image: BASE185 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1669,6 +1800,7 @@ Templates: Id: 186 Image: BASE186 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1679,6 +1811,7 @@ Templates: Id: 187 Image: BASE187 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Rock @@ -1689,6 +1822,7 @@ Templates: Id: 188 Image: BASE188 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Rock @@ -1699,6 +1833,7 @@ Templates: Id: 189 Image: BASE189 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Rock @@ -1709,6 +1844,7 @@ Templates: Id: 190 Image: BASE190 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Sand @@ -1719,6 +1855,7 @@ Templates: Id: 191 Image: BASE191 Size: 3,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 5: Cliff @@ -1731,6 +1868,7 @@ Templates: Id: 192 Image: BASE192 Size: 3,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 2: Cliff @@ -1743,6 +1881,7 @@ Templates: Id: 193 Image: BASE193 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Transition @@ -1753,6 +1892,7 @@ Templates: Id: 194 Image: BASE194 Size: 2,3 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1765,6 +1905,7 @@ Templates: Id: 195 Image: BASE195 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1775,6 +1916,7 @@ Templates: Id: 196 Image: BASE196 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1785,6 +1927,7 @@ Templates: Id: 197 Image: BASE197 Size: 2,3 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1797,6 +1940,7 @@ Templates: Id: 198 Image: BASE198 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1807,6 +1951,7 @@ Templates: Id: 199 Image: BASE199 Size: 2,1 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Sand @@ -1815,6 +1960,7 @@ Templates: Id: 200 Image: BASE200 Size: 2,3 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1827,6 +1973,7 @@ Templates: Id: 201 Image: BASE201 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1837,16 +1984,18 @@ Templates: Id: 202 Image: BASE202 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: - 0: Transition - 2: Transition + 0: Cliff + 2: Cliff 3: Rock 1: Transition Template@203: Id: 203 Image: BASE203 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1857,6 +2006,7 @@ Templates: Id: 204 Image: BASE204 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1867,6 +2017,7 @@ Templates: Id: 205 Image: BASE205 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Rock @@ -1877,6 +2028,7 @@ Templates: Id: 206 Image: BASE206 Size: 2,3 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1889,6 +2041,7 @@ Templates: Id: 207 Image: BASE207 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 0: Cliff @@ -1899,6 +2052,7 @@ Templates: Id: 208 Image: BASE208 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 0: Cliff @@ -1909,6 +2063,7 @@ Templates: Id: 209 Image: BASE209 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -1919,6 +2074,7 @@ Templates: Id: 210 Image: BASE210 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Cliff @@ -1929,6 +2085,7 @@ Templates: Id: 211 Image: BASE211 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -1939,6 +2096,7 @@ Templates: Id: 212 Image: BASE212 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Cliff @@ -1949,6 +2107,7 @@ Templates: Id: 213 Image: BASE213 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -1959,6 +2118,7 @@ Templates: Id: 214 Image: BASE214 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 4: Rough @@ -1971,6 +2131,7 @@ Templates: Id: 215 Image: BASE215 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -1978,6 +2139,7 @@ Templates: Id: 216 Image: BASE216 Size: 2,3 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 1: Sand @@ -1990,6 +2152,7 @@ Templates: Id: 217 Image: BASE217 Size: 1,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -1997,6 +2160,7 @@ Templates: Id: 218 Image: BASE218 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 1: Rough @@ -2007,6 +2171,7 @@ Templates: Id: 219 Image: BASE219 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 1: Sand @@ -2017,6 +2182,7 @@ Templates: Id: 220 Image: BASE220 Size: 3,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 2: Rough @@ -2029,6 +2195,7 @@ Templates: Id: 221 Image: BASE221 Size: 3,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2038,16 +2205,18 @@ Templates: Id: 222 Image: BASE222 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Transition 3: Transition 2: Transition - 0: Transition + 0: Cliff Template@223: Id: 223 Image: BASE223 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Sand @@ -2058,6 +2227,7 @@ Templates: Id: 224 Image: BASE224 Size: 2,2 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2068,9 +2238,10 @@ Templates: Id: 225 Image: BASE225 Size: 1,1 + Category: Dune PickAny: False Tiles: - 0: Sand + 0: Dune Template@226: Id: 226 Image: BASE226 @@ -2096,6 +2267,7 @@ Templates: Id: 229 Image: BASE229 Size: 2,2 + Category: Dune PickAny: False Tiles: 1: Sand @@ -2106,6 +2278,7 @@ Templates: Id: 230 Image: BASE230 Size: 2,1 + Category: Dune PickAny: False Tiles: 1: Dune @@ -2114,6 +2287,7 @@ Templates: Id: 231 Image: BASE231 Size: 2,1 + Category: Dune PickAny: False Tiles: 1: Dune @@ -2122,6 +2296,7 @@ Templates: Id: 232 Image: BASE232 Size: 2,2 + Category: Dune PickAny: False Tiles: 1: Dune @@ -2132,6 +2307,7 @@ Templates: Id: 233 Image: BASE233 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2139,6 +2315,7 @@ Templates: Id: 234 Image: BASE234 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2146,6 +2323,7 @@ Templates: Id: 235 Image: BASE235 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2153,6 +2331,7 @@ Templates: Id: 236 Image: BASE236 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2160,6 +2339,7 @@ Templates: Id: 237 Image: BASE237 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2167,6 +2347,7 @@ Templates: Id: 238 Image: BASE238 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2174,6 +2355,7 @@ Templates: Id: 239 Image: BASE239 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2181,6 +2363,7 @@ Templates: Id: 240 Image: BASE240 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2188,6 +2371,7 @@ Templates: Id: 241 Image: BASE241 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2195,6 +2379,7 @@ Templates: Id: 242 Image: BASE242 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2202,6 +2387,7 @@ Templates: Id: 243 Image: BASE243 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2209,6 +2395,7 @@ Templates: Id: 244 Image: BASE244 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2216,6 +2403,7 @@ Templates: Id: 245 Image: BASE245 Size: 1,1 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2223,6 +2411,7 @@ Templates: Id: 246 Image: BASE246 Size: 2,2 + Category: Dune PickAny: False Tiles: 0: Dune @@ -2233,6 +2422,7 @@ Templates: Id: 247 Image: BASE247 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2243,6 +2433,7 @@ Templates: Id: 248 Image: BASE248 Size: 2,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 1: Sand @@ -2251,6 +2442,7 @@ Templates: Id: 249 Image: BASE249 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2258,6 +2450,7 @@ Templates: Id: 250 Image: BASE250 Size: 1,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2265,6 +2458,7 @@ Templates: Id: 251 Image: BASE251 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2275,6 +2469,7 @@ Templates: Id: 252 Image: BASE252 Size: 2,2 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Cliff @@ -2285,6 +2480,7 @@ Templates: Id: 253 Image: BASE253 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 1: Cliff @@ -2295,6 +2491,7 @@ Templates: Id: 254 Image: BASE254 Size: 2,2 + Category: Cliff-Type-Changer PickAny: False Tiles: 0: Cliff @@ -2305,6 +2502,7 @@ Templates: Id: 255 Image: BASE255 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -2315,6 +2513,7 @@ Templates: Id: 256 Image: BASE256 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 2: Cliff @@ -2341,6 +2540,7 @@ Templates: Id: 258 Image: BASE258 Size: 1,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 1: Cliff @@ -2349,6 +2549,7 @@ Templates: Id: 259 Image: BASE259 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -2356,6 +2557,7 @@ Templates: Id: 260 Image: BASE260 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -2363,6 +2565,7 @@ Templates: Id: 261 Image: BASE261 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -2370,6 +2573,7 @@ Templates: Id: 262 Image: BASE262 Size: 1,1 + Category: Rock-SandSmooth PickAny: False Tiles: 0: Transition @@ -2377,6 +2581,7 @@ Templates: Id: 263 Image: BASE263 Size: 3,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -2389,6 +2594,7 @@ Templates: Id: 264 Image: BASE264 Size: 3,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Cliff @@ -2439,6 +2645,7 @@ Templates: Id: 269 Image: BASE269 Size: 2,1 + Category: Rock-SandSmooth PickAny: False Tiles: 1: Transition @@ -2456,6 +2663,7 @@ Templates: Id: 271 Image: BAT00 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2463,6 +2671,7 @@ Templates: Id: 272 Image: BAT01 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2470,6 +2679,7 @@ Templates: Id: 273 Image: BAT02 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2477,6 +2687,7 @@ Templates: Id: 274 Image: BAT03 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2484,6 +2695,7 @@ Templates: Id: 275 Image: BAT04 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2491,6 +2703,7 @@ Templates: Id: 276 Image: BAT05 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2498,6 +2711,7 @@ Templates: Id: 277 Image: BAT06 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -2505,6 +2719,7 @@ Templates: Id: 278 Image: BAT07 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2512,6 +2727,7 @@ Templates: Id: 279 Image: BAT08 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2519,6 +2735,7 @@ Templates: Id: 280 Image: BAT09 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -2526,6 +2743,7 @@ Templates: Id: 281 Image: BAT10 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2533,6 +2751,7 @@ Templates: Id: 282 Image: BAT11 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2540,6 +2759,7 @@ Templates: Id: 283 Image: BAT12 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2550,6 +2770,7 @@ Templates: Id: 284 Image: BAT13 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2557,6 +2778,7 @@ Templates: Id: 285 Image: BAT14 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2564,6 +2786,7 @@ Templates: Id: 286 Image: BAT15 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2574,6 +2797,7 @@ Templates: Id: 287 Image: BAT16 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2586,6 +2810,7 @@ Templates: Id: 288 Image: BAT17 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2598,6 +2823,7 @@ Templates: Id: 289 Image: BAT18 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2610,6 +2836,7 @@ Templates: Id: 290 Image: BAT19 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2622,6 +2849,7 @@ Templates: Id: 291 Image: BAT20 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2630,6 +2858,7 @@ Templates: Id: 292 Image: BAT21 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2637,6 +2866,7 @@ Templates: Id: 293 Image: BAT22 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2644,6 +2874,7 @@ Templates: Id: 294 Image: BAT23 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2651,6 +2882,7 @@ Templates: Id: 295 Image: BAT24 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -2659,6 +2891,7 @@ Templates: Id: 296 Image: BAT25 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2666,6 +2899,7 @@ Templates: Id: 297 Image: BAT26 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2673,6 +2907,7 @@ Templates: Id: 298 Image: BAT27 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2680,6 +2915,7 @@ Templates: Id: 299 Image: BAT28 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2687,6 +2923,7 @@ Templates: Id: 300 Image: BAT29 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2697,6 +2934,7 @@ Templates: Id: 301 Image: BAT30 Size: 2,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2705,6 +2943,7 @@ Templates: Id: 302 Image: BAT31 Size: 1,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2713,6 +2952,7 @@ Templates: Id: 303 Image: BAT32 Size: 2,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2721,6 +2961,7 @@ Templates: Id: 304 Image: BAT33 Size: 2,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2729,6 +2970,7 @@ Templates: Id: 305 Image: BAT34 Size: 1,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2736,6 +2978,7 @@ Templates: Id: 306 Image: BAT35 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2746,6 +2989,7 @@ Templates: Id: 307 Image: BAT36 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2756,6 +3000,7 @@ Templates: Id: 308 Image: BAT37 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Sand @@ -2766,6 +3011,7 @@ Templates: Id: 309 Image: BAT38 Size: 3,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Sand @@ -2778,6 +3024,7 @@ Templates: Id: 310 Image: BAT39 Size: 4,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -2792,6 +3039,7 @@ Templates: Id: 311 Image: BAT40 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2802,6 +3050,7 @@ Templates: Id: 312 Image: BAT41 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2809,6 +3058,7 @@ Templates: Id: 313 Image: BAT42 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2816,6 +3066,7 @@ Templates: Id: 314 Image: BAT43 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2823,6 +3074,7 @@ Templates: Id: 315 Image: BAT44 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2830,6 +3082,7 @@ Templates: Id: 316 Image: BAT45 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2837,6 +3090,7 @@ Templates: Id: 317 Image: BAT46 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2844,6 +3098,7 @@ Templates: Id: 318 Image: BAT47 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2851,6 +3106,7 @@ Templates: Id: 319 Image: BAT48 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2858,6 +3114,7 @@ Templates: Id: 320 Image: BAT49 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2866,6 +3123,7 @@ Templates: Id: 321 Image: BAT50 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2873,6 +3131,7 @@ Templates: Id: 322 Image: BAT51 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2880,6 +3139,7 @@ Templates: Id: 323 Image: BAT52 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2887,6 +3147,7 @@ Templates: Id: 324 Image: BAT53 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2894,6 +3155,7 @@ Templates: Id: 325 Image: BAT54 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2902,6 +3164,7 @@ Templates: Id: 326 Image: BAT55 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2909,6 +3172,7 @@ Templates: Id: 327 Image: BAT56 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2916,6 +3180,7 @@ Templates: Id: 328 Image: BAT57 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2923,6 +3188,7 @@ Templates: Id: 329 Image: BAT58 Size: 2,2 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 0: Cliff @@ -2933,6 +3199,7 @@ Templates: Id: 330 Image: BAT59 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2943,6 +3210,7 @@ Templates: Id: 331 Image: BAT60 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -2953,6 +3221,7 @@ Templates: Id: 332 Image: BAT61 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -2965,6 +3234,7 @@ Templates: Id: 333 Image: BAT62 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -2975,6 +3245,7 @@ Templates: Id: 334 Image: BAT63 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -2985,6 +3256,7 @@ Templates: Id: 335 Image: BAT64 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -2993,6 +3265,7 @@ Templates: Id: 336 Image: BAT65 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3000,6 +3273,7 @@ Templates: Id: 337 Image: BAT66 Size: 3,2 + Category: Sand-Detail PickAny: False Tiles: 2: Rough @@ -3012,6 +3286,7 @@ Templates: Id: 338 Image: BAT67 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -3020,6 +3295,7 @@ Templates: Id: 339 Image: BGBS00 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -3030,6 +3306,7 @@ Templates: Id: 340 Image: BGBS01 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3040,6 +3317,7 @@ Templates: Id: 341 Image: BGBS02 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -3050,6 +3328,7 @@ Templates: Id: 342 Image: BGBS03 Size: 6,3 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 5: Rock @@ -3074,6 +3353,7 @@ Templates: Id: 343 Image: BGBS04 Size: 3,3 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 2: Rock @@ -3089,6 +3369,7 @@ Templates: Id: 344 Image: BGBS05 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3099,6 +3380,7 @@ Templates: Id: 345 Image: BGBS06 Size: 2,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3107,6 +3389,7 @@ Templates: Id: 346 Image: BGBS07 Size: 2,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3115,6 +3398,7 @@ Templates: Id: 347 Image: BGBS08 Size: 4,2 + Category: Rock-Detail PickAny: False Tiles: 0: Cliff @@ -3129,6 +3413,7 @@ Templates: Id: 348 Image: BGBS09 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -3139,6 +3424,7 @@ Templates: Id: 349 Image: BGBS10 Size: 3,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3151,6 +3437,7 @@ Templates: Id: 350 Image: BGBS11 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3158,6 +3445,7 @@ Templates: Id: 351 Image: BGBS12 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -3168,6 +3456,7 @@ Templates: Id: 352 Image: BGBS13 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3175,6 +3464,7 @@ Templates: Id: 353 Image: BGBS14 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3182,6 +3472,7 @@ Templates: Id: 354 Image: BGBS15 Size: 3,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3197,6 +3488,7 @@ Templates: Id: 355 Image: BGBS16 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3207,6 +3499,7 @@ Templates: Id: 356 Image: BGBS17 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3217,6 +3510,7 @@ Templates: Id: 357 Image: BGBS18 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3225,6 +3519,7 @@ Templates: Id: 358 Image: BGBS19 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3235,6 +3530,7 @@ Templates: Id: 359 Image: BGBS20 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3245,6 +3541,7 @@ Templates: Id: 360 Image: BGBS21 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -3253,6 +3550,7 @@ Templates: Id: 361 Image: ICE00 Size: 4,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -3263,6 +3561,7 @@ Templates: Id: 362 Image: ICE01 Size: 3,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3272,6 +3571,7 @@ Templates: Id: 363 Image: ICE02 Size: 1,2 + Category: Ice PickAny: False Tiles: 0: Cliff @@ -3280,6 +3580,7 @@ Templates: Id: 364 Image: ICE03 Size: 2,2 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 0: Cliff @@ -3290,6 +3591,7 @@ Templates: Id: 365 Image: ICE04 Size: 2,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3298,6 +3600,7 @@ Templates: Id: 366 Image: ICE05 Size: 4,1 + Category: Ice-Detail PickAny: False Tiles: 0: Cliff @@ -3308,6 +3611,7 @@ Templates: Id: 367 Image: ICE06 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3315,6 +3619,7 @@ Templates: Id: 368 Image: ICE07 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3322,6 +3627,7 @@ Templates: Id: 369 Image: ICE08 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3329,6 +3635,7 @@ Templates: Id: 370 Image: ICE09 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3336,6 +3643,7 @@ Templates: Id: 371 Image: ICE10 Size: 1,4 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3346,6 +3654,7 @@ Templates: Id: 372 Image: ICE11 Size: 1,2 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3354,6 +3663,7 @@ Templates: Id: 373 Image: ICE12 Size: 6,3 + Category: Ice-Detail PickAny: False Tiles: 5: Sand @@ -3378,6 +3688,7 @@ Templates: Id: 374 Image: ICE13 Size: 3,2 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3390,6 +3701,7 @@ Templates: Id: 375 Image: ICE14 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3397,6 +3709,7 @@ Templates: Id: 376 Image: ICE15 Size: 4,3 + Category: Ice PickAny: False Tiles: 0: Cliff @@ -3415,6 +3728,7 @@ Templates: Id: 377 Image: ICE16 Size: 4,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3425,6 +3739,7 @@ Templates: Id: 378 Image: ICE17 Size: 2,3 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3437,6 +3752,7 @@ Templates: Id: 379 Image: ICE18 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3444,6 +3760,7 @@ Templates: Id: 380 Image: ICE19 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3451,6 +3768,7 @@ Templates: Id: 381 Image: ICE20 Size: 1,1 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Sand @@ -3458,6 +3776,7 @@ Templates: Id: 382 Image: ICE21 Size: 1,4 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Cliff @@ -3468,6 +3787,7 @@ Templates: Id: 383 Image: ICE22 Size: 1,2 + Category: Z-Crap(Unusual) PickAny: False Tiles: 1: Cliff @@ -3476,6 +3796,7 @@ Templates: Id: 384 Image: ICE23 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -3488,6 +3809,7 @@ Templates: Id: 385 Image: ICE24 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3498,6 +3820,7 @@ Templates: Id: 386 Image: ICE25 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3508,6 +3831,7 @@ Templates: Id: 387 Image: ICE26 Size: 2,3 + Category: Ice PickAny: False Tiles: 0: Ice @@ -3520,6 +3844,7 @@ Templates: Id: 388 Image: ICE27 Size: 2,2 + Category: Ice PickAny: False Tiles: 0: Cliff @@ -3530,6 +3855,7 @@ Templates: Id: 389 Image: ICE28 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3537,6 +3863,7 @@ Templates: Id: 390 Image: ICE29 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3544,6 +3871,7 @@ Templates: Id: 391 Image: ICE30 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3551,6 +3879,7 @@ Templates: Id: 392 Image: ICE31 Size: 1,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3558,6 +3887,7 @@ Templates: Id: 393 Image: ICE32 Size: 2,2 + Category: Ice PickAny: False Tiles: 2: Cliff @@ -3568,6 +3898,7 @@ Templates: Id: 394 Image: ICE33 Size: 2,3 + Category: Ice PickAny: False Tiles: 0: Cliff @@ -3580,6 +3911,7 @@ Templates: Id: 395 Image: ICE34 Size: 2,2 + Category: Ice PickAny: False Tiles: 0: Cliff @@ -3590,6 +3922,7 @@ Templates: Id: 396 Image: ICE35 Size: 2,2 + Category: Ice PickAny: False Tiles: 0: Ice @@ -3600,6 +3933,7 @@ Templates: Id: 397 Image: ICE36 Size: 2,2 + Category: Ice PickAny: False Tiles: 0: Ice @@ -3610,6 +3944,7 @@ Templates: Id: 398 Image: ICE37 Size: 2,2 + Category: Ice PickAny: False Tiles: 0: Ice @@ -3620,6 +3955,7 @@ Templates: Id: 399 Image: ICE38 Size: 2,1 + Category: Ice-Detail PickAny: False Tiles: 0: Sand @@ -3628,6 +3964,7 @@ Templates: Id: 400 Image: ICE39 Size: 2,1 + Category: Ice-Detail PickAny: False Tiles: 1: Sand @@ -3636,6 +3973,7 @@ Templates: Id: 401 Image: ICE40 Size: 2,3 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 0: Sand @@ -3648,6 +3986,7 @@ Templates: Id: 402 Image: ICE41 Size: 3,1 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Rough @@ -3657,6 +3996,7 @@ Templates: Id: 403 Image: ICE42 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3665,6 +4005,7 @@ Templates: Id: 404 Image: ICE43 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3673,6 +4014,7 @@ Templates: Id: 405 Image: ICE44 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3681,6 +4023,7 @@ Templates: Id: 406 Image: ICE45 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3689,6 +4032,7 @@ Templates: Id: 407 Image: ICE46 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -3697,6 +4041,7 @@ Templates: Id: 408 Image: TREE00 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3704,6 +4049,7 @@ Templates: Id: 409 Image: TREE01 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3718,6 +4064,7 @@ Templates: Id: 411 Image: TREE03 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -3726,6 +4073,7 @@ Templates: Id: 412 Image: TREE04 Size: 2,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -3736,6 +4084,7 @@ Templates: Id: 413 Image: TREE05 Size: 3,2 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -3748,6 +4097,7 @@ Templates: Id: 414 Image: TREE06 Size: 5,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3759,6 +4109,7 @@ Templates: Id: 415 Image: TREE07 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3767,6 +4118,7 @@ Templates: Id: 416 Image: TREE08 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3777,6 +4129,7 @@ Templates: Id: 417 Image: TREE09 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Transition @@ -3785,6 +4138,7 @@ Templates: Id: 418 Image: TREE10 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3792,6 +4146,7 @@ Templates: Id: 419 Image: TREE11 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3799,6 +4154,7 @@ Templates: Id: 420 Image: TREE12 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3806,6 +4162,7 @@ Templates: Id: 421 Image: TREE13 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Sand @@ -3816,6 +4173,7 @@ Templates: Id: 422 Image: TREE14 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3826,6 +4184,7 @@ Templates: Id: 423 Image: TREE15 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3836,6 +4195,7 @@ Templates: Id: 424 Image: TREE16 Size: 6,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3848,6 +4208,7 @@ Templates: Id: 425 Image: TREE17 Size: 3,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3857,6 +4218,7 @@ Templates: Id: 426 Image: TREE18 Size: 2,1 + Category: Rock-Detail PickAny: False Tiles: 1: Rock @@ -3865,6 +4227,7 @@ Templates: Id: 427 Image: TREE19 Size: 2,2 + Category: SandyCliff PickAny: False Tiles: 0: Cliff @@ -3875,6 +4238,7 @@ Templates: Id: 428 Image: TREE20 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Transition @@ -3885,6 +4249,7 @@ Templates: Id: 429 Image: TREE21 Size: 3,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3900,6 +4265,7 @@ Templates: Id: 430 Image: TREE22 Size: 1,1 + Category: Z-Crap(Unusual) PickAny: False Tiles: 0: Rough @@ -3907,6 +4273,7 @@ Templates: Id: 431 Image: TREE23 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3917,6 +4284,7 @@ Templates: Id: 432 Image: TREE24 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -3924,6 +4292,7 @@ Templates: Id: 433 Image: TREE25 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3931,6 +4300,7 @@ Templates: Id: 434 Image: TREE26 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Rough @@ -3939,6 +4309,7 @@ Templates: Id: 435 Image: TREE27 Size: 3,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3948,6 +4319,7 @@ Templates: Id: 436 Image: TREE28 Size: 2,3 + Category: Sand-Detail PickAny: False Tiles: 0: Rough @@ -3967,6 +4339,7 @@ Templates: Id: 438 Image: TREE30 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3977,6 +4350,7 @@ Templates: Id: 439 Image: TREE31 Size: 3,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3989,6 +4363,7 @@ Templates: Id: 440 Image: TREE32 Size: 2,2 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -3999,6 +4374,7 @@ Templates: Id: 441 Image: TREE33 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -4006,6 +4382,7 @@ Templates: Id: 442 Image: TREE34 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -4013,6 +4390,7 @@ Templates: Id: 443 Image: TREE35 Size: 3,2 + Category: Rock-Detail(Cliff) PickAny: False Tiles: 5: Sand @@ -4025,6 +4403,7 @@ Templates: Id: 444 Image: TREE36 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rock @@ -4032,6 +4411,7 @@ Templates: Id: 445 Image: WAST00 Size: 6,3 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4056,6 +4436,7 @@ Templates: Id: 446 Image: WAST01 Size: 3,1 + Category: Sand-Detail PickAny: False Tiles: 0: Dune @@ -4065,6 +4446,7 @@ Templates: Id: 447 Image: WAST02 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4073,6 +4455,7 @@ Templates: Id: 448 Image: WAST03 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 2: Dune @@ -4083,6 +4466,7 @@ Templates: Id: 449 Image: WAST04 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4091,6 +4475,7 @@ Templates: Id: 450 Image: WAST05 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -4099,6 +4484,7 @@ Templates: Id: 451 Image: WAST06 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4106,6 +4492,7 @@ Templates: Id: 452 Image: WAST07 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4113,6 +4500,7 @@ Templates: Id: 453 Image: WAST08 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Dune @@ -4121,6 +4509,7 @@ Templates: Id: 454 Image: WAST09 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4129,6 +4518,7 @@ Templates: Id: 455 Image: WAST10 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4137,6 +4527,7 @@ Templates: Id: 456 Image: WAST11 Size: 3,2 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -4149,6 +4540,7 @@ Templates: Id: 457 Image: WAST12 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4156,6 +4548,7 @@ Templates: Id: 458 Image: WAST13 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 1: Sand @@ -4164,6 +4557,7 @@ Templates: Id: 459 Image: WAST14 Size: 2,2 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4174,6 +4568,7 @@ Templates: Id: 460 Image: WAST15 Size: 2,2 + Category: Dead-Wurm PickAny: False Tiles: 0: Rough @@ -4184,6 +4579,7 @@ Templates: Id: 461 Image: WAST16 Size: 3,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -4193,6 +4589,7 @@ Templates: Id: 462 Image: WAST17 Size: 5,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -4204,6 +4601,7 @@ Templates: Id: 463 Image: WAST18 Size: 2,1 + Category: Sand-Detail(Rotten Base) PickAny: False Tiles: 0: Rough @@ -4212,6 +4610,7 @@ Templates: Id: 464 Image: WAST19 Size: 1,2 + Category: Dead-Wurm PickAny: False Tiles: 0: Cliff @@ -4220,6 +4619,7 @@ Templates: Id: 465 Image: WAST20 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4227,6 +4627,7 @@ Templates: Id: 466 Image: WAST21 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4234,6 +4635,7 @@ Templates: Id: 467 Image: WAST22 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -4242,6 +4644,7 @@ Templates: Id: 468 Image: WAST23 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -4249,6 +4652,7 @@ Templates: Id: 469 Image: WAST24 Size: 1,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -4256,6 +4660,7 @@ Templates: Id: 470 Image: WAST25 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Cliff @@ -4264,6 +4669,7 @@ Templates: Id: 471 Image: WAST26 Size: 1,1 + Category: Dead-Wurm PickAny: False Tiles: 0: Sand @@ -4271,6 +4677,7 @@ Templates: Id: 472 Image: WAST27 Size: 2,1 + Category: Dead-Wurm PickAny: False Tiles: 1: Sand @@ -4279,6 +4686,7 @@ Templates: Id: 473 Image: WAST28 Size: 1,1 + Category: Dead-Wurm PickAny: False Tiles: 0: Sand @@ -4286,6 +4694,7 @@ Templates: Id: 474 Image: WAST29 Size: 4,3 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4304,6 +4713,7 @@ Templates: Id: 475 Image: WAST30 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 3: Sand @@ -4314,6 +4724,7 @@ Templates: Id: 476 Image: WAST31 Size: 3,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -4326,6 +4737,7 @@ Templates: Id: 477 Image: WAST32 Size: 1,2 + Category: Sand-Detail PickAny: False Tiles: 0: Concrete @@ -4334,6 +4746,7 @@ Templates: Id: 478 Image: WAST33 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -4341,6 +4754,7 @@ Templates: Id: 479 Image: WAST34 Size: 1,1 + Category: Rock-Detail PickAny: False Tiles: 0: Rough @@ -4348,6 +4762,7 @@ Templates: Id: 480 Image: WAST35 Size: 4,1 + Category: Sand-Detail PickAny: False Tiles: 0: Sand @@ -4358,6 +4773,7 @@ Templates: Id: 481 Image: WAST36 Size: 2,2 + Category: BaseBorder-Cliff PickAny: False Tiles: 0: Cliff @@ -4368,6 +4784,7 @@ Templates: Id: 482 Image: WAST37 Size: 2,1 + Category: Sand-Detail PickAny: False Tiles: 0: Rough From f2ab8a85414e230ff439ddd562b760cf8c2cd2d4 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 12:47:28 +1200 Subject: [PATCH 12/36] generalize rough cursor to be customizable for any terrain type --- OpenRA.FileFormats/Map/TileSet.cs | 1 + OpenRA.Mods.RA/Move/Mobile.cs | 6 ++++-- mods/d2k/tilesets/arrakis.yaml | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenRA.FileFormats/Map/TileSet.cs b/OpenRA.FileFormats/Map/TileSet.cs index 4578605e2f..0c835e14cc 100644 --- a/OpenRA.FileFormats/Map/TileSet.cs +++ b/OpenRA.FileFormats/Map/TileSet.cs @@ -23,6 +23,7 @@ namespace OpenRA.FileFormats public string[] AcceptsSmudgeType = { }; public bool IsWater = false; public Color Color; + public string CustomCursor; public TerrainTypeInfo() {} public TerrainTypeInfo(MiniYaml my) { FieldLoader.Load(this, my); } diff --git a/OpenRA.Mods.RA/Move/Mobile.cs b/OpenRA.Mods.RA/Move/Mobile.cs index a9dd43d6b7..0eff2703bb 100755 --- a/OpenRA.Mods.RA/Move/Mobile.cs +++ b/OpenRA.Mods.RA/Move/Mobile.cs @@ -456,8 +456,10 @@ namespace OpenRA.Mods.RA.Move { IsQueued = forceQueued; cursor = "move"; - if (self.World.LocalPlayer.Shroud.IsExplored(location) && self.World.GetTerrainType(location) == "Rough") - cursor = "move-rough"; + + if (self.World.LocalPlayer.Shroud.IsExplored(location)) + cursor = self.World.GetTerrainInfo(location).CustomCursor ?? cursor; + if (!self.World.Map.IsInMap(location) || (self.World.LocalPlayer.Shroud.IsExplored(location) && unitType.MovementCostForCell(self.World, location) == int.MaxValue)) cursor = "move-blocked"; diff --git a/mods/d2k/tilesets/arrakis.yaml b/mods/d2k/tilesets/arrakis.yaml index 49ae901df3..86a8b200d9 100644 --- a/mods/d2k/tilesets/arrakis.yaml +++ b/mods/d2k/tilesets/arrakis.yaml @@ -31,6 +31,7 @@ Terrain: AcceptsSmudgeType: IsWater: False Color: 255,88,116,116 + CustomCursor: move-rough TerrainType@Concrete: Type: Concrete AcceptsSmudgeType: @@ -4788,4 +4789,4 @@ Templates: PickAny: False Tiles: 0: Rough - 1: Rough \ No newline at end of file + 1: Rough From 854a9c4eb7340097f30d1dd48b5f60bc25a4c911 Mon Sep 17 00:00:00 2001 From: James Dunne Date: Sat, 30 Jun 2012 01:53:58 -0500 Subject: [PATCH 13/36] Added new ToDictionaryWithConflictLog to help diagnose ToDictionary bombs. --- OpenRA.FileFormats/Exts.cs | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/OpenRA.FileFormats/Exts.cs b/OpenRA.FileFormats/Exts.cs index 9d4216a5ea..f7e6c538aa 100755 --- a/OpenRA.FileFormats/Exts.cs +++ b/OpenRA.FileFormats/Exts.cs @@ -184,6 +184,58 @@ namespace OpenRA return ts.Concat(moreTs); } + public static Dictionary ToDictionaryWithConflictLog(this IEnumerable source, Func keySelector, string debugName, Func logKey, Func logValue) + { + return ToDictionaryWithConflictLog(source, keySelector, x => x, debugName, logKey, logValue); + } + + public static Dictionary ToDictionaryWithConflictLog(this IEnumerable source, Func keySelector, Func elementSelector, string debugName, Func logKey, Func logValue) + { + // Fall back on ToString() if null functions are provided: + logKey = logKey ?? (s => s.ToString()); + logValue = logValue ?? (s => s.ToString()); + + // Try to build a dictionary and log all duplicates found (if any): + var dupKeys = new Dictionary>(); + var d = new Dictionary(); + foreach (var item in source) + { + TKey key = keySelector(item); + TElement element = elementSelector(item); + + // Check for a key conflict: + if (d.ContainsKey(key)) + { + List dupKeyMessages; + if (!dupKeys.TryGetValue(key, out dupKeyMessages)) + { + // Log the initial conflicting value already inserted: + dupKeyMessages = new List(); + dupKeyMessages.Add(logValue(d[key])); + dupKeys.Add(key, dupKeyMessages); + } + + // Log this conflicting value: + dupKeyMessages.Add(logValue(element)); + continue; + } + + d.Add(key, element); + } + + // If any duplicates were found, log it and throw a descriptive error + if (dupKeys.Count > 0) + { + string badKeysFormatted = String.Join(", ", dupKeys.Select(p => "{0}: [{1}]".F(logKey(p.Key), String.Join(",", p.Value.ToArray()))).ToArray()); + string msg = "{0}, duplicate values found for the following keys: {1}".F(debugName, badKeysFormatted); + Log.Write("debug", msg); + throw new ArgumentException(msg); + } + + // Return the dictionary we built: + return d; + } + public static Color ColorLerp(float t, Color c1, Color c2) { return Color.FromArgb( From 7c4e32bd9425f3648f6e88cfa44f6045a4ae515a Mon Sep 17 00:00:00 2001 From: James Dunne Date: Sat, 30 Jun 2012 01:54:22 -0500 Subject: [PATCH 14/36] Applied ToDictionaryWithConflictLog to MixFile reader. --- OpenRA.FileFormats/Filesystem/MixFile.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenRA.FileFormats/Filesystem/MixFile.cs b/OpenRA.FileFormats/Filesystem/MixFile.cs index 647490640f..88a1e3324f 100644 --- a/OpenRA.FileFormats/Filesystem/MixFile.cs +++ b/OpenRA.FileFormats/Filesystem/MixFile.cs @@ -58,7 +58,9 @@ namespace OpenRA.FileFormats isEncrypted = 0 != (signature & (uint)MixFileFlags.Encrypted); if( isEncrypted ) { - index = ParseRaHeader( s, out dataStart ).ToDictionary(x => x.Hash); + index = ParseRaHeader(s, out dataStart).ToDictionaryWithConflictLog(x => x.Hash, + "MixFile.RaHeader", null, x => "(offs={0}, len={1})".F(x.Offset, x.Length) + ); return; } } @@ -66,7 +68,9 @@ namespace OpenRA.FileFormats s.Seek( 0, SeekOrigin.Begin ); isEncrypted = false; - index = ParseTdHeader(s, out dataStart).ToDictionary(x => x.Hash); + index = ParseTdHeader(s, out dataStart).ToDictionaryWithConflictLog(x => x.Hash, + "MixFile.TdHeader", null, x => "(offs={0}, len={1})".F(x.Offset, x.Length) + ); } const long headerStart = 84; From 480db8be42ea2093c8df950abbe53ff3943d17c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 29 Jun 2012 14:32:38 +0200 Subject: [PATCH 15/36] non-capturable hospital with heal-zone will heal engineer, capturing it is useless; heal-zone makes less sense, but it looks nicer (otherwise infantry drawn on top of the building) --- mods/cnc/rules/defaults.yaml | 5 +++-- mods/cnc/rules/tech.yaml | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index fee01a9a67..b4fe022fc4 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -133,8 +133,9 @@ SpawnViceroid: Probability: 2 CrushableInfantry: - Repairable: - RepairBuildings: hosp + RepairableNear: + Buildings: hosp + CloseEnough: 1 ^CivInfantry: Inherits: ^Infantry diff --git a/mods/cnc/rules/tech.yaml b/mods/cnc/rules/tech.yaml index e69a4b19d8..ace9a55d64 100644 --- a/mods/cnc/rules/tech.yaml +++ b/mods/cnc/rules/tech.yaml @@ -21,7 +21,7 @@ V19.Husk: # Hospital HOSP: - Inherits: ^TechBuilding + Inherits: ^CivBuilding Building: Footprint: xx xx Dimensions: 2,2 @@ -29,9 +29,7 @@ HOSP: Name: Hospital LeavesHusk: HuskActor: HOSP.Husk - Reservable: RepairsUnits: - RallyPoint: HOSP.Husk: Inherits: ^CivBuildingHusk From f5c606266d4a96b0648d68410253c5ad39b8c808 Mon Sep 17 00:00:00 2001 From: James Dunne Date: Tue, 26 Jun 2012 23:47:32 -0500 Subject: [PATCH 16/36] Fixed shift-tab keyboard shortcut in build palette. --- OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 08ee276faa..2c666164a4 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -507,7 +507,7 @@ namespace OpenRA.Mods.RA.Widgets void TabChange(bool shift) { var queues = VisibleQueues.Concat(VisibleQueues); - if (shift) queues.Reverse(); + if (shift) queues = queues.Reverse(); var nextQueue = queues.SkipWhile( q => q != CurrentQueue ) .ElementAtOrDefault(1); if (nextQueue != null) From 109546d20fc9d4c5eecdd2f5995a754c20781be0 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 13:31:04 +1200 Subject: [PATCH 17/36] fixed #2286 - chrono kills passengers on return too --- OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs | 2 +- OpenRA.Mods.RA/Activities/Teleport.cs | 19 +++++++++++++++++- OpenRA.Mods.RA/ChronoshiftDeploy.cs | 4 +--- OpenRA.Mods.RA/Chronoshiftable.cs | 20 ++++++------------- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs index d35ddfd2ac..0e549a629f 100755 --- a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs +++ b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs @@ -82,7 +82,7 @@ namespace OpenRA.Mods.RA { var mobile = self.Trait(); self.QueueActivity(mobile.ScriptedMove(left)); - self.QueueActivity(new Teleport(right)); + self.QueueActivity(new Teleport(null, right, false)); self.QueueActivity(new CallFunc(() => LoopTrack(self,left,right))); } } diff --git a/OpenRA.Mods.RA/Activities/Teleport.cs b/OpenRA.Mods.RA/Activities/Teleport.cs index 3155c16378..3cd1ed4939 100755 --- a/OpenRA.Mods.RA/Activities/Teleport.cs +++ b/OpenRA.Mods.RA/Activities/Teleport.cs @@ -16,15 +16,32 @@ namespace OpenRA.Mods.RA.Activities public class Teleport : Activity { CPos destination; + bool killCargo; + Actor chronosphere; - public Teleport(CPos destination) + public Teleport(Actor chronosphere, CPos destination, bool killCargo) { + this.chronosphere = chronosphere; this.destination = destination; + this.killCargo = killCargo; } public override Activity Tick(Actor self) { self.Trait().SetPosition(self, destination); + + if (killCargo && self.HasTrait()) + { + var cargo = self.Trait(); + while (!cargo.IsEmpty(self)) + { + if (chronosphere != null) + chronosphere.Owner.Kills++; + var a = cargo.Unload(self); + a.Owner.Deaths++; + } + } + return NextActivity; } } diff --git a/OpenRA.Mods.RA/ChronoshiftDeploy.cs b/OpenRA.Mods.RA/ChronoshiftDeploy.cs index af4cea046f..b61288984d 100644 --- a/OpenRA.Mods.RA/ChronoshiftDeploy.cs +++ b/OpenRA.Mods.RA/ChronoshiftDeploy.cs @@ -52,12 +52,10 @@ namespace OpenRA.Mods.RA if (order.OrderString == "ChronoshiftSelf" && movement.CanEnterCell(order.TargetLocation)) { if (self.Owner == self.World.LocalPlayer) - { self.World.CancelInputMode(); - } self.CancelActivity(); - self.QueueActivity(new Teleport(order.TargetLocation)); + self.QueueActivity(new Teleport(null, order.TargetLocation, true)); Sound.Play("chrotnk1.aud", self.CenterLocation); Sound.Play("chrotnk1.aud", order.TargetLocation.ToPPos()); chargeTick = 25 * self.Info.Traits.Get().ChargeTime; diff --git a/OpenRA.Mods.RA/Chronoshiftable.cs b/OpenRA.Mods.RA/Chronoshiftable.cs index 0d722e0f22..90de1a7e56 100755 --- a/OpenRA.Mods.RA/Chronoshiftable.cs +++ b/OpenRA.Mods.RA/Chronoshiftable.cs @@ -20,6 +20,8 @@ namespace OpenRA.Mods.RA // Return-to-sender logic [Sync] CPos chronoshiftOrigin; [Sync] int chronoshiftReturnTicks = 0; + Actor chronosphere; + bool killCargo; public void Tick(Actor self) { @@ -34,7 +36,7 @@ namespace OpenRA.Mods.RA { self.CancelActivity(); // Todo: need a new Teleport method that will move to the closest available cell - self.QueueActivity(new Teleport(chronoshiftOrigin)); + self.QueueActivity(new Teleport(chronosphere, chronoshiftOrigin, killCargo)); } } @@ -52,22 +54,12 @@ namespace OpenRA.Mods.RA /// Set up return-to-sender info chronoshiftOrigin = self.Location; chronoshiftReturnTicks = duration; - - // Kill cargo - if (killCargo && self.HasTrait()) - { - var cargo = self.Trait(); - while (!cargo.IsEmpty(self)) - { - chronosphere.Owner.Kills++; - var a = cargo.Unload(self); - a.Owner.Deaths++; - } - } + this.chronosphere = chronosphere; + this.killCargo = killCargo; // Set up the teleport self.CancelActivity(); - self.QueueActivity(new Teleport(targetLocation)); + self.QueueActivity(new Teleport(chronosphere, targetLocation, killCargo)); return true; } From 0a4669b9257b09f39a756b4533a2a3b4fb5fe7f5 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 14:05:21 +1200 Subject: [PATCH 18/36] Add SimpleTeleport for non-chrono jumps (used in scripts etc) --- OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs | 2 +- OpenRA.Mods.RA/Activities/Teleport.cs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs index 0e549a629f..7086c416cd 100755 --- a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs +++ b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs @@ -82,7 +82,7 @@ namespace OpenRA.Mods.RA { var mobile = self.Trait(); self.QueueActivity(mobile.ScriptedMove(left)); - self.QueueActivity(new Teleport(null, right, false)); + self.QueueActivity(new SimpleTeleport(right)); self.QueueActivity(new CallFunc(() => LoopTrack(self,left,right))); } } diff --git a/OpenRA.Mods.RA/Activities/Teleport.cs b/OpenRA.Mods.RA/Activities/Teleport.cs index 3cd1ed4939..5483e7c9be 100755 --- a/OpenRA.Mods.RA/Activities/Teleport.cs +++ b/OpenRA.Mods.RA/Activities/Teleport.cs @@ -45,4 +45,17 @@ namespace OpenRA.Mods.RA.Activities return NextActivity; } } + + public class SimpleTeleport : Activity + { + CPos destination; + + public SimpleTeleport(CPos destination) { this.destination = destination; } + + public override Activity Tick(Actor self) + { + self.Trait().SetPosition(self, destination); + return NextActivity; + } + } } From 5fee16569262adf62e0a2d535e8a54096cf45bae Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 14:21:43 +1200 Subject: [PATCH 19/36] fixed #2289 - missing chrono effects on return --- OpenRA.Mods.RA/Activities/Teleport.cs | 11 +++++++++++ OpenRA.Mods.RA/ChronoshiftDeploy.cs | 5 ----- OpenRA.Mods.RA/Scripting/RASpecialPowers.cs | 11 ----------- OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs | 8 -------- 4 files changed, 11 insertions(+), 24 deletions(-) diff --git a/OpenRA.Mods.RA/Activities/Teleport.cs b/OpenRA.Mods.RA/Activities/Teleport.cs index 5483e7c9be..ede8cbed78 100755 --- a/OpenRA.Mods.RA/Activities/Teleport.cs +++ b/OpenRA.Mods.RA/Activities/Teleport.cs @@ -10,6 +10,7 @@ using System.Linq; using OpenRA.Traits; +using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA.Activities { @@ -28,6 +29,9 @@ namespace OpenRA.Mods.RA.Activities public override Activity Tick(Actor self) { + Sound.Play("chrono2.aud", self.Location.ToPPos()); + Sound.Play("chrono2.aud", destination.ToPPos()); + self.Trait().SetPosition(self, destination); if (killCargo && self.HasTrait()) @@ -42,6 +46,13 @@ namespace OpenRA.Mods.RA.Activities } } + // Trigger screen desaturate effect + foreach (var a in self.World.ActorsWithTrait()) + a.Trait.Enable(); + + if (chronosphere != null && !chronosphere.Destroyed && chronosphere.HasTrait()) + chronosphere.Trait().PlayCustomAnim(chronosphere, "active"); + return NextActivity; } } diff --git a/OpenRA.Mods.RA/ChronoshiftDeploy.cs b/OpenRA.Mods.RA/ChronoshiftDeploy.cs index b61288984d..a6837e000b 100644 --- a/OpenRA.Mods.RA/ChronoshiftDeploy.cs +++ b/OpenRA.Mods.RA/ChronoshiftDeploy.cs @@ -56,12 +56,7 @@ namespace OpenRA.Mods.RA self.CancelActivity(); self.QueueActivity(new Teleport(null, order.TargetLocation, true)); - Sound.Play("chrotnk1.aud", self.CenterLocation); - Sound.Play("chrotnk1.aud", order.TargetLocation.ToPPos()); chargeTick = 25 * self.Info.Traits.Get().ChargeTime; - - foreach (var a in self.World.ActorsWithTrait()) - a.Trait.Enable(); } } diff --git a/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs b/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs index 0cb8c4d09a..47ddcf1818 100644 --- a/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs +++ b/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs @@ -20,15 +20,6 @@ namespace OpenRA.Scripting { public static void Chronoshift(World world, List> units, Actor chronosphere, int duration, bool killCargo) { - if (chronosphere != null) - chronosphere.Trait().PlayCustomAnim(chronosphere, "active"); - - // Trigger screen desaturate effect - foreach (var a in world.ActorsWithTrait()) - a.Trait.Enable(); - - Sound.Play("chrono2.aud", units.First().First.CenterLocation); - foreach (var kv in units) { var target = kv.First; @@ -37,8 +28,6 @@ namespace OpenRA.Scripting if (cs.CanChronoshiftTo(target, targetCell, true)) cs.Teleport(target, targetCell, duration, killCargo,chronosphere); } - - } } } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index e3b85e08c8..38b0486994 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -39,14 +39,6 @@ namespace OpenRA.Mods.RA public override void Activate(Actor self, Order order) { - self.Trait().PlayCustomAnim(self, "active"); - - // Trigger screen desaturate effect - foreach (var a in self.World.ActorsWithTrait()) - a.Trait.Enable(); - - Sound.Play("chrono2.aud", order.TargetLocation.ToPPos()); - Sound.Play("chrono2.aud", order.ExtraLocation.ToPPos()); foreach (var target in UnitsInRange(order.ExtraLocation)) { var cs = target.Trait(); From 7a578a0679d39c69706068f41bab603e404aac37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 28 Jun 2012 19:52:25 +0200 Subject: [PATCH 20/36] notifications (formerly EVAalerts) centralized and race specific outsourced into notifications.yaml triggered with PlayNotification(...) (v2: less redundant code for PlayVoice/Notifications) added harvester under attack and battlecontrol terminated --- OpenRA.FileFormats/Manifest.cs | 3 +- OpenRA.Game/GameRules/Rules.cs | 6 +- .../GameRules/{VoiceInfo.cs => SoundInfo.cs} | 24 ++++---- OpenRA.Game/Map.cs | 3 + OpenRA.Game/OpenRA.Game.csproj | 2 +- OpenRA.Game/Player.cs | 5 -- OpenRA.Game/Sound.cs | 60 +++++++++++++++---- OpenRA.Game/Traits/Player/EvaAlerts.cs | 43 ------------- OpenRA.Game/Traits/Player/PlayerResources.cs | 12 ++-- OpenRA.Game/Traits/TraitsInterfaces.cs | 1 + OpenRA.Game/Widgets/ButtonWidget.cs | 10 ++-- OpenRA.Game/WorldUtils.cs | 2 +- .../Widgets/Logic/CncIngameMenuLogic.cs | 2 +- .../Widgets/ProductionTabsWidget.cs | 10 ++-- OpenRA.Mods.RA/Buildings/CanPowerDown.cs | 4 +- OpenRA.Mods.RA/Buildings/PowerManager.cs | 5 +- .../Buildings/RepairableBuilding.cs | 2 +- OpenRA.Mods.RA/ConquestVictoryConditions.cs | 9 +-- OpenRA.Mods.RA/GainsExperience.cs | 3 +- .../Orders/PlaceBuildingOrderGenerator.cs | 3 +- OpenRA.Mods.RA/Player/BaseAttackNotifier.cs | 13 ++-- .../Player/HarvesterAttackNotifier.cs | 52 ++++++++++++++++ OpenRA.Mods.RA/Player/PlaceBuilding.cs | 3 +- OpenRA.Mods.RA/PrimaryBuilding.cs | 3 +- OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs | 13 ++-- .../Widgets/Logic/IngameChromeLogic.cs | 7 ++- OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs | 2 +- OpenRA.Mods.RA/Widgets/RadarBinWidget.cs | 3 +- mods/cnc/chrome/ingame.yaml | 20 ------- mods/cnc/mod.yaml | 3 + mods/cnc/notifications.yaml | 26 ++++++++ mods/cnc/rules/system.yaml | 13 ---- mods/d2k/TODO | 6 +- mods/d2k/mod.yaml | 3 + mods/d2k/notifications.yaml | 37 ++++++++++++ mods/d2k/rules/system.yaml | 39 ++---------- mods/d2k/rules/vehicles.yaml | 2 +- mods/ra/mod.yaml | 3 + mods/ra/notifications.yaml | 30 ++++++++++ mods/ra/rules/system.yaml | 3 - 40 files changed, 271 insertions(+), 219 deletions(-) rename OpenRA.Game/GameRules/{VoiceInfo.cs => SoundInfo.cs} (72%) delete mode 100644 OpenRA.Game/Traits/Player/EvaAlerts.cs create mode 100644 OpenRA.Mods.RA/Player/HarvesterAttackNotifier.cs create mode 100644 mods/cnc/notifications.yaml create mode 100644 mods/d2k/notifications.yaml create mode 100644 mods/ra/notifications.yaml diff --git a/OpenRA.FileFormats/Manifest.cs b/OpenRA.FileFormats/Manifest.cs index 7752928577..acea418e73 100644 --- a/OpenRA.FileFormats/Manifest.cs +++ b/OpenRA.FileFormats/Manifest.cs @@ -20,7 +20,7 @@ namespace OpenRA.FileFormats public readonly string[] Mods, Folders, Packages, Rules, ServerTraits, Sequences, Cursors, Chrome, Assemblies, ChromeLayout, - Weapons, Voices, Music, Movies, TileSets, ChromeMetrics; + Weapons, Voices, Notifications, Music, Movies, TileSets, ChromeMetrics; public readonly MiniYaml LoadScreen; public readonly Dictionary> Fonts; public readonly int TileSize = 24; @@ -44,6 +44,7 @@ namespace OpenRA.FileFormats ChromeLayout = YamlList(yaml, "ChromeLayout"); Weapons = YamlList(yaml, "Weapons"); Voices = YamlList(yaml, "Voices"); + Notifications = YamlList(yaml, "Notifications"); Music = YamlList(yaml, "Music"); Movies = YamlList(yaml, "Movies"); TileSets = YamlList(yaml, "TileSets"); diff --git a/OpenRA.Game/GameRules/Rules.cs b/OpenRA.Game/GameRules/Rules.cs index 020174334b..bf0d6fd4d5 100755 --- a/OpenRA.Game/GameRules/Rules.cs +++ b/OpenRA.Game/GameRules/Rules.cs @@ -20,7 +20,8 @@ namespace OpenRA { public static Dictionary Info; public static Dictionary Weapons; - public static Dictionary Voices; + public static Dictionary Voices; + public static Dictionary Notifications; public static Dictionary Music; public static Dictionary Movies; public static Dictionary TileSets; @@ -30,7 +31,8 @@ namespace OpenRA // Added support to extend the list of rules (add it to m.LocalRules) Info = LoadYamlRules(m.Rules, map.Rules, (k, y) => new ActorInfo(k.Key.ToLowerInvariant(), k.Value, y)); Weapons = LoadYamlRules(m.Weapons, map.Weapons, (k, _) => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value)); - Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new VoiceInfo(k.Value)); + Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new SoundInfo(k.Value)); + Notifications = LoadYamlRules(m.Notifications, map.Notifications, (k, _) => new SoundInfo(k.Value)); Music = LoadYamlRules(m.Music, new List(), (k, _) => new MusicInfo(k.Key, k.Value)); Movies = LoadYamlRules(m.Movies, new List(), (k, v) => k.Value.Value); diff --git a/OpenRA.Game/GameRules/VoiceInfo.cs b/OpenRA.Game/GameRules/SoundInfo.cs similarity index 72% rename from OpenRA.Game/GameRules/VoiceInfo.cs rename to OpenRA.Game/GameRules/SoundInfo.cs index 17b85d87e7..4561bb6c68 100644 --- a/OpenRA.Game/GameRules/VoiceInfo.cs +++ b/OpenRA.Game/GameRules/SoundInfo.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#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 @@ -15,11 +15,12 @@ using OpenRA.FileFormats; namespace OpenRA.GameRules { - public class VoiceInfo + public class SoundInfo { [FieldLoader.Ignore] public readonly Dictionary Variants; [FieldLoader.Ignore] public readonly Dictionary Prefixes; [FieldLoader.Ignore] public readonly Dictionary Voices; + [FieldLoader.Ignore] public readonly Dictionary Notifications; public readonly string DefaultVariant = ".aud" ; public readonly string DefaultPrefix = "" ; public readonly string[] DisableVariants = { }; @@ -34,31 +35,28 @@ namespace OpenRA.GameRules : new Dictionary(); } - public readonly OpenRA.FileFormats.Lazy> Pools; + public readonly OpenRA.FileFormats.Lazy> VoicePools; + public readonly OpenRA.FileFormats.Lazy> NotificationsPools; - public VoiceInfo( MiniYaml y ) + public SoundInfo( MiniYaml y ) { FieldLoader.Load( this, y ); Variants = Load(y, "Variants"); Prefixes = Load(y, "Prefixes"); Voices = Load(y, "Voices"); + Notifications = Load(y, "Notifications"); - if (!Voices.ContainsKey("Attack")) - Voices.Add("Attack", Voices["Move"]); - - if (!Voices.ContainsKey("AttackMove")) - Voices.Add("AttackMove", Voices["Move"]); - - Pools = Lazy.New(() => Voices.ToDictionary( a => a.Key, a => new VoicePool(a.Value) )); + VoicePools = Lazy.New(() => Voices.ToDictionary( a => a.Key, a => new SoundPool(a.Value) )); + NotificationsPools = Lazy.New(() => Notifications.ToDictionary( a => a.Key, a => new SoundPool(a.Value) )); } } - public class VoicePool + public class SoundPool { readonly string[] clips; readonly List liveclips = new List(); - public VoicePool(params string[] clips) + public SoundPool(params string[] clips) { this.clips = clips; } diff --git a/OpenRA.Game/Map.cs b/OpenRA.Game/Map.cs index dd342cf2bc..e60a4dbbc9 100644 --- a/OpenRA.Game/Map.cs +++ b/OpenRA.Game/Map.cs @@ -60,6 +60,7 @@ namespace OpenRA [FieldLoader.Ignore] public List Sequences = new List(); [FieldLoader.Ignore] public List Weapons = new List(); [FieldLoader.Ignore] public List Voices = new List(); + [FieldLoader.Ignore] public List Notifications = new List(); // Binary map data [FieldLoader.Ignore] public byte TileFormat = 1; @@ -150,6 +151,7 @@ namespace OpenRA Sequences = NodesOrEmpty(yaml, "Sequences"); Weapons = NodesOrEmpty(yaml, "Weapons"); Voices = NodesOrEmpty(yaml, "Voices"); + Notifications = NodesOrEmpty(yaml, "Notifications"); CustomTerrain = new string[MapSize.X, MapSize.Y]; @@ -204,6 +206,7 @@ namespace OpenRA root.Add(new MiniYamlNode("Sequences", null, Sequences)); root.Add(new MiniYamlNode("Weapons", null, Weapons)); root.Add(new MiniYamlNode("Voices", null, Voices)); + root.Add(new MiniYamlNode("Notifications", null, Notifications)); var entries = new Dictionary(); entries.Add("map.bin", SaveBinaryData()); diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 6743891fb9..d035a6cf58 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -94,7 +94,7 @@ - + diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 4eed1b1ade..248e451af3 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -90,11 +90,6 @@ namespace OpenRA } } - public void GiveAdvice(string advice) - { - Sound.PlayToPlayer(this, advice); - } - public Dictionary Stances = new Dictionary(); } } diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index 7adcd5aed0..4d2d5cca01 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -246,7 +246,45 @@ namespace OpenRA get { return (video != null) ? video.SeekPosition : 0; } } - // Returns true if it played a phrase + // Returns true if played successfully + public static bool PlayPredefined(Player p, Actor voicedUnit, string type, string definition, string variant) + { + if (definition == null) return false; + + var rules = (voicedUnit != null) ? Rules.Voices[type] : Rules.Notifications[type]; + + var ID = (voicedUnit != null) ? voicedUnit.ActorID : 0; + + var clip = (voicedUnit != null) ? rules.VoicePools.Value[definition].GetNext() : rules.NotificationsPools.Value[definition].GetNext(); + if (clip == null) return false; + + var suffix = rules.DefaultVariant; + var prefix = rules.DefaultPrefix; + + if (voicedUnit != null) + { + if (!rules.VoicePools.Value.ContainsKey("Attack")) + rules.VoicePools.Value.Add("Attack", rules.VoicePools.Value["Move"]); + + if (!rules.VoicePools.Value.ContainsKey("AttackMove")) + rules.VoicePools.Value.Add("AttackMove", rules.VoicePools.Value["Move"]); + } + + if (variant != null) + { + if (rules.Variants.ContainsKey(variant) && !rules.DisableVariants.Contains(definition)) + suffix = rules.Variants[variant][ID % rules.Variants[variant].Length]; + if (rules.Prefixes.ContainsKey(variant) && !rules.DisablePrefixes.Contains(definition)) + prefix = rules.Prefixes[variant][ID % rules.Prefixes[variant].Length]; + } + + if (p == null) + Play(prefix + clip + suffix); + else + PlayToPlayer(p, prefix + clip + suffix); + return true; + } + public static bool PlayVoice(string phrase, Actor voicedUnit, string variant) { if (voicedUnit == null) return false; @@ -256,21 +294,17 @@ namespace OpenRA if (mi == null) return false; if (mi.Voice == null) return false; - var vi = Rules.Voices[mi.Voice.ToLowerInvariant()]; + var type = mi.Voice.ToLowerInvariant(); - if (!vi.Pools.Value.ContainsKey(phrase)) - return false; + return PlayPredefined(null, voicedUnit, type, phrase, variant); + } - var clip = vi.Pools.Value[phrase].GetNext(); - if (clip == null) - return false; + public static bool PlayNotification(Player player, string type, string notification, string variant) + { + if (type == null) return false; + if (notification == null) return false; - var variantExt = (vi.Variants.ContainsKey(variant) && !vi.DisableVariants.Contains(phrase)) ? - vi.Variants[variant][voicedUnit.ActorID % vi.Variants[variant].Length] : vi.DefaultVariant; - var prefix = (vi.Prefixes.ContainsKey(variant) && !vi.DisablePrefixes.Contains(phrase)) ? - vi.Prefixes[variant][voicedUnit.ActorID % vi.Prefixes[variant].Length] : vi.DefaultPrefix; - Play(prefix + clip + variantExt); - return true; + return PlayPredefined(player, null, type.ToLowerInvariant(), notification, variant); } } diff --git a/OpenRA.Game/Traits/Player/EvaAlerts.cs b/OpenRA.Game/Traits/Player/EvaAlerts.cs deleted file mode 100644 index 8b4f51d206..0000000000 --- a/OpenRA.Game/Traits/Player/EvaAlerts.cs +++ /dev/null @@ -1,43 +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.Traits -{ - public class EvaAlertsInfo : TraitInfo - { - // Sound effects - public readonly string RadarUp = "radaron2.aud"; - public readonly string RadarDown = "radardn1.aud"; - - public readonly string CashTickUp = "cashup1.aud"; - public readonly string CashTickDown = "cashdn1.aud"; - - // Build Palette - public readonly string BuildingCannotPlaceAudio = "nodeply1.aud"; - public readonly string NewOptions = "newopt1.aud"; - - // For manual powerup/down in ra-ng - public readonly string DisablePower = "bleep11.aud"; - public readonly string EnablePower = "bleep12.aud"; - - // Eva speech - public readonly string Repairing = "repair1.aud"; - public readonly string LowPower = "lopower1.aud"; - public readonly string SilosNeeded = "silond1.aud"; - public readonly string PrimaryBuildingSelected = "pribldg1.aud"; - - // Special powers - public readonly string AbilityInsufficientPower = "nopowr1.aud"; - - public readonly string LevelUp = "hydrod1.aud"; - } - - public class EvaAlerts {} -} diff --git a/OpenRA.Game/Traits/Player/PlayerResources.cs b/OpenRA.Game/Traits/Player/PlayerResources.cs index c5af6d6362..aac361d748 100644 --- a/OpenRA.Game/Traits/Player/PlayerResources.cs +++ b/OpenRA.Game/Traits/Player/PlayerResources.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, @@ -136,8 +136,6 @@ namespace OpenRA.Traits public void Tick(Actor self) { - var eva = self.World.WorldActor.Info.Traits.Get(); - if(cashtickallowed > 0) { cashtickallowed = cashtickallowed - 1; } @@ -152,7 +150,7 @@ namespace OpenRA.Traits if (--nextSiloAdviceTime <= 0) { if (Ore > 0.8*OreCapacity) - Owner.GiveAdvice(eva.SilosNeeded); + Sound.PlayNotification(Owner, "Speech", "SilosNeeded", Owner.Country.Race); nextSiloAdviceTime = AdviceInterval; } @@ -192,21 +190,19 @@ namespace OpenRA.Traits public void playCashTickUp(Actor self) { - var eva = self.World.WorldActor.Info.Traits.Get(); if (Game.Settings.Sound.SoundCashTickType != SoundCashTicks.Disabled) { - Sound.PlayToPlayer(self.Owner, eva.CashTickUp); + Sound.PlayNotification(self.Owner, "Sounds", "CashTickUp", self.Owner.Country.Race); } } public void playCashTickDown(Actor self) { - var eva = self.World.WorldActor.Info.Traits.Get(); if ( Game.Settings.Sound.SoundCashTickType == SoundCashTicks.Extreme || (Game.Settings.Sound.SoundCashTickType == SoundCashTicks.Normal && cashtickallowed == 0) ) { - Sound.PlayToPlayer(self.Owner, eva.CashTickDown); + Sound.PlayNotification(self.Owner, "Sounds", "CashTickDown", self.Owner.Country.Race); cashtickallowed = 3; } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 5ef0602331..8143ddcb6b 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -54,6 +54,7 @@ namespace OpenRA.Traits public interface IResolveOrder { void ResolveOrder(Actor self, Order order); } public interface IValidateOrder { bool OrderValidation(OrderManager orderManager, World world, int clientId, Order order); } public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); } + public interface INotify { void Play(Player p, string notification); } public interface INotifySold { void Selling(Actor self); void Sold(Actor self); } public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); } public interface INotifyDamageStateChanged { void DamageStateChanged(Actor self, AttackInfo e); } diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index 5a4acdc6ce..4fc4e832cb 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -22,8 +22,6 @@ namespace OpenRA.Widgets public bool Depressed = false; public int VisualHeight = ChromeMetrics.Get("ButtonDepth"); public string Font = ChromeMetrics.Get("ButtonFont"); - public string ClickSound = null; - public string ClickDisabledSound = null; public bool Disabled = false; public Func GetText; public Func IsDisabled; @@ -73,10 +71,10 @@ namespace OpenRA.Widgets if (!IsDisabled()) { OnKeyPress(e); - Sound.Play(ClickSound); + Sound.PlayNotification(null, "Sounds", "ClickSound", null); } else - Sound.Play(ClickDisabledSound); + Sound.PlayNotification(null, "Sounds", "ClickDisabledSound", null); return true; } @@ -105,12 +103,12 @@ namespace OpenRA.Widgets { OnMouseDown(mi); Depressed = true; - Sound.Play(ClickSound); + Sound.PlayNotification(null, "Sounds", "ClickSound", null); } else { LoseFocus(mi); - Sound.Play(ClickDisabledSound); + Sound.PlayNotification(null, "Sounds", "ClickDisabledSound", null); } } else if (mi.Event == MouseInputEvent.Move && Focused) diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 53c442fa92..7769a698ab 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -121,7 +121,7 @@ namespace OpenRA return selectable != null && selectable.Voice != null; } - public static VoiceInfo GetVoice(this Actor a) + public static SoundInfo GetVoice(this Actor a) { var selectable = a.Info.Traits.GetOrDefault(); if (selectable == null) return null; diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs index cac9e11e6e..b83e0216d4 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions Action onQuit = () => { - Sound.Play("batlcon1.aud"); + Sound.PlayNotification(null, "Speech", "Leave", null); resumeDisabled = true; Game.RunAfterDelay(1200, () => mpe.Fade(CncMenuPaletteEffect.EffectType.Black)); Game.RunAfterDelay(1200 + 40 * mpe.Info.FadeLength, () => diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs index 10e3fb0090..a25fa0af3d 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionTabsWidget.cs @@ -61,8 +61,6 @@ namespace OpenRA.Mods.Cnc.Widgets class ProductionTabsWidget : Widget { public readonly string PaletteWidget = null; - public readonly string ClickSound = null; - public readonly string DisabledClickSound = null; public readonly float ScrollVelocity = 4f; public readonly int TabWidth = 30; public readonly int ArrowWidth = 20; @@ -248,9 +246,9 @@ namespace OpenRA.Mods.Cnc.Widgets if (leftPressed || rightPressed) { if ((leftPressed && !leftDisabled) || (rightPressed && !rightDisabled)) - Sound.Play(ClickSound); + Sound.PlayNotification(null, "Sounds", "ClickSound", null); else - Sound.Play(DisabledClickSound); + Sound.PlayNotification(null, "Sounds", "DisabledClickSound", null); } // Check production tabs @@ -258,7 +256,7 @@ namespace OpenRA.Mods.Cnc.Widgets if (offsetloc.X > 0 && offsetloc.X < ContentWidth) { CurrentQueue = Groups[queueGroup].Tabs[offsetloc.X/(TabWidth - 1)].Queue; - Sound.Play(ClickSound); + Sound.PlayNotification(null, "Sounds", "ClickSound", null); return true; } @@ -270,7 +268,7 @@ namespace OpenRA.Mods.Cnc.Widgets if (e.Event != KeyInputEvent.Down) return false; if (e.KeyName == "tab") { - Sound.Play(ClickSound); + Sound.PlayNotification(null, "Sounds", "ClickSound", null); SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift)); return true; } diff --git a/OpenRA.Mods.RA/Buildings/CanPowerDown.cs b/OpenRA.Mods.RA/Buildings/CanPowerDown.cs index 496b6e8c26..2e7372fe41 100755 --- a/OpenRA.Mods.RA/Buildings/CanPowerDown.cs +++ b/OpenRA.Mods.RA/Buildings/CanPowerDown.cs @@ -37,9 +37,7 @@ namespace OpenRA.Mods.RA.Buildings if (order.OrderString == "PowerDown") { disabled = !disabled; - var eva = self.World.WorldActor.Info.Traits.Get(); - Sound.PlayToPlayer(self.Owner, disabled ? eva.EnablePower : eva.DisablePower); - + Sound.PlayNotification(self.Owner, "Sounds", (disabled ? "EnablePower" : "DisablePower"), self.Owner.Country.Race); PowerManager.UpdateActor(self, disabled ? 0 : normalPower); if (disabled) diff --git a/OpenRA.Mods.RA/Buildings/PowerManager.cs b/OpenRA.Mods.RA/Buildings/PowerManager.cs index 3bbef31542..e1c1747f91 100755 --- a/OpenRA.Mods.RA/Buildings/PowerManager.cs +++ b/OpenRA.Mods.RA/Buildings/PowerManager.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, @@ -108,8 +108,7 @@ namespace OpenRA.Mods.RA.Buildings if (--nextPowerAdviceTime <= 0) { if (lowPower) - Player.GiveAdvice(Rules.Info["world"].Traits.Get().LowPower); - + Sound.PlayNotification(self.Owner, "Speech", "LowPower", self.Owner.Country.Race); nextPowerAdviceTime = Info.AdviceInterval; } } diff --git a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs index 7d131fec0a..1a905ac45f 100755 --- a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.RA.Buildings else { Repairer = p; - Sound.PlayToPlayer(Repairer, p.World.WorldActor.Info.Traits.Get().Repairing); + Sound.PlayNotification(Repairer, "Speech", "Repairing", self.Owner.Country.Race); self.World.AddFrameEndTask( w => w.Add(new RepairIndicator(self, p))); diff --git a/OpenRA.Mods.RA/ConquestVictoryConditions.cs b/OpenRA.Mods.RA/ConquestVictoryConditions.cs index 334562f751..173f162aae 100644 --- a/OpenRA.Mods.RA/ConquestVictoryConditions.cs +++ b/OpenRA.Mods.RA/ConquestVictoryConditions.cs @@ -15,10 +15,7 @@ namespace OpenRA.Mods.RA { public class ConquestVictoryConditionsInfo : ITraitInfo { - public string WinNotification = null; - public string LoseNotification = null; public int NotificationDelay = 1500; // Milliseconds - public readonly string Race = null; public object Create(ActorInitializer init) { return new ConquestVictoryConditions(this); } } @@ -55,7 +52,6 @@ namespace OpenRA.Mods.RA public void Lose(Actor self) { - if (Info.Race != null && Info.Race != self.Owner.Country.Race) return; if (self.Owner.WinState == WinState.Lost) return; self.Owner.WinState = WinState.Lost; @@ -70,14 +66,13 @@ namespace OpenRA.Mods.RA Game.RunAfterDelay(Info.NotificationDelay, () => { if (Game.IsCurrentWorld(self.World)) - Sound.Play(Info.LoseNotification); + Sound.PlayNotification(self.Owner, "Speech", "Lose", self.Owner.Country.Race); }); } } public void Win(Actor self) { - if (Info.Race != null && Info.Race != self.Owner.Country.Race) return; if (self.Owner.WinState == WinState.Won) return; self.Owner.WinState = WinState.Won; @@ -85,7 +80,7 @@ namespace OpenRA.Mods.RA if (self.Owner == self.World.LocalPlayer) { self.World.LocalShroud.Disabled = true; - Game.RunAfterDelay(Info.NotificationDelay, () => Sound.Play(Info.WinNotification)); + Game.RunAfterDelay(Info.NotificationDelay, () => Sound.PlayNotification(self.Owner, "Speech", "Win", self.Owner.Country.Race)); } } } diff --git a/OpenRA.Mods.RA/GainsExperience.cs b/OpenRA.Mods.RA/GainsExperience.cs index 45ef373575..a267df8ab9 100644 --- a/OpenRA.Mods.RA/GainsExperience.cs +++ b/OpenRA.Mods.RA/GainsExperience.cs @@ -77,8 +77,7 @@ namespace OpenRA.Mods.RA while (Level < MaxLevel && Experience >= Levels[Level]) { Level++; - var eva = self.World.WorldActor.Info.Traits.Get(); - Sound.PlayToPlayer(self.Owner, eva.LevelUp, self.CenterLocation); + Sound.PlayNotification(self.Owner, "Sounds", "LevelUp", self.Owner.Country.Race); self.World.AddFrameEndTask(w => w.Add(new CrateEffect(self, "levelup", new int2(0,-24)))); } } diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 5367ccc611..8864ae20ae 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -58,8 +58,7 @@ namespace OpenRA.Mods.RA.Orders if (!world.CanPlaceBuilding( Building, BuildingInfo, topLeft, null) || !BuildingInfo.IsCloseEnoughToBase(world, Producer.Owner, Building, topLeft)) { - var eva = world.WorldActor.Info.Traits.Get(); - Sound.Play(eva.BuildingCannotPlaceAudio); + Sound.PlayNotification(Producer.Owner, "Speech", "BuildingCannotPlaceAudio", Producer.Owner.Country.Race); yield break; } diff --git a/OpenRA.Mods.RA/Player/BaseAttackNotifier.cs b/OpenRA.Mods.RA/Player/BaseAttackNotifier.cs index d0b4ac68e7..a5495f6277 100644 --- a/OpenRA.Mods.RA/Player/BaseAttackNotifier.cs +++ b/OpenRA.Mods.RA/Player/BaseAttackNotifier.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, @@ -17,9 +17,7 @@ namespace OpenRA.Mods.RA { public class BaseAttackNotifierInfo : ITraitInfo { - public readonly int NotifyInterval = 30; /* seconds */ - public readonly string Audio = "baseatk1.aud"; - public readonly string Race = null; + public readonly int NotifyInterval = 30; // seconds public object Create(ActorInitializer init) { return new BaseAttackNotifier(this); } } @@ -35,17 +33,16 @@ namespace OpenRA.Mods.RA public void Damaged(Actor self, AttackInfo e) { - if (info.Race != null && info.Race != self.Owner.Country.Race) return; - /* only track last hit against our base */ + // only track last hit against our base if (!self.HasTrait()) return; - /* don't track self-damage */ + // don't track self-damage if (e.Attacker != null && e.Attacker.Owner == self.Owner) return; if (self.World.FrameNumber - lastAttackTime > info.NotifyInterval * 25) - Sound.PlayToPlayer(self.Owner, info.Audio); + Sound.PlayNotification(self.Owner, "Speech", "BaseAttack", self.Owner.Country.Race); lastAttackLocation = self.CenterLocation.ToCPos(); lastAttackTime = self.World.FrameNumber; diff --git a/OpenRA.Mods.RA/Player/HarvesterAttackNotifier.cs b/OpenRA.Mods.RA/Player/HarvesterAttackNotifier.cs new file mode 100644 index 0000000000..ac4e76df59 --- /dev/null +++ b/OpenRA.Mods.RA/Player/HarvesterAttackNotifier.cs @@ -0,0 +1,52 @@ +#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 OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Effects; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + public class HarvesterAttackNotifierInfo : ITraitInfo + { + public readonly int NotifyInterval = 30; // seconds + + public object Create(ActorInitializer init) { return new HarvesterAttackNotifier(this); } + } + + public class HarvesterAttackNotifier : INotifyDamage + { + HarvesterAttackNotifierInfo info; + + public int lastAttackTime = -1; + public CPos lastAttackLocation; + + public HarvesterAttackNotifier(HarvesterAttackNotifierInfo info) { this.info = info; } + + public void Damaged(Actor self, AttackInfo e) + { + // only track last hit against our base + if (!self.HasTrait()) + return; + + // don't track self-damage + if (e.Attacker != null && e.Attacker.Owner == self.Owner) + return; + + if (self.World.FrameNumber - lastAttackTime > info.NotifyInterval * 25) + Sound.PlayNotification(self.Owner, "Speech", "HarvesterAttack", self.Owner.Country.Race); + + lastAttackLocation = self.CenterLocation.ToCPos(); + lastAttackTime = self.World.FrameNumber; + } + } +} + diff --git a/OpenRA.Mods.RA/Player/PlaceBuilding.cs b/OpenRA.Mods.RA/Player/PlaceBuilding.cs index 4fdeaf0328..4405d6a8d8 100755 --- a/OpenRA.Mods.RA/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.RA/Player/PlaceBuilding.cs @@ -82,8 +82,7 @@ namespace OpenRA.Mods.RA if (GetNumBuildables(self.Owner) > prevItems) w.Add(new DelayedAction(10, - () => Sound.PlayToPlayer(order.Player, - w.WorldActor.Info.Traits.Get().NewOptions))); + () => Sound.PlayNotification(order.Player, "Speech", "NewOptions", order.Player.Country.Race))); }); } } diff --git a/OpenRA.Mods.RA/PrimaryBuilding.cs b/OpenRA.Mods.RA/PrimaryBuilding.cs index 85921f04b1..9e4b73bc51 100755 --- a/OpenRA.Mods.RA/PrimaryBuilding.cs +++ b/OpenRA.Mods.RA/PrimaryBuilding.cs @@ -66,8 +66,7 @@ namespace OpenRA.Mods.RA isPrimary = true; - var eva = self.World.WorldActor.Info.Traits.Get(); - Sound.PlayToPlayer(self.Owner, eva.PrimaryBuildingSelected); + Sound.PlayNotification(self.Owner, "Speech", "PrimaryBuildingSelected", self.Owner.Country.Race); } } diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 2c666164a4..8c2712e5a3 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -44,9 +44,6 @@ namespace OpenRA.Mods.RA.Widgets List>> tabs = new List>>(); Animation cantBuild; Animation clock; - public readonly string BuildPaletteOpen = "bleep13.aud"; - public readonly string BuildPaletteClose = "bleep13.aud"; - public readonly string TabClick = "ramenu1.aud"; readonly WorldRenderer worldRenderer; readonly World world; @@ -118,11 +115,11 @@ namespace OpenRA.Mods.RA.Widgets // Play palette-open sound at the start of the activate anim (open) if (paletteAnimationFrame == 1 && paletteOpen) - Sound.Play(BuildPaletteOpen); + Sound.PlayNotification(null, "Sounds", "BuildPaletteOpen", null); // Play palette-close sound at the start of the activate anim (close) if (paletteAnimationFrame == paletteAnimationLength + -1 && !paletteOpen) - Sound.Play(BuildPaletteClose); + Sound.PlayNotification(null, "Sounds", "BuildPaletteClose", null); // Animation is complete if ((paletteAnimationFrame == 0 && !paletteOpen) @@ -291,7 +288,7 @@ namespace OpenRA.Mods.RA.Widgets Action HandleClick(string name, World world) { return mi => { - Sound.Play(TabClick); + Sound.PlayNotification(null, "Sounds", "TabClick", null); if (name != null) HandleBuildPalette(world, name, (mi.Button == MouseButton.Left)); @@ -304,7 +301,7 @@ namespace OpenRA.Mods.RA.Widgets if (mi.Button != MouseButton.Left) return; - Sound.Play(TabClick); + Sound.PlayNotification(null, "Sounds", "TabClick", null); var wasOpen = paletteOpen; paletteOpen = (CurrentQueue == queue && wasOpen) ? false : true; CurrentQueue = queue; @@ -496,7 +493,7 @@ namespace OpenRA.Mods.RA.Widgets if ( toBuild != null ) { - Sound.Play(TabClick); + Sound.PlayNotification(null, "Sounds", "TabClick", null); HandleBuildPalette(world, toBuild.Name, true); return true; } diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs index b9e17cfb6d..c54ba06f9a 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic }; cheatsButton.IsVisible = () => world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats; - optionsBG.Get("DISCONNECT").OnClick = () => LeaveGame(optionsBG); + optionsBG.Get("DISCONNECT").OnClick = () => LeaveGame(optionsBG, world); optionsBG.Get("SETTINGS").OnClick = () => Ui.OpenWindow("SETTINGS_MENU"); optionsBG.Get("MUSIC").OnClick = () => Ui.OpenWindow("MUSIC_MENU"); @@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var postGameObserve = postgameBG.Get("POSTGAME_OBSERVE"); var postgameQuit = postgameBG.Get("POSTGAME_QUIT"); - postgameQuit.OnClick = () => LeaveGame(postgameQuit); + postgameQuit.OnClick = () => LeaveGame(postgameQuit, world); postGameObserve.OnClick = () => postgameQuit.Visible = false; postGameObserve.IsVisible = () => world.LocalPlayer.WinState != WinState.Won; @@ -76,8 +76,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic }; } - void LeaveGame(Widget pane) + void LeaveGame(Widget pane, World world) { + Sound.PlayNotification(null, "Speech", "Leave", world.LocalPlayer.Country.Race); pane.Visible = false; Game.Disconnect(); Game.LoadShellMap(); diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index f10f9bc0d7..2c9ab8136b 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -237,7 +237,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic chatPanel.AddChild(template); chatPanel.ScrollToBottom(); - Sound.Play("scold1.aud"); + Sound.PlayNotification(null, "Sounds", "ChatLine", null); } void UpdateCurrentMap() diff --git a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs index a9af7ada3f..9505c29cb4 100755 --- a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs +++ b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs @@ -175,8 +175,7 @@ namespace OpenRA.Mods.RA.Widgets if (hasRadarNew != hasRadar) { radarAnimating = true; - var eva = Rules.Info["world"].Traits.Get(); - Sound.Play(hasRadarNew ? eva.RadarUp : eva.RadarDown); + Sound.PlayNotification(null, "Sounds", (hasRadarNew ? "RadarUp" : "RadarDown"), null); } hasRadar = hasRadarNew; diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index 6e25a16d36..d680ede48f 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -103,8 +103,6 @@ Container@PLAYER_WIDGETS: Font:Bold TooltipText: Menu TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -120,8 +118,6 @@ Container@PLAYER_WIDGETS: Font:Bold TooltipText: Sell TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -136,8 +132,6 @@ Container@PLAYER_WIDGETS: Font:Bold TooltipText: Repair TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -200,8 +194,6 @@ Container@PLAYER_WIDGETS: Key: q TooltipText: Buildings TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -214,8 +206,6 @@ Container@PLAYER_WIDGETS: Key: w TooltipText: Defense TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -228,8 +218,6 @@ Container@PLAYER_WIDGETS: Key: e TooltipText: Infantry TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -242,8 +230,6 @@ Container@PLAYER_WIDGETS: Key: r TooltipText: Vehicles TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -256,8 +242,6 @@ Container@PLAYER_WIDGETS: Key: t TooltipText: Aircraft TooltipContainer:TOOLTIP_CONTAINER - ClickSound:button.aud - ClickDisabledSound:scold2.aud Children: Image@ICON: X:7 @@ -265,8 +249,6 @@ Container@PLAYER_WIDGETS: ImageCollection:production-icons ProductionTabs@PRODUCTION_TABS: PaletteWidget:PRODUCTION_PALETTE - ClickSound:button.aud - DisabledClickSound:scold2.aud X:WINDOW_RIGHT - 204 Y:268 Width:194 @@ -274,8 +256,6 @@ Container@PLAYER_WIDGETS: ProductionPalette@PRODUCTION_PALETTE: X:WINDOW_RIGHT - 204 Y:287 - TabClick: button.aud - DisabledTabClick:scold2.aud TooltipContainer:TOOLTIP_CONTAINER Background@FMVPLAYER: Width:WINDOW_RIGHT diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index dbf297aeb9..a018bb46fd 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -90,6 +90,9 @@ Movies: Voices: mods/cnc/voices.yaml +Notifications: + mods/cnc/notifications.yaml + Music: mods/cnc/music.yaml diff --git a/mods/cnc/notifications.yaml b/mods/cnc/notifications.yaml new file mode 100644 index 0000000000..96665b28cc --- /dev/null +++ b/mods/cnc/notifications.yaml @@ -0,0 +1,26 @@ +Speech: + Notifications: + Repairing: repair1 + LowPower: lopower1 + SilosNeeded: silos1 + PrimaryBuildingSelected: pribldg1 + BuildingCannotPlaceAudio: deploy1 + NewOptions: newopt1 + AbilityInsufficientPower: nopower1 + Win: accom1 + Lose: fail1 + BaseAttack: baseatk1 + HarvesterAttack: + Leave: batlcon1 + +Sounds: + Notifications: + RadarUp: comcntr1 + RadarDown: powrdn1 + CashTickUp: + CashTickDown: + LevelUp: text2 + ChatLine: scold1 + TabClick: button + ClickSound: button + ClickDisabledSound: scold2 \ No newline at end of file diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index a38cafb269..99a95d595c 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -3,8 +3,6 @@ Player: TechTree: SupportPowerManager: ConquestVictoryConditions: - WinNotification:accom1.aud - LoseNotification:fail1.aud PowerManager: AllyRepair: PlayerResources: @@ -151,17 +149,6 @@ World: CreateMPPlayers: SpawnMPUnits: MPStartLocations: - EvaAlerts: - RadarUp: comcntr1.aud - RadarDown: powrdn1.aud - BuildingCannotPlaceAudio: deploy1.aud - CashTickUp: - CashTickDown: - LowPower: lopower1.aud - SilosNeeded: silos1.aud - PrimaryBuildingSelected: pribldg1.aud - AbilityInsufficientPower: nopower1.aud - LevelUp: text2.aud SpatialBins: BinSize: 4 Shroud: diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 93459d291d..9139eea7b0 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -13,14 +13,12 @@ # 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 -# R8 converter needs infantry/ornithocopter frame resorter # add grenade thrower # make sandworm behave like a moving anti-vehicle mine # add neutral buildings: emperor palace, fremen siech, smugglers factory # add deathhand missile (nuke) # maybe add ornithocopter strikes (they are currently directly contrallable units with non-reloading machine guns as in Dune II) # allow upgrades -# allow different EVA voices for each faction (currently Atreides only) # add muzzles and explosions (currently falls back to RA) # create a shellmap (currently just a blank placeholder) # rework chrome UI, dialoges, tabs @@ -32,4 +30,6 @@ # support patch 1.06 gamefiles: DATA.R8 has more frames and currently fails to extract, also featuring new terrain with white houses and new unit: grenade thrower # infantry-only areas (Rough) do not show the dark-green mouse cursor # put TilesetBuilder.Export into OpenRA.Utility to call the functions directly when extracting game-files (instead of opening a GUI) -# group number metrics are off \ No newline at end of file +# group number metrics are off +# add bibs +# building offsets wrong (worst for towers) \ No newline at end of file diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 61f3999380..2486b4ca85 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -71,6 +71,9 @@ Weapons: Voices: mods/d2k/voices.yaml +Notifications: + mods/d2k/notifications.yaml + TileSets: mods/d2k/tilesets/arrakis.yaml diff --git a/mods/d2k/notifications.yaml b/mods/d2k/notifications.yaml new file mode 100644 index 0000000000..e380106b80 --- /dev/null +++ b/mods/d2k/notifications.yaml @@ -0,0 +1,37 @@ +# requires Dune 2000/DATA/GAMESFX copied to ~/.openra/Content/d2k + +Speech: + DefaultVariant: .AUD + Prefixes: + atreides: AI_ + ordos: OI_ + harkonnen: HI_ + Notifications: + Repairing: MEND + BuildingCannotPlaceAudio: PLACE + LowPower: POWER + SilosNeeded: SILOS + PrimaryBuildingSelected: PRMRY + AbilityInsufficientPower: + NewOptions: NEWOP + Win: MWIN + Lose: MFAIL + BaseAttack: ATACK + HarvesterAttack: HATTK + Leave: ABORT + +Sounds: + Notifications: + RadarUp: MULTI1 + RadarDown: + DisablePower: POWRDN1 + EnablePower: POWRUP1 + CashTickUp: CASHTIK1 + CashTickDown:CASHTIK1 + LevelUp: SCORTIK1 + ChatLine: CHAT1 + BuildPaletteOpen: BUTTON1 + BuildPaletteClose: BUTTON1 + TabClick: SIDEBAR1 + ClickSound: BUTTON1 + ClickDisabledSound: ENDLIST1 \ No newline at end of file diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 16a55f9f57..0a190450dd 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -2,18 +2,7 @@ Player: TechTree: PlaceBuilding: SupportPowerManager: - ConquestVictoryConditions@Atreides: - Race: atreides - WinNotification: AI_MWIN.AUD - LoseNotification: AI_MFAIL.AUD - ConquestVictoryConditions@Harkonnen: - Race: harkonnen - WinNotification: HI_MWIN.AUD - LoseNotification: HI_MFAIL.AUD - ConquestVictoryConditions@Ordos: - Race: ordos - WinNotification: OI_MWIN.AUD - LoseNotification: OI_MFAIL.AUD + ConquestVictoryConditions: PowerManager: AllyRepair: PlayerResources: @@ -65,15 +54,8 @@ Player: PlayerColorPalette: BasePalette: d2k RemapIndex: 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 - BaseAttackNotifier@Atreides: - Race: atreides - Audio: AI_ATACK.AUD - BaseAttackNotifier@Harkonnen: - Race: harkonnen - Audio: HI_ATACK.AUD - BaseAttackNotifier@Ordos: - Race: ordos - Audio: OI_ATACK.AUD + BaseAttackNotifier: + HarvesterAttackNotifier: World: OpenWidgetAtGameStart: @@ -179,25 +161,12 @@ World: SpawnMPUnits@ordos: InitialUnit: mcvo Faction: ordos -#TODO: These are just the Atreides sounds. - EvaAlerts: - RadarUp: POWRUP1.aud - RadarDown: POWRDN1.aud - BuildingCannotPlaceAudio: AI_PLACE.AUD - CashTickUp: CASHTIK1.aud - CashTickDown:CASHTIK1.aud - NewOptions: AI_NEWOP.AUD - LowPower: AI_POWER.AUD - SilosNeeded: AI_SILOS.AUD - PrimaryBuildingSelected: AI_PRMRY.AUD - AbilityInsufficientPower: - LevelUp: SCORTIK1.aud - Repairing: SpatialBins: BinSize: 4 Shroud: PathFinder: ValidateOrder: + CRATE: Tooltip: Name: Crate diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index d1c0b7934f..2da74ea1d9 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -46,7 +46,7 @@ HARVESTER: Capacity: 20 Resources: Spice UnloadTicksPerBale: 1 - # How far away from our linked proc (refinery) to find resources (in cells): + # How far away from our linked refinery to find resources (in cells): SearchFromProcRadius: 24 # How far away from last harvest order location to find more resources (in cells): SearchFromOrderRadius: 12 diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 142c488fb7..541f24fbc1 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -70,6 +70,9 @@ Weapons: Voices: mods/ra/voices.yaml + +Notifications: + mods/ra/notifications.yaml TileSets: mods/ra/tilesets/snow.yaml diff --git a/mods/ra/notifications.yaml b/mods/ra/notifications.yaml new file mode 100644 index 0000000000..1d91e750e7 --- /dev/null +++ b/mods/ra/notifications.yaml @@ -0,0 +1,30 @@ +Speech: + Notifications: + Repairing: repair1 + LowPower: lopower1 + SilosNeeded: silond1 + PrimaryBuildingSelected: pribldg1 + BuildingCannotPlaceAudio: nodeply1 + NewOptions: newopt1 + AbilityInsufficientPower: nopowr1 + Win: misnwon1 + Lose: misnlst1 + BaseAttack: baseatk1 + HarvesterAttack: + Leave: bct1 + +Sounds: + Notifications: + RadarUp: radaron2 + RadarDown: radardn1 + CashTickUp: cashup1 + CashTickDown:cashdn1 + LevelUp: hydrod1 + DisablePower: bleep11 + EnablePower: bleep12 + ChatLine: scold1 + BuildPaletteOpen: bleep13 + BuildPaletteClose: bleep13 + TabClick: ramenu1 + ClickSound: + ClickDisabledSound: \ No newline at end of file diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml index 54ea9beac1..acc46c8213 100644 --- a/mods/ra/rules/system.yaml +++ b/mods/ra/rules/system.yaml @@ -31,8 +31,6 @@ Player: PlaceBuilding: SupportPowerManager: ConquestVictoryConditions: - WinNotification:misnwon1.aud - LoseNotification:misnlst1.aud PowerManager: AllyRepair: PlayerResources: @@ -293,7 +291,6 @@ World: CreateMPPlayers: MPStartLocations: SpawnMPUnits: - EvaAlerts: SpatialBins: BinSize: 4 Shroud: From 668138281968f2d5db59cfec0fe9a0eaa99914f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 20:47:56 +0200 Subject: [PATCH 21/36] unclock factory exits --- mods/d2k/rules/structures.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 8a175de16f..e73a024cd3 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -266,8 +266,8 @@ -RenderBuilding: RallyPoint: Exit@1: - SpawnOffset: 10,0 - ExitCell: 1,3 + SpawnOffset: 5,0 + ExitCell: 1,1 Production: Produces: Vehicle PrimaryBuilding: @@ -302,9 +302,10 @@ Bib: -RenderBuilding: RallyPoint: + RallyPoint: 0,3 Exit@1: - SpawnOffset: 10,0 - ExitCell: 1,3 + SpawnOffset: -2,-2 + ExitCell: 0,2 Production: Produces: Vehicle PrimaryBuilding: From efe2f2e0431fa8ac156b9fd304f7ebc4ab800473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 23:18:46 +0200 Subject: [PATCH 22/36] UnloadCargo rallypoint fixes #2016 --- OpenRA.Mods.RA/Activities/UnloadCargo.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Activities/UnloadCargo.cs b/OpenRA.Mods.RA/Activities/UnloadCargo.cs index ae2e7bcd8a..dae7003881 100644 --- a/OpenRA.Mods.RA/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.RA/Activities/UnloadCargo.cs @@ -35,6 +35,19 @@ namespace OpenRA.Mods.RA.Activities return null; } + CPos? ChooseRallyPoint(Actor self) + { + var mobile = self.Trait(); + + for (var i = -1; i < 2; i++) + for (var j = -1; j < 2; j++) + if ((i != 0 || j != 0) && + mobile.CanEnterCell(self.Location + new CVec(i, j))) + return self.Location + new CVec(i, j); + + return self.Location; + } + public override Activity Tick(Actor self) { if (IsCanceled) return NextActivity; @@ -80,7 +93,10 @@ namespace OpenRA.Mods.RA.Activities actor.CancelActivity(); actor.QueueActivity(new Drag(currentPx, exitPx, length)); actor.QueueActivity(mobile.MoveTo(exitTile.Value, 0)); - actor.SetTargetLine(Target.FromCell(exitTile.Value), Color.Green, false); + + var rallyPoint = ChooseRallyPoint(actor).Value; + actor.QueueActivity(mobile.MoveTo(rallyPoint, 0)); + actor.SetTargetLine(Target.FromCell(rallyPoint), Color.Green, false); }); return this; From f5ba36a73560dd72b2d3eeb76f11b0d5f7fb6f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 23:18:46 +0200 Subject: [PATCH 23/36] Unload only 1 cargo per mouseclick, for more control --- OpenRA.Mods.RA/Activities/UnloadCargo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Activities/UnloadCargo.cs b/OpenRA.Mods.RA/Activities/UnloadCargo.cs index dae7003881..1615fce7cc 100644 --- a/OpenRA.Mods.RA/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.RA/Activities/UnloadCargo.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.RA.Activities actor.SetTargetLine(Target.FromCell(rallyPoint), Color.Green, false); }); - return this; + return NextActivity; } } } From 5a40c5df03ea65630d0a8cde971c9c8572a80761 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 18:08:10 +1200 Subject: [PATCH 24/36] tidy health transfer --- OpenRA.Mods.RA/Activities/Transform.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenRA.Mods.RA/Activities/Transform.cs b/OpenRA.Mods.RA/Activities/Transform.cs index 4641f91d40..5bba52cffa 100644 --- a/OpenRA.Mods.RA/Activities/Transform.cs +++ b/OpenRA.Mods.RA/Activities/Transform.cs @@ -52,11 +52,11 @@ namespace OpenRA.Mods.RA.Activities var health = self.TraitOrDefault(); if (health != null) { - // TODO: Fix bogus health init - if (ForceHealthPercentage > 0) - init.Add( new HealthInit( ForceHealthPercentage * 1f / 100 )); - else - init.Add( new HealthInit( (float)health.HP / health.MaxHP )); + var newHP = (ForceHealthPercentage > 0) + ? ForceHealthPercentage / 100f + : (float)health.HP / health.MaxHP; + + init.Add( new HealthInit(newHP) ); } var cargo = self.TraitOrDefault(); From d0548d676682f7190a39a98c19bbacb6ee8fc9eb Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 18:10:17 +1200 Subject: [PATCH 25/36] Drop EvaAlerts from OpenRA.Game.csproj --- OpenRA.Game/OpenRA.Game.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index d035a6cf58..1cb028b145 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -167,7 +167,6 @@ - @@ -261,4 +260,4 @@ --> - \ No newline at end of file + From c2029e9d5ca8e5ec3504efc50fcb6a17ce3bd0c2 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 18:22:19 +1200 Subject: [PATCH 26/36] fixed #2166 - filtering of passengers to show with RenderCargo --- OpenRA.Mods.Cnc/RenderCargo.cs | 8 +++++++- OpenRA.Mods.RA/Passenger.cs | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.Cnc/RenderCargo.cs b/OpenRA.Mods.Cnc/RenderCargo.cs index fa38c27d09..9e5101f41b 100644 --- a/OpenRA.Mods.Cnc/RenderCargo.cs +++ b/OpenRA.Mods.Cnc/RenderCargo.cs @@ -19,6 +19,7 @@ namespace OpenRA.Mods.Cnc { /* altitude of the cargo, relative to us. -ve is underneath us */ public readonly int RelativeAltitude = 0; + public readonly string[] PassengerTypes; public object Create(ActorInitializer init) { return new RenderCargo(init.self, this); } } @@ -49,7 +50,12 @@ namespace OpenRA.Mods.Cnc cargoFacing.Facing = facing.Facing; } - return r.Concat(cargo.Passengers.SelectMany(a => a.Render()) + var visiblePassengers = (Info.PassengerTypes != null && Info.PassengerTypes.Length > 0) + ? cargo.Passengers.Where(p => + Info.PassengerTypes.Contains(p.Trait().info.CargoType)) + : cargo.Passengers; + + return r.Concat(visiblePassengers.SelectMany(a => a.Render()) .Select(a => a.WithPos(a.Pos - new float2(0, Info.RelativeAltitude)) .WithZOffset(a.ZOffset + Info.RelativeAltitude))); } diff --git a/OpenRA.Mods.RA/Passenger.cs b/OpenRA.Mods.RA/Passenger.cs index d5cc9911fe..7a4c9fc6b8 100644 --- a/OpenRA.Mods.RA/Passenger.cs +++ b/OpenRA.Mods.RA/Passenger.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA public class Passenger : IIssueOrder, IResolveOrder, IOrderVoice { - readonly PassengerInfo info; + public readonly PassengerInfo info; public Passenger( PassengerInfo info ) { this.info = info; } public IEnumerable Orders From 61c393234072d65c5e19023a57949e70482128dc Mon Sep 17 00:00:00 2001 From: Curtis Shmyr Date: Sat, 30 Jun 2012 22:31:32 -0600 Subject: [PATCH 27/36] Selection tool / copy paste for editor --- OpenRA.Editor/Form1.Designer.cs | 30 ++++++++- OpenRA.Editor/Form1.cs | 5 ++ OpenRA.Editor/Form1.resx | 73 +++++++++++---------- OpenRA.Editor/Surface.cs | 108 ++++++++++++++++++++++++++++++-- 4 files changed, 172 insertions(+), 44 deletions(-) diff --git a/OpenRA.Editor/Form1.Designer.cs b/OpenRA.Editor/Form1.Designer.cs index 82f7f76bbe..854561d7d7 100755 --- a/OpenRA.Editor/Form1.Designer.cs +++ b/OpenRA.Editor/Form1.Designer.cs @@ -82,6 +82,9 @@ namespace OpenRA.Editor this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.toolStripStatusLabelFiller = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabelMousePosition = new System.Windows.Forms.ToolStripStatusLabel(); + this.copySelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); @@ -417,8 +420,11 @@ namespace OpenRA.Editor this.resizeToolStripMenuItem, this.showActorNamesToolStripMenuItem, this.showGridToolStripMenuItem, + this.toolStripSeparator5, this.fixOpenAreasToolStripMenuItem, - this.setupDefaultPlayersMenuItem}); + this.setupDefaultPlayersMenuItem, + this.toolStripSeparator4, + this.copySelectionToolStripMenuItem}); this.mapToolStripMenuItem.Name = "mapToolStripMenuItem"; this.mapToolStripMenuItem.Size = new System.Drawing.Size(43, 23); this.mapToolStripMenuItem.Text = "&Map"; @@ -507,6 +513,23 @@ namespace OpenRA.Editor this.toolStripStatusLabelMousePosition.Size = new System.Drawing.Size(22, 17); this.toolStripStatusLabelMousePosition.Text = "0,0"; // + // copySelectionToolStripMenuItem + // + this.copySelectionToolStripMenuItem.Name = "copySelectionToolStripMenuItem"; + this.copySelectionToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.copySelectionToolStripMenuItem.Text = "Copy Selection"; + this.copySelectionToolStripMenuItem.Click += new System.EventHandler(this.copySelectionToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(182, 6); + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -520,9 +543,9 @@ namespace OpenRA.Editor this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "OpenRA Editor"; - this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnFormClosing); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); + this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp); this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.ResumeLayout(false); @@ -592,6 +615,9 @@ namespace OpenRA.Editor private System.Windows.Forms.Panel panel1; private System.Windows.Forms.FlowLayoutPanel actorPalette; private System.Windows.Forms.ComboBox actorOwnerChooser; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem copySelectionToolStripMenuItem; } } diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 53351cb450..4eda4f950e 100755 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -545,5 +545,10 @@ namespace OpenRA.Editor var player = actorOwnerChooser.SelectedItem as PlayerReference; surface1.NewActorOwner = player.Name; } + + private void copySelectionToolStripMenuItem_Click(object sender, EventArgs e) + { + surface1.CopySelection(); + } } } diff --git a/OpenRA.Editor/Form1.resx b/OpenRA.Editor/Form1.resx index e21860adab..9757275de8 100755 --- a/OpenRA.Editor/Form1.resx +++ b/OpenRA.Editor/Form1.resx @@ -120,13 +120,45 @@ 17, 17 - - 76, 17 - 198, 17 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACCklE + QVQ4T6WT30tTUQDHz39QD0UQSpAPIkgPyR60AiUiyoGBL4qZjOyt0tZP9tBDk1AsXIhj93ILdd27DPPH + 3VwrUrdK2ioJHAgVOdoPaQsarBg43L6ec+akuRsEPnw5D4fP5/vlXg4BQHaSf8LjjwdqaTA2cg+y1Ith + qxmi5Tas/SYWk+QRoPgmtNsLcPq7GYX8+XoTqaUL+KR2cAmDxeBgqeBv2NhWzwUFOBk4g5/zRxB3V8Es + 38AtbzuIw/0RLMrMeyhTs2CzGdRtaOTn1dajvLkAR9VKLNvLcHmoExddzSDKzAfkcjkkEtEiOLxoQpdB + z+Er7ScQUg/DL5TD2bsfl5oPoKWnCZ3jehDZGeAC1hwL3uXNs55Jep7Gis/AJWxyTeVe1FXvhq5qH6oP + 7nlw/NoxGByNIKPT77CezSEeD6Pn+jlEIiGk6X8N+F9zyfLYIZzUVUCwT0J36jy9yX83KjDq7zSADE8t + cGB7kpksFt76YDzbgMWVFLzBX0WCTcku8mjiTSm8lkUslcHnH2kK/+aw6k+UCJiESE+9XCApz2Gzu5Gk + sEVy4r6got82vRV5blVbIDyZ21rAZrPmL7w5P5s1KxQWXRFtgU15lV8ge2AbdXPY8pAuEIsXWJ6FtAVW + +SWSmXWssuZ4vnl+s5nNFl1hMLjP8U1bMGR/wS/+N9tf7o6eMpNtADko6xybtEXLAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAADLklE + QVQ4T3WS60/ScRjFf39CL3rR1ovurduWbbU2t7ZqdlkXt7Lrym6O1VoXcdYqQ54wKlGxABE1CzWF0nIm + lZcoTbyUNJFIzDJSJK+E0qy8wInvz+i2erazfd+cz3m+zw4nTS+FLOeZNim3Vp6UU5sqvf5MSZqnyjhV + pfKUvEx54kqp8rCkWHVQVKSJPHtbs+tUgSYiOicVAMfEqfR1dVFCGSqrX94cHQeN/aXhbyD3Zz91uf3U + 9tFHTQ4fzVtH9BOQVdKcW2F6/eKkWA1zcxu6vUAQMmCzk/3AErLtDyFrrY035z16T3PXin8B5LfqZE6P + HyZzKw5FX+Yh4XtjwZKZGV3lNPIkhhojplON3Uc3S9/Q7LDfADKtKYklMsgTkwV7joixKHQr2Nq2fSET + 5uQwqtsyjcot45R510ozV8f/2iAhsyolCNh9WIyFoRGYHbIGfYN+SVd7Nznzk8ll0FLzKxdZO3xkaOjG + GYUxcIIfRxSlPU4N/rn1fS8JJVlU1WCT3npggVLfAIWuHjJtNRIyjIhTPEKM7D6OSop4RcXpwZ2Wl11l + gHanmze/c36ioc8jyRlFjSzljxl2daI9Pwuv1Cnw9PRjZeQ1cCcSS68Fza6+IXL2fCG7w0ssmc3o2IR8 + gbc1PQU9NUp48sNRcUyAkPBL4AIlUbLk3gEvS6YXrW6p0dx9UZ5n4gHjzBmYAAPPYwRwazeiMXYWqjcs + wLSVInAHRYWq0TEf9Q+NUEsg+fr9t2nF1U71leyqn+u3vPuIl2298HZ2wnxkO5q2LYOtxoKpK86D23tW + r+7zfCVzywAVGT/QVV2LvNDo0Eo0j3mAtbUTiRnFOJ94Axp9LfIKK5Ctq0RDmw9TQuPAsW7bHYNUYLCQ + JL2GRAqjtMDYwV+8wzUAWeY9eIfHYW0fxNodxyGWZeOSPBvzl27C5OXnwG0T5irmr79wgdWTNYyVJFL8 + kAeo8wyBA/rx2jGErBIH0nXPsWmPEHcM9YgURGPS0jMTZfiXGKDfM4Y0fVOgA/UgRQWECTpExaqxUyDF + wuUbJjb4H0AQfxtrDqiweLMUc8LEmLEqnv9zUMzM9B1/cM83lepxTAAAAABJRU5ErkJggg== + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -260,41 +292,6 @@ z2ki+Wo1CWklROkMCiT8wEm0kXEsCTmrAiTbDtcEpTVdZOS1oDfWk5xZ6RPeQZeUR8zxK0Qe1BO65xjr t0YotXhjAEAeQ7It8ZSESUjkznIq2bYsTGYW29JZxIs2nFEdLOSdfwFwpvLxRKIY2AAAAABJRU5ErkJg gg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAACCklE - QVQ4T6WT30tTUQDHz39QD0UQSpAPIkgPyR60AiUiyoGBL4qZjOyt0tZP9tBDk1AsXIhj93ILdd27DPPH - 3VwrUrdK2ioJHAgVOdoPaQsarBg43L6ec+akuRsEPnw5D4fP5/vlXg4BQHaSf8LjjwdqaTA2cg+y1Ith - qxmi5Tas/SYWk+QRoPgmtNsLcPq7GYX8+XoTqaUL+KR2cAmDxeBgqeBv2NhWzwUFOBk4g5/zRxB3V8Es - 38AtbzuIw/0RLMrMeyhTs2CzGdRtaOTn1dajvLkAR9VKLNvLcHmoExddzSDKzAfkcjkkEtEiOLxoQpdB - z+Er7ScQUg/DL5TD2bsfl5oPoKWnCZ3jehDZGeAC1hwL3uXNs55Jep7Gis/AJWxyTeVe1FXvhq5qH6oP - 7nlw/NoxGByNIKPT77CezSEeD6Pn+jlEIiGk6X8N+F9zyfLYIZzUVUCwT0J36jy9yX83KjDq7zSADE8t - cGB7kpksFt76YDzbgMWVFLzBX0WCTcku8mjiTSm8lkUslcHnH2kK/+aw6k+UCJiESE+9XCApz2Gzu5Gk - sEVy4r6got82vRV5blVbIDyZ21rAZrPmL7w5P5s1KxQWXRFtgU15lV8ge2AbdXPY8pAuEIsXWJ6FtAVW - +SWSmXWssuZ4vnl+s5nNFl1hMLjP8U1bMGR/wS/+N9tf7o6eMpNtADko6xybtEXLAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsMAAALDAE/QCLIAAADLklE - QVQ4T3WS60/ScRjFf39CL3rR1ovurduWbbU2t7ZqdlkXt7Lrym6O1VoXcdYqQ54wKlGxABE1CzWF0nIm - lZcoTbyUNJFIzDJSJK+E0qy8wInvz+i2erazfd+cz3m+zw4nTS+FLOeZNim3Vp6UU5sqvf5MSZqnyjhV - pfKUvEx54kqp8rCkWHVQVKSJPHtbs+tUgSYiOicVAMfEqfR1dVFCGSqrX94cHQeN/aXhbyD3Zz91uf3U - 9tFHTQ4fzVtH9BOQVdKcW2F6/eKkWA1zcxu6vUAQMmCzk/3AErLtDyFrrY035z16T3PXin8B5LfqZE6P - HyZzKw5FX+Yh4XtjwZKZGV3lNPIkhhojplON3Uc3S9/Q7LDfADKtKYklMsgTkwV7joixKHQr2Nq2fSET - 5uQwqtsyjcot45R510ozV8f/2iAhsyolCNh9WIyFoRGYHbIGfYN+SVd7Nznzk8ll0FLzKxdZO3xkaOjG - GYUxcIIfRxSlPU4N/rn1fS8JJVlU1WCT3npggVLfAIWuHjJtNRIyjIhTPEKM7D6OSop4RcXpwZ2Wl11l - gHanmze/c36ioc8jyRlFjSzljxl2daI9Pwuv1Cnw9PRjZeQ1cCcSS68Fza6+IXL2fCG7w0ssmc3o2IR8 - gbc1PQU9NUp48sNRcUyAkPBL4AIlUbLk3gEvS6YXrW6p0dx9UZ5n4gHjzBmYAAPPYwRwazeiMXYWqjcs - wLSVInAHRYWq0TEf9Q+NUEsg+fr9t2nF1U71leyqn+u3vPuIl2298HZ2wnxkO5q2LYOtxoKpK86D23tW - r+7zfCVzywAVGT/QVV2LvNDo0Eo0j3mAtbUTiRnFOJ94Axp9LfIKK5Ctq0RDmw9TQuPAsW7bHYNUYLCQ - JL2GRAqjtMDYwV+8wzUAWeY9eIfHYW0fxNodxyGWZeOSPBvzl27C5OXnwG0T5irmr79wgdWTNYyVJFL8 - kAeo8wyBA/rx2jGErBIH0nXPsWmPEHcM9YgURGPS0jMTZfiXGKDfM4Y0fVOgA/UgRQWECTpExaqxUyDF - wuUbJjb4H0AQfxtrDqiweLMUc8LEmLEqnv9zUMzM9B1/cM83lepxTAAAAABJRU5ErkJggg== diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index 9185036e87..65079e5041 100755 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -38,6 +38,12 @@ namespace OpenRA.Editor public bool ShowActorNames; public bool ShowGrid; + public bool IsPaste { get { return TileSelection != null && ResourceSelection != null; } } + public TileReference[,] TileSelection; + public TileReference[,] ResourceSelection; + public CPos SelectionStart; + public CPos SelectionEnd; + public string NewActorOwner; public event Action AfterChange = () => { }; @@ -59,7 +65,7 @@ namespace OpenRA.Editor Tool = null; } - public void SetTool(ITool tool) { Tool = tool; } + public void SetTool(ITool tool) { Tool = tool; ClearSelection(); } public void BindActorTemplates(IEnumerable templates) { @@ -83,6 +89,8 @@ namespace OpenRA.Editor UpdateStyles(); } + static readonly Pen SelectionPen = new Pen(Color.Blue); + static readonly Pen PastePen = new Pen(Color.Green); static readonly Pen CordonPen = new Pen(Color.Red); int2 MousePos; @@ -182,12 +190,20 @@ namespace OpenRA.Editor } AfterChange(); + ClearSelection(); } void Draw() { - if (Tool != null) Tool.Apply(this); - AfterChange(); + if (Tool != null) + { + Tool.Apply(this); + AfterChange(); + } + else if (IsPaste) + PasteSelection(); + else + SelectionEnd = GetBrushLocation(); } protected override void OnMouseDown(MouseEventArgs e) @@ -199,7 +215,11 @@ namespace OpenRA.Editor if (!IsPanning) { if (e.Button == MouseButtons.Right) Erase(); - if (e.Button == MouseButtons.Left) Draw(); + if (e.Button == MouseButtons.Left) + { + Draw(); + if (!IsPaste) SelectionStart = GetBrushLocation(); + } } Invalidate(); @@ -367,6 +387,25 @@ namespace OpenRA.Editor Map.Bounds.Width * TileSet.TileSize * Zoom, Map.Bounds.Height * TileSet.TileSize * Zoom); + e.Graphics.DrawRectangle(SelectionPen, + (SelectionStart.X * TileSet.TileSize * Zoom) + Offset.X, + (SelectionStart.Y * TileSet.TileSize * Zoom) + Offset.Y, + (SelectionEnd - SelectionStart).X * TileSet.TileSize * Zoom, + (SelectionEnd - SelectionStart).Y * TileSet.TileSize * Zoom); + + if (IsPaste) + { + var loc = GetBrushLocation(); + var width = Math.Abs((SelectionStart - SelectionEnd).X); + var height = Math.Abs((SelectionStart - SelectionEnd).Y); + + e.Graphics.DrawRectangle(PastePen, + (loc.X * TileSet.TileSize * Zoom) + Offset.X, + (loc.Y * TileSet.TileSize * Zoom) + Offset.Y, + width * (TileSet.TileSize * Zoom), + height * (TileSet.TileSize * Zoom)); + } + foreach (var ar in Map.Actors.Value) { if (ActorTemplates.ContainsKey(ar.Value.Type)) @@ -395,6 +434,67 @@ namespace OpenRA.Editor DrawActorBorder(e.Graphics, x.Value.Location(), ActorTemplates[x.Value.Type]); } } + + public void CopySelection() + { + // Grab tiles and resources within selection (doesn't do actors) + var start = SelectionStart; + var end = SelectionEnd; + + if (start == end) return; + + int width = Math.Abs((start - end).X); + int height = Math.Abs((start - end).Y); + + TileSelection = new TileReference[width, height]; + ResourceSelection = new TileReference[width, height]; + + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + //todo: crash prevention + TileSelection[x, y] = Map.MapTiles.Value[start.X + x, start.Y + y]; + ResourceSelection[x, y] = Map.MapResources.Value[start.X + x, start.Y + y]; + } + } + } + + void PasteSelection() + { + var loc = GetBrushLocation(); + var width = Math.Abs((SelectionStart - SelectionEnd).X); + var height = Math.Abs((SelectionStart - SelectionEnd).Y); + + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + var mapX = loc.X + x; + var mapY = loc.Y + y; + + //todo: crash prevention for outside of bounds + Map.MapTiles.Value[mapX, mapY] = TileSelection[x, y]; + Map.MapResources.Value[mapX, mapY] = ResourceSelection[x, y]; + + var ch = new int2(mapX / ChunkSize, mapY / ChunkSize); + if (Chunks.ContainsKey(ch)) + { + Chunks[ch].Dispose(); + Chunks.Remove(ch); + } + } + } + AfterChange(); + } + + void ClearSelection() + { + SelectionStart = CPos.Zero; + SelectionEnd = CPos.Zero; + TileSelection = null; + ResourceSelection = null; + } } static class ActorReferenceExts From b8a932a084d4947f35534f8b1b60cab06da3e2b2 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 18:31:46 +1200 Subject: [PATCH 28/36] try to make selection feel better --- OpenRA.Editor/Surface.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index 65079e5041..441a5c72dc 100755 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -203,7 +203,7 @@ namespace OpenRA.Editor else if (IsPaste) PasteSelection(); else - SelectionEnd = GetBrushLocation(); + SelectionEnd = GetBrushLocationBR(); } protected override void OnMouseDown(MouseEventArgs e) @@ -294,6 +294,14 @@ namespace OpenRA.Editor return new CPos(vX / TileSet.TileSize, vY / TileSet.TileSize); } + public CPos GetBrushLocationBR() + { + var vX = (int)Math.Floor((MousePos.X - Offset.X) / Zoom); + var vY = (int)Math.Floor((MousePos.Y - Offset.Y) / Zoom); + return new CPos((vX + TileSet.TileSize - 1) / TileSet.TileSize, + (vY + TileSet.TileSize - 1) / TileSet.TileSize); + } + public void DrawActor(SGraphics g, CPos p, ActorTemplate t, ColorPalette cp) { var centered = t.Appearance == null || !t.Appearance.RelativeToTopLeft; From 007b2c5434b04a66a84407dfeaecf15afa77de8c Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 18:37:46 +1200 Subject: [PATCH 29/36] make click-without-drag feel better in editor --- OpenRA.Editor/Surface.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index 441a5c72dc..c6e353d508 100755 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -218,7 +218,8 @@ namespace OpenRA.Editor if (e.Button == MouseButtons.Left) { Draw(); - if (!IsPaste) SelectionStart = GetBrushLocation(); + if (!IsPaste) + SelectionStart = SelectionEnd = GetBrushLocation(); } } From c75c72b5253e12c3cf3047ae653f0ecc329b8705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Tue, 26 Jun 2012 23:21:30 +0200 Subject: [PATCH 30/36] made palette shadowindex configurable --- OpenRA.Editor/Form1.cs | 3 +- OpenRA.FileFormats/Palette.cs | 18 +++++------- OpenRA.Game/Graphics/CursorProvider.cs | 13 +++++---- .../Widgets/Logic/D2kExtractGameFilesLogic.cs | 2 +- OpenRA.Mods.RA/PaletteFromCurrentTileset.cs | 6 ++-- OpenRA.Mods.RA/PaletteFromFile.cs | 6 ++-- OpenRA.TilesetBuilder/frmBuilder.cs | 4 ++- OpenRA.Utility/Command.cs | 28 ++++++++++++++----- OpenRA.Utility/Program.cs | 4 +-- doc/cnc extracted inirules link.txt | 1 - mods/cnc/rules/system.yaml | 4 +++ mods/d2k/cursors.yaml | 2 +- mods/d2k/rules/system.yaml | 4 +++ mods/ra/rules/system.yaml | 3 ++ 14 files changed, 62 insertions(+), 36 deletions(-) delete mode 100644 doc/cnc extracted inirules link.txt diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 4eda4f950e..d3353199df 100755 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -138,7 +138,8 @@ namespace OpenRA.Editor Rules.LoadRules(manifest, map); tileset = Rules.TileSets[map.Tileset]; tileset.LoadTiles(); - var palette = new Palette(FileSystem.Open(tileset.Palette), true); + int[] ShadowIndex = { 3, 4 }; + var palette = new Palette(FileSystem.Open(tileset.Palette), ShadowIndex); surface1.Bind(map, tileset, palette); // construct the palette of tiles diff --git a/OpenRA.FileFormats/Palette.cs b/OpenRA.FileFormats/Palette.cs index bf3bd46cd1..9b96021f6f 100644 --- a/OpenRA.FileFormats/Palette.cs +++ b/OpenRA.FileFormats/Palette.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, @@ -39,7 +39,7 @@ namespace OpenRA.FileFormats get { return colors; } } - public Palette(Stream s, bool remapTransparent) + public Palette(Stream s, int[] remapShadow) { colors = new uint[256]; @@ -54,13 +54,9 @@ namespace OpenRA.FileFormats } } - colors[0] = 0; - if (remapTransparent) - { - colors[1] = 178u << 24; // Hack for d2k; may have side effects - colors[3] = 178u << 24; - colors[4] = 140u << 24; - } + colors[0] = 0; //convert black background to transparency + foreach (int i in remapShadow) + colors[i] = 140u << 24; } public Palette(Palette p, IPaletteRemap r) @@ -92,12 +88,12 @@ namespace OpenRA.FileFormats return pal; } - public static Palette Load( string filename, bool remap ) + public static Palette Load(string filename, int[] remap) { using(var s = File.OpenRead(filename)) return new Palette(s, remap); } } - public interface IPaletteRemap { Color GetRemappedColor(Color original, int index); } + public interface IPaletteRemap { Color GetRemappedColor(Color original, int index); } } diff --git a/OpenRA.Game/Graphics/CursorProvider.cs b/OpenRA.Game/Graphics/CursorProvider.cs index 032ae22447..a0dc94b86d 100644 --- a/OpenRA.Game/Graphics/CursorProvider.cs +++ b/OpenRA.Game/Graphics/CursorProvider.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, @@ -25,13 +25,16 @@ namespace OpenRA.Graphics { cursors = new Dictionary(); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); - var transparent = false; + int[] ShadowIndex = { }; - if (sequences.NodesDict.ContainsKey("Transparent")) - transparent = true; + if (sequences.NodesDict.ContainsKey("ShadowIndex")) + { + Array.Resize(ref ShadowIndex, ShadowIndex.Length + 1); + ShadowIndex[ShadowIndex.Length - 1] = Convert.ToInt32(sequences.NodesDict["ShadowIndex"].Value); + } foreach (var s in sequences.NodesDict["Palettes"].Nodes) - Game.modData.Palette.AddPalette(s.Key, new Palette(FileSystem.Open(s.Value.Value), transparent)); + Game.modData.Palette.AddPalette(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex)); foreach (var s in sequences.NodesDict["Cursors"].Nodes) LoadSequencesForCursor(s.Key, s.Value); diff --git a/OpenRA.Mods.D2k/Widgets/Logic/D2kExtractGameFilesLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/D2kExtractGameFilesLogic.cs index 6b2a4edab5..f2a0609b47 100644 --- a/OpenRA.Mods.D2k/Widgets/Logic/D2kExtractGameFilesLogic.cs +++ b/OpenRA.Mods.D2k/Widgets/Logic/D2kExtractGameFilesLogic.cs @@ -267,7 +267,7 @@ namespace OpenRA.Mods.D2k.Widgets.Logic new string[] {"--r8", PathToDataR8, PathToPalette, "4463", "4477", Path.Combine(PathToSHPs, "craneo"), "--building"}, new string[] {"--r8", PathToDataR8, PathToPalette, "4760", "4819", Path.Combine(PathToSHPs, "windtrap_anim"), "--building"}, //? new string[] {"--r8", PathToDataR8, PathToPalette, "4820", "4840", Path.Combine(PathToSHPs, "missile_launch"), "--building"}, - new string[] {"--r8", Path.Combine(Platform.SupportDir, "Content/d2k/MOUSE.R8"), PathToPalette, "0", "264", Path.Combine(PathToSHPs, "mouse"), "--transparent"}, + new string[] {"--r8", Path.Combine(Platform.SupportDir, "Content/d2k/MOUSE.R8"), PathToPalette, "0", "264", Path.Combine(PathToSHPs, "mouse")}, new string[] {"--r8", Path.Combine(Platform.SupportDir, "Content/d2k/BLOXBASE.R8"), PathToPalette, "0", "799", Path.Combine(PathToTilesets, "BASE"), "--tileset"}, new string[] {"--r8", Path.Combine(Platform.SupportDir, "Content/d2k/BLOXBASE.R8"), PathToPalette, "748", "749", Path.Combine(PathToSHPs, "spice0")}, new string[] {"--r8", Path.Combine(Platform.SupportDir, "Content/d2k/BLOXBAT.R8"), PathToPalette, "0", "799", Path.Combine(PathToTilesets, "BAT"), "--tileset"}, diff --git a/OpenRA.Mods.RA/PaletteFromCurrentTileset.cs b/OpenRA.Mods.RA/PaletteFromCurrentTileset.cs index ab6db57594..f98af6175c 100644 --- a/OpenRA.Mods.RA/PaletteFromCurrentTileset.cs +++ b/OpenRA.Mods.RA/PaletteFromCurrentTileset.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, @@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA class PaletteFromCurrentTilesetInfo : ITraitInfo { public readonly string Name = null; - public readonly bool Transparent = true; + public readonly int[] ShadowIndex = { }; public object Create(ActorInitializer init) { return new PaletteFromCurrentTileset(init.world, this); } } @@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA public void InitPalette( OpenRA.Graphics.WorldRenderer wr ) { - wr.AddPalette( info.Name, new Palette( FileSystem.Open( world.TileSet.Palette ), info.Transparent ) ); + wr.AddPalette( info.Name, new Palette( FileSystem.Open( world.TileSet.Palette ), info.ShadowIndex ) ); } } } diff --git a/OpenRA.Mods.RA/PaletteFromFile.cs b/OpenRA.Mods.RA/PaletteFromFile.cs index 8ea64870b9..94706ea61e 100644 --- a/OpenRA.Mods.RA/PaletteFromFile.cs +++ b/OpenRA.Mods.RA/PaletteFromFile.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, @@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA public readonly string Name = null; public readonly string Tileset = null; public readonly string Filename = null; - public readonly bool Transparent = true; + public readonly int[] ShadowIndex = { }; public object Create(ActorInitializer init) { return new PaletteFromFile(init.world, this); } } @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA public void InitPalette( WorldRenderer wr ) { if( info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant() ) - wr.AddPalette( info.Name, new Palette( FileSystem.Open( info.Filename ), info.Transparent ) ); + wr.AddPalette( info.Name, new Palette( FileSystem.Open( info.Filename ), info.ShadowIndex ) ); } } } diff --git a/OpenRA.TilesetBuilder/frmBuilder.cs b/OpenRA.TilesetBuilder/frmBuilder.cs index b9d6c5eabe..bf85e2825d 100644 --- a/OpenRA.TilesetBuilder/frmBuilder.cs +++ b/OpenRA.TilesetBuilder/frmBuilder.cs @@ -56,9 +56,11 @@ namespace OpenRA.TilesetBuilder Bitmap rbitmap = fbitmap.Clone(new Rectangle(0, 0, fbitmap.Width, fbitmap.Height), fbitmap.PixelFormat); + int[] ShadowIndex = { }; + if (!PaletteFromImage) { - tpal = Palette.Load(PaletteFile, false); + tpal = Palette.Load(PaletteFile, ShadowIndex); rbitmap.Palette = tpal.AsSystemPalette(); } diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index 6857e757e6..725976ce01 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -81,8 +81,15 @@ namespace OpenRA.Utility var dest = Path.ChangeExtension(src, ".png"); var srcImage = ShpReader.Load(src); - var shouldRemap = args.Contains( "--transparent" ); - var palette = Palette.Load(args[2], shouldRemap); + int[] ShadowIndex = { }; + if (args.Contains("--noshadow")) + { + Array.Resize(ref ShadowIndex, ShadowIndex.Length + 3); + ShadowIndex[ShadowIndex.Length - 1] = 1; + ShadowIndex[ShadowIndex.Length - 2] = 3; + ShadowIndex[ShadowIndex.Length - 1] = 4; + } + var palette = Palette.Load(args[2], ShadowIndex); using (var bitmap = new Bitmap(srcImage.ImageCount * srcImage.Width, srcImage.Height, PixelFormat.Format8bppIndexed)) { @@ -110,8 +117,13 @@ 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); + int[] ShadowIndex = { }; + if (args.Contains("--noshadow")) + { + Array.Resize(ref ShadowIndex, ShadowIndex.Length + 1); + ShadowIndex[ShadowIndex.Length - 1] = 3; + } + var palette = Palette.Load(args[2], ShadowIndex); var startFrame = int.Parse(args[3]); var endFrame = int.Parse(args[4]) + 1; var filename = args[5]; @@ -319,6 +331,7 @@ namespace OpenRA.Utility var mods = args[1].Split(','); var theater = args[2]; var templateNames = args.Skip(3); + int[] ShadowIndex = { 3, 4 }; var manifest = new Manifest(mods); FileSystem.LoadFromManifest(manifest); @@ -330,7 +343,7 @@ namespace OpenRA.Utility throw new InvalidOperationException("No theater named '{0}'".F(theater)); tileset.LoadTiles(); - var palette = new Palette(FileSystem.Open(tileset.Palette), true); + var palette = new Palette(FileSystem.Open(tileset.Palette), ShadowIndex); foreach( var templateName in templateNames ) { @@ -413,14 +426,15 @@ namespace OpenRA.Utility var destPaletteInfo = Rules.Info["player"].Traits.Get(); int[] destRemapIndex = destPaletteInfo.RemapIndex; + int[] ShadowIndex = { }; // the remap range is always 16 entries, but their location and order changes for (var i = 0; i < 16; i++) remap[PlayerColorRemap.GetRemapIndex(srcRemapIndex, i)] = PlayerColorRemap.GetRemapIndex(destRemapIndex, i); // map everything else to the best match based on channel-wise distance - var srcPalette = Palette.Load(args[1].Split(':')[1], false); - var destPalette = Palette.Load(args[2].Split(':')[1], false); + var srcPalette = Palette.Load(args[1].Split(':')[1], ShadowIndex); + var destPalette = Palette.Load(args[2].Split(':')[1], ShadowIndex); var fullIndexRange = Exts.MakeArray(256, x => x); diff --git a/OpenRA.Utility/Program.cs b/OpenRA.Utility/Program.cs index d46783c004..b6cc18f8c0 100644 --- a/OpenRA.Utility/Program.cs +++ b/OpenRA.Utility/Program.cs @@ -57,11 +57,11 @@ namespace OpenRA.Utility 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(" --png SHPFILE PALETTE [--noshadow] Convert a SHP to a PNG containing all of its frames, optionally removing the shadow"); 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 START END FILENAME [--transparent] [--infrantry] [--vehicle] [--projectile] [--building] [--wall] [--tileset] Convert Dune 2000 DATA.R8 to PNGs choosing start- and endframe as well as type for correct offset to append multiple frames to one PNG named by filename optionally setting up transparency."); + Console.WriteLine(" --r8 R8FILE PALETTE START END FILENAME [--noshadow] [--infrantry] [--vehicle] [--projectile] [--building] [--wall] [--tileset] Convert Dune 2000 DATA.R8 to PNGs choosing start- and endframe as well as type for correct offset to append multiple frames to one PNG named by filename optionally removing the shadow."); Console.WriteLine(" --transpose SRCSHP DESTSHP START N M [START N M ...] Transpose the N*M block of frames starting at START."); } diff --git a/doc/cnc extracted inirules link.txt b/doc/cnc extracted inirules link.txt deleted file mode 100644 index 84788a199d..0000000000 --- a/doc/cnc extracted inirules link.txt +++ /dev/null @@ -1 +0,0 @@ -http://nyerguds.arsaneus-design.com/cnc95upd/inirules/ diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index 99a95d595c..1b5424fe86 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -68,14 +68,18 @@ World: Bridges: bridge1, bridge2, bridge3, bridge4 PaletteFromCurrentTileset@terrain: Name: terrain + ShadowIndex: 4 PaletteFromCurrentTileset@static: Name: staticterrain + ShadowIndex: 4 PaletteFromFile@chrome: Name: chrome Filename: temperat.pal + ShadowIndex: 3 PaletteFromFile@effect: Name: effect Filename: temperat.pal + ShadowIndex: 4 PaletteFromRGBA@shadow: Name: shadow R: 0 diff --git a/mods/d2k/cursors.yaml b/mods/d2k/cursors.yaml index eda2e1e1dc..51cc2e42ab 100644 --- a/mods/d2k/cursors.yaml +++ b/mods/d2k/cursors.yaml @@ -1,4 +1,4 @@ -Transparent: +ShadowIndex: 1 Palettes: cursor: cursor.pal diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 0a190450dd..15eb594d82 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -73,15 +73,19 @@ World: ValidGround: Sand, Dune, Rock PaletteFromCurrentTileset: Name: terrain + ShadowIndex: 1 PaletteFromFile@d2k: Name: d2k Filename: d2k.pal + ShadowIndex: 1 PaletteFromFile@chrome: Name: chrome Filename: d2k.pal + ShadowIndex: 3 PaletteFromFile@effect: Name: effect Filename: temperat.pal + ShadowIndex: 4 PaletteFromRGBA@shadow: Name: shadow R: 0 diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml index acc46c8213..349a0a6653 100644 --- a/mods/ra/rules/system.yaml +++ b/mods/ra/rules/system.yaml @@ -210,12 +210,15 @@ World: WaterChance: .2 PaletteFromCurrentTileset: Name: terrain + ShadowIndex: 4 PaletteFromFile@chrome: Name: chrome Filename: temperat.pal + ShadowIndex: 3 PaletteFromFile@effect: Name: effect Filename: temperat.pal + ShadowIndex: 4 PaletteFromRGBA@shadow: Name: shadow R: 0 From e0069fd62a30639c494a299db006afb2fd70cecb Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 19:45:31 +1200 Subject: [PATCH 31/36] make UnloadCargo.unloadAll configurable; go back to all by default --- OpenRA.Mods.RA/Activities/UnloadCargo.cs | 6 +++++- OpenRA.Mods.RA/Cargo.cs | 2 +- OpenRA.Mods.RA/Missions/Allies01Script.cs | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.RA/Activities/UnloadCargo.cs b/OpenRA.Mods.RA/Activities/UnloadCargo.cs index 1615fce7cc..0531a346da 100644 --- a/OpenRA.Mods.RA/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.RA/Activities/UnloadCargo.cs @@ -18,6 +18,10 @@ namespace OpenRA.Mods.RA.Activities { public class UnloadCargo : Activity { + bool unloadAll; + + public UnloadCargo(bool unloadAll) { this.unloadAll = unloadAll; } + CPos? ChooseExitTile(Actor self, Actor cargo) { // is anyone still hogging this tile? @@ -99,7 +103,7 @@ namespace OpenRA.Mods.RA.Activities actor.SetTargetLine(Target.FromCell(rallyPoint), Color.Green, false); }); - return NextActivity; + return unloadAll ? this : NextActivity; } } } diff --git a/OpenRA.Mods.RA/Cargo.cs b/OpenRA.Mods.RA/Cargo.cs index 64269e2cda..0dc2d1b816 100644 --- a/OpenRA.Mods.RA/Cargo.cs +++ b/OpenRA.Mods.RA/Cargo.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.RA return; self.CancelActivity(); - self.QueueActivity(new UnloadCargo()); + self.QueueActivity(new UnloadCargo(true)); } } diff --git a/OpenRA.Mods.RA/Missions/Allies01Script.cs b/OpenRA.Mods.RA/Missions/Allies01Script.cs index 16902b05db..2b80583674 100644 --- a/OpenRA.Mods.RA/Missions/Allies01Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies01Script.cs @@ -236,7 +236,7 @@ namespace OpenRA.Mods.RA.Missions chinook.QueueActivity(new HeliFly(insertionLZ.CenterLocation)); chinook.QueueActivity(new Turn(0)); chinook.QueueActivity(new HeliLand(true)); - chinook.QueueActivity(new UnloadCargo()); + chinook.QueueActivity(new UnloadCargo(true)); chinook.QueueActivity(new CallFunc(() => Sound.Play("laugh1.aud"))); chinook.QueueActivity(new Wait(150)); chinook.QueueActivity(new HeliFly(chinookExitPoint.CenterLocation)); From 4d614e912263878fbe4d847acf396cb4365b336d Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 20:00:12 +1200 Subject: [PATCH 32/36] include d2k mod in official packages --- packaging/linux/deb/DEBIAN/control | 2 +- packaging/package-all.sh | 4 +++- packaging/windows/OpenRA.nsi | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packaging/linux/deb/DEBIAN/control b/packaging/linux/deb/DEBIAN/control index b8dec8ad9e..4865d8731f 100644 --- a/packaging/linux/deb/DEBIAN/control +++ b/packaging/linux/deb/DEBIAN/control @@ -1,7 +1,7 @@ Package: openra Version: {VERSION} Architecture: all -Maintainer: Paul Chote +Maintainer: Chris Forbes Installed-Size: {SIZE} Depends: libopenal1, mono-runtime (>= 2.6.7), libmono-winforms2.0-cil, libfreetype6, libsdl1.2debian, libgl1-mesa-glx, libgl1-mesa-dri, libmono-i18n2.0-cil Section: games diff --git a/packaging/package-all.sh b/packaging/package-all.sh index 406af06711..b90b47e694 100755 --- a/packaging/package-all.sh +++ b/packaging/package-all.sh @@ -26,7 +26,7 @@ find . -path "*.mdb" -delete # they are now installed to the game directory instead of placed in the gac FILES="OpenRA.Game.exe OpenRA.Editor.exe OpenRA.Utility.exe OpenRA.Renderer.SdlCommon.dll OpenRA.Renderer.Cg.dll \ OpenRA.Renderer.Gl.dll OpenRA.Renderer.Null.dll OpenRA.FileFormats.dll FreeSans.ttf FreeSansBold.ttf titles.ttf \ -cg glsl mods/ra mods/cnc COPYING HACKING INSTALL CHANGELOG" +cg glsl mods/ra mods/cnc mods/d2k COPYING HACKING INSTALL CHANGELOG" echo "Copying files..." for i in $FILES; do @@ -45,6 +45,7 @@ cp OpenRA.Game/OpenRA.ico packaging/built # Update mod versions sed "s/{DEV_VERSION}/$TAG/" ./mods/ra/mod.yaml > ./packaging/built/mods/ra/mod.yaml sed "s/{DEV_VERSION}/$TAG/" ./mods/cnc/mod.yaml > ./packaging/built/mods/cnc/mod.yaml +sed "s/{DEV_VERSION}/$TAG/" ./mods/d2k/mod.yaml > ./packaging/built/mods/d2k/mod.yaml # Remove demo.mix from cnc rm ./packaging/built/mods/cnc/bits/demo.mix @@ -82,5 +83,6 @@ echo "Creating packages..." fi ) & wait +echo "Package build done." rm -rf $BUILTDIR diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi index 06206892bc..0f271c6118 100644 --- a/packaging/windows/OpenRA.nsi +++ b/packaging/windows/OpenRA.nsi @@ -148,6 +148,22 @@ SectionGroup /e "Mods" CopyFiles /SILENT "$TEMP\cnc-packages\*.mix" "$INSTDIR\mods\cnc\packages" RMDir /r "$TEMP\cnc-packages" SectionEnd + Section "Dune 2000" D2K + CreateDirectory "$TEMP\d2k-packages" + CopyFiles /SILENT "$INSTDIR\mods\d2k\packages\*.mix" "$TEMP\d2k-packages" + RMDir /r "$INSTDIR\mods\d2k" + SetOutPath "$INSTDIR\mods\d2k" + File "${SRCDIR}\mods\d2k\*.*" + File /r "${SRCDIR}\mods\d2k\maps" + File /r "${SRCDIR}\mods\d2k\chrome" + File /r "${SRCDIR}\mods\d2k\bits" + File /r "${SRCDIR}\mods\d2k\rules" + File /r "${SRCDIR}\mods\d2k\tilesets" + File /r "${SRCDIR}\mods\d2k\uibits" + CreateDirectory "$INSTDIR\mods\d2k\packages" + CopyFiles /SILENT "$TEMP\d2k-packages\*.mix" "$INSTDIR\mods\d2k\packages" + RMDir /r "$TEMP\d2k-packages" + SectionEnd SectionGroupEnd ;*************************** @@ -293,11 +309,13 @@ SectionEnd LangString DESC_Client ${LANG_ENGLISH} "OpenRA client and dependencies" LangString DESC_RA ${LANG_ENGLISH} "Base Red Alert mod" LangString DESC_CNC ${LANG_ENGLISH} "Base Command and Conquer mod" +LangString DESC_D2K ${LANG_ENGLISH} "Base Dune 2000 mod" !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${Client} $(DESC_Client) !insertmacro MUI_DESCRIPTION_TEXT ${RA} $(DESC_RA) !insertmacro MUI_DESCRIPTION_TEXT ${CNC} $(DESC_CNC) + !insertmacro MUI_DESCRIPTION_TEXT ${D2K} $(DESC_D2K) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;*************************** From 22a49ba7c635a1d2f6c18a7b8b2634f072e8ca03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 1 Jul 2012 09:41:02 +0200 Subject: [PATCH 33/36] added HarvesterAttackNotifier.cs to .csproj Conflicts: mods/d2k/rules/system.yaml --- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index cf6f8c3ed1..d1e0800e75 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -384,6 +384,7 @@ + From c2321e3eea81d9774b91ee1b1fc1a970024b0251 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Jul 2012 20:14:14 +1200 Subject: [PATCH 34/36] fixed #2284 - crash in upnp when device found but it doesnt want to talk upnp --- OpenRA.Game/Server/UPnP.cs | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/OpenRA.Game/Server/UPnP.cs b/OpenRA.Game/Server/UPnP.cs index 6b3e2ecdc4..06f68b07de 100644 --- a/OpenRA.Game/Server/UPnP.cs +++ b/OpenRA.Game/Server/UPnP.cs @@ -37,25 +37,33 @@ namespace UPnP DateTime start = DateTime.Now; - do + try { - s.SendTo(data, ipe); - - int length = 0; do { - length = s.Receive(buffer); - - string resp = Encoding.ASCII.GetString(buffer, 0, length).ToLower(); - if (resp.Contains("upnp:rootdevice")) + s.SendTo(data, ipe); + + int length = 0; + do { - resp = resp.Substring(resp.ToLower().IndexOf("location:") + 9); - resp = resp.Substring(0, resp.IndexOf("\r")).Trim(); - if (!string.IsNullOrEmpty(_serviceUrl = GetServiceUrl(resp))) - return true; - } - } while (length > 0); - } while ((start - DateTime.Now) < _timeout); + length = s.Receive(buffer); + + string resp = Encoding.ASCII.GetString(buffer, 0, length).ToLower(); + if (resp.Contains("upnp:rootdevice")) + { + resp = resp.Substring(resp.ToLower().IndexOf("location:") + 9); + resp = resp.Substring(0, resp.IndexOf("\r")).Trim(); + if (!string.IsNullOrEmpty(_serviceUrl = GetServiceUrl(resp))) + return true; + } + } while (length > 0); + } while ((start - DateTime.Now) < _timeout); + } + catch (Exception e) + { + OpenRA.Log.Write("server", "UPNP discover failed: {0}", e); + } + return false; } From e89ee2c13130682b4f05085d233fefe822be4297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 30 Jun 2012 17:06:29 +0200 Subject: [PATCH 35/36] new AttackLoyalty, range and stay alive option for Capture AttackLoyalty for d2k Deviator which captures units also shooting a fake missile (see issue #2251) CaptureActor now supports Generals styles gameplay but is disabled by default (see issue #2274) fixes the annoyance that engineers will not take the shortest root to the building by the way removing ProvidesCustomPrerequisite because it's tooltip messages relies on hardcoded hacks --- OpenRA.Mods.RA/Activities/CaptureActor.cs | 16 +++--- OpenRA.Mods.RA/Attack/AttackLoyalty.cs | 43 ++++++++++++++++ OpenRA.Mods.RA/Captures.cs | 17 ++++--- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + mods/d2k/TODO | 2 - mods/d2k/rules/aircraft.yaml | 6 +-- mods/d2k/rules/atreides.yaml | 54 ++++++++++++++++++++ mods/d2k/rules/harkonnen.yaml | 54 ++++++++++++++++++++ mods/d2k/rules/ordos.yaml | 60 +++++++++++++++++++++-- mods/d2k/rules/structures.yaml | 21 -------- mods/d2k/rules/system.yaml | 37 +++++++++++--- mods/d2k/rules/vehicles.yaml | 25 ++++------ mods/d2k/weapons.yaml | 42 +++++++--------- 13 files changed, 286 insertions(+), 92 deletions(-) create mode 100644 OpenRA.Mods.RA/Attack/AttackLoyalty.cs diff --git a/OpenRA.Mods.RA/Activities/CaptureActor.cs b/OpenRA.Mods.RA/Activities/CaptureActor.cs index dd22a4f412..cef8d7ef96 100644 --- a/OpenRA.Mods.RA/Activities/CaptureActor.cs +++ b/OpenRA.Mods.RA/Activities/CaptureActor.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, @@ -10,6 +10,7 @@ using System.Linq; using OpenRA.Traits; +using OpenRA.Mods.RA.Move; namespace OpenRA.Mods.RA.Activities { @@ -25,9 +26,6 @@ namespace OpenRA.Mods.RA.Activities if (target == null || !target.IsInWorld || target.IsDead()) return NextActivity; if (target.Owner == self.Owner) return NextActivity; - if( !target.OccupiesSpace.OccupiedCells().Any( x => x.First == self.Location ) ) - return NextActivity; - var capturable = target.TraitOrDefault(); if (capturable != null && capturable.CaptureInProgress && capturable.Captor.Owner.Stances[self.Owner] == Stance.Ally) return NextActivity; @@ -36,8 +34,14 @@ namespace OpenRA.Mods.RA.Activities if (sellable != null && sellable.Selling) return NextActivity; - target.Trait().BeginCapture(target, self); - self.World.AddFrameEndTask(w => self.Destroy()); + var captures = self.TraitOrDefault(); + var capturesInfo = self.Info.Traits.Get(); + if (captures != null && Combat.IsInRange(self.CenterLocation, capturesInfo.Range, target)) + target.Trait().BeginCapture(target, self); + else + return Util.SequenceActivities(self.Trait().MoveWithinRange(Target.FromActor(target), capturesInfo.Range), this); + if (capturesInfo != null && capturesInfo.wastedAfterwards) + self.World.AddFrameEndTask(w => self.Destroy()); return this; } diff --git a/OpenRA.Mods.RA/Attack/AttackLoyalty.cs b/OpenRA.Mods.RA/Attack/AttackLoyalty.cs new file mode 100644 index 0000000000..0b371cb4fa --- /dev/null +++ b/OpenRA.Mods.RA/Attack/AttackLoyalty.cs @@ -0,0 +1,43 @@ +#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 OpenRA.Traits; +using OpenRA.Mods.RA.Activities; + +namespace OpenRA.Mods.RA +{ + public class AttackLoyaltyInfo : AttackFrontalInfo + { + public override object Create(ActorInitializer init) { return new AttackLoyalty(init.self, this); } + } + + public class AttackLoyalty : AttackFrontal + { + public AttackLoyalty(Actor self, AttackLoyaltyInfo info) + : base( self, info ) {} + + public override void DoAttack(Actor self, Target target) + { + if (!CanAttack (self, target)) return; + + var weapon = Weapons[0].Info; + if (!Combat.IsInRange(self.CenterLocation, weapon.Range, target)) return; + + var move = self.TraitOrDefault(); + var facing = self.TraitOrDefault(); + foreach (var w in Weapons) + w.CheckFire(self, this, move, facing, target); + + if (target.Actor != null) + target.Actor.ChangeOwner(self.Owner); + } + } +} diff --git a/OpenRA.Mods.RA/Captures.cs b/OpenRA.Mods.RA/Captures.cs index 375a840a88..67b5ab18d0 100644 --- a/OpenRA.Mods.RA/Captures.cs +++ b/OpenRA.Mods.RA/Captures.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, @@ -22,6 +22,8 @@ namespace OpenRA.Mods.RA class CapturesInfo : ITraitInfo { public string[] CaptureTypes = {"building"}; + public int Range = 3; + public bool wastedAfterwards = true; public object Create(ActorInitializer init) { return new Captures(init.self, this); } } @@ -40,7 +42,7 @@ namespace OpenRA.Mods.RA { get { - yield return new CaptureOrderTargeter(Info.CaptureTypes, target => CanEnter(target)); + yield return new CaptureOrderTargeter(Info.CaptureTypes, target => CanCapture(target)); } } @@ -55,24 +57,23 @@ namespace OpenRA.Mods.RA public string VoicePhraseForOrder(Actor self, Order order) { return (order.OrderString == "CaptureActor" - && CanEnter(order.TargetActor)) ? "Attack" : null; + && CanCapture(order.TargetActor)) ? "Attack" : null; } public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "CaptureActor") { - if (!CanEnter(order.TargetActor)) return; + if (!CanCapture(order.TargetActor)) return; self.SetTargetLine(Target.FromOrder(order), Color.Red); self.CancelActivity(); - self.QueueActivity(new Enter(order.TargetActor)); self.QueueActivity(new CaptureActor(order.TargetActor)); } } - bool CanEnter(Actor target) + bool CanCapture(Actor target) { var c = target.TraitOrDefault(); return c != null && ( !c.CaptureInProgress || c.Captor.Owner.Stances[self.Owner] != Stance.Ally ); @@ -104,9 +105,11 @@ namespace OpenRA.Mods.RA IsQueued = forceQueued; + var Info = self.Info.Traits.Get(); + if (captureTypes.Contains(ci.Type)) { - cursor = useEnterCursor(target) ? "enter" : "enter-blocked"; + cursor = (Info.wastedAfterwards) ? (useEnterCursor(target) ? "enter" : "enter-blocked") : "attack"; return true; } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index d1e0800e75..c29ab2d9dd 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -127,6 +127,7 @@ + diff --git a/mods/d2k/TODO b/mods/d2k/TODO index 9139eea7b0..f54b90ba80 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -23,12 +23,10 @@ # create a shellmap (currently just a blank placeholder) # rework chrome UI, dialoges, tabs # add sonic tank weapon (currently uses tesla) -# make deviator change the allegiance of ememy units (currently shoots rockets) # starport prices should vary # black spots on buildings should be fading team colors # gamefile extraction (setup/setup.z) from CD fails # support patch 1.06 gamefiles: DATA.R8 has more frames and currently fails to extract, also featuring new terrain with white houses and new unit: grenade thrower -# infantry-only areas (Rough) do not show the dark-green mouse cursor # put TilesetBuilder.Export into OpenRA.Utility to call the functions directly when extracting game-files (instead of opening a GUI) # group number metrics are off # add bibs diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 85df0d311f..994a129961 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -1,16 +1,14 @@ -CARRYALL: +^CARRYALL: Inherits: ^Helicopter Buildable: Queue: Plane BuildPaletteOrder: 110 - Prerequisites: anyhightech - BuiltAt: hightecha - Owner: atreides,harkonnen,ordos Valued: Cost: 1200 Tooltip: Name: Carryall Description: Fast drop ship.\n Unarmed + Icon: carryallicon Health: HP: 500 Armor: diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml index 55296daf4e..4193c0c6fc 100644 --- a/mods/d2k/rules/atreides.yaml +++ b/mods/d2k/rules/atreides.yaml @@ -50,6 +50,60 @@ REFA: Owner: atreides RenderBuildingWarFactory: Image: REFA + FreeActor: + Actor: HARVESTERA + InitialActivity: FindResources + SpawnOffset: 1,2 + Facing: 64 + +HARVESTERA: + Inherits: ^HARVESTER + Buildable: + Prerequisites: heavya,refa + Owner: atreides + RenderUnit: + Image: HARVESTER + +TRIKEA: + Inherits: ^TRIKE + Buildable: + Prerequisites: lighta + Owner: atreides + RenderUnit: + Image: TRIKE + +QUADA: + Inherits: ^QUAD + Buildable: + Prerequisites: lighta + Owner: atreides + RenderUnit: + Image: QUAD + +SIEGETANKA: + Inherits: ^SIEGETANK + Buildable: + Prerequisites: heavya, radara + Owner: atreides + RenderUnit: + Image: SIEGETANK + +MISSILETANKA: + Inherits: ^MISSILETANK + Buildable: + Prerequisites: heavya + Owner: atreides + RenderUnit: + Image: MISSILETANK + +CARRYALLA: + Inherits: ^CARRYALL + Buildable: + Prerequisites: hightecha + BuiltAt: hightecha + Owner: atreides + RenderUnit: + Image: CARRYALL BARRA: Inherits: ^BARRACKS diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml index 4c75833e20..29fb303977 100644 --- a/mods/d2k/rules/harkonnen.yaml +++ b/mods/d2k/rules/harkonnen.yaml @@ -32,6 +32,60 @@ REFH: Owner: harkonnen RenderBuildingWarFactory: Image: REFH + FreeActor: + Actor: HARVESTERH + InitialActivity: FindResources + SpawnOffset: 1,2 + Facing: 64 + +HARVESTERH: + Inherits: ^HARVESTER + Buildable: + Prerequisites: heavyh,refh + Owner: harkonnen + RenderUnit: + Image: HARVESTER + +TRIKEH: + Inherits: ^TRIKE + Buildable: + Prerequisites: lighth + Owner: harkonnen + RenderUnit: + Image: TRIKE + +QUADH: + Inherits: ^QUAD + Buildable: + Prerequisites: lighth + Owner: harkonnen + RenderUnit: + Image: QUAD + +SIEGETANKH: + Inherits: ^SIEGETANK + Buildable: + Prerequisites: heavyh, radarh + Owner: harkonnen + RenderUnit: + Image: SIEGETANK + +MISSILETANKH: + Inherits: ^MISSILETANK + Buildable: + Prerequisites: heavyh + Owner: harkonnen + RenderUnit: + Image: MISSILETANK + +CARRYALLH: + Inherits: ^CARRYALL + Buildable: + Prerequisites: hightechh + BuiltAt: hightechh + Owner: harkonnen + RenderUnit: + Image: CARRYALL BARRH: Inherits: ^BARRACKS diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml index 633c51ea1e..7d82fcda3b 100644 --- a/mods/d2k/rules/ordos.yaml +++ b/mods/d2k/rules/ordos.yaml @@ -32,6 +32,11 @@ REFO: Owner: ordos RenderBuildingWarFactory: Image: REFO + FreeActor: + Actor: HARVESTERO + InitialActivity: FindResources + SpawnOffset: 1,2 + Facing: 64 BARRO: Inherits: ^BARRACKS @@ -160,6 +165,14 @@ MCVO: RenderUnit: Image: DMCV +HARVESTERO: + Inherits: ^HARVESTER + Buildable: + Prerequisites: heavyo,refo + Owner: ordos + RenderUnit: + Image: HARVESTER + COMBATO: Inherits: ^COMBAT Buildable: @@ -171,7 +184,7 @@ RAIDER: Buildable: Queue: Vehicle BuildPaletteOrder: 15 - Prerequisites: anylight + Prerequisites: lighto Owner: ordos Valued: Cost: 200 @@ -197,17 +210,50 @@ RAIDER: SecondaryOffset: 0,0,0,-4 AutoTarget: +QUADO: + Inherits: ^QUAD + Buildable: + Prerequisites: lighto + Owner: ordos + RenderUnit: + Image: QUAD + +SIEGETANKO: + Inherits: ^SIEGETANK + Buildable: + Prerequisites: heavyo, radaro + Owner: ordos + RenderUnit: + Image: SIEGETANK + +MISSILETANKO: + Inherits: ^MISSILETANK + Buildable: + Prerequisites: heavyo + Owner: ordos + RenderUnit: + Image: MISSILETANK + +CARRYALLO: + Inherits: ^CARRYALL + Buildable: + Prerequisites: hightecho + BuiltAt: hightecho + Owner: ordos + RenderUnit: + Image: CARRYALL + DEVIATORTANK: Inherits: ^Tank Valued: Cost: 800 Tooltip: Name: Deviator - Description: Long range artillery.\n Strong vs Infantry, Tanks, Air\n Weak vs Buildings + Description: Will cause no actual damage.\nFires a warhead which changes allegiances\n but does not effect buildings or tanks. Buildable: Queue: Vehicle BuildPaletteOrder: 50 - Prerequisites: anyheavy + Prerequisites: heavyo Owner: ordos Mobile: Speed: 6 @@ -218,8 +264,12 @@ DEVIATORTANK: RevealsShroud: Range: 6 RenderUnit: - AttackFrontal: - PrimaryWeapon: MammothTusk +# Captures: +# CaptureTypes: +# Range: 5 +# wastedAfterwards: false + AttackLoyalty: + PrimaryWeapon: FakeMissile PrimaryLocalOffset: -7,2,0,0,25, 7,2,0,0,-25 PrimaryRecoil: 1 AutoTarget: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index e73a024cd3..0bdda97453 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -41,8 +41,6 @@ Tooltip: Name: Windtrap Description: Provides power for other structures - ProvidesCustomPrerequisite: - Prerequisite: anypower Building: Power: 100 Footprint: xx xx xx @@ -60,7 +58,6 @@ Buildable: Queue: Building BuildPaletteOrder: 30 - Prerequisites: anypower Hotkey: b Valued: Cost: 400 @@ -104,8 +101,6 @@ Tooltip: Name: High Tech Factory Description: Produces Carryalls - ProvidesCustomPrerequisite: - Prerequisite: anyhightech Building: Power: -30 Footprint: _x_ xxx xxx @@ -180,9 +175,6 @@ Buildable: Queue: Building BuildPaletteOrder: 10 - Prerequisites: anypower - ProvidesCustomPrerequisite: - Prerequisite: anyref Valued: Cost: 1400 Tooltip: @@ -207,11 +199,6 @@ Capacity: 2000 CustomSellValue: Value: 600 - FreeActor: - Actor: HARVESTER - InitialActivity: FindResources - SpawnOffset: 1,2 - Facing: 64 ^SILO: Inherits: ^Building @@ -245,8 +232,6 @@ Buildable: Queue: Building BuildPaletteOrder: 50 - ProvidesCustomPrerequisite: - Prerequisite: anylight Valued: Cost: 1000 Tooltip: @@ -282,8 +267,6 @@ Buildable: Queue: Building BuildPaletteOrder: 50 - ProvidesCustomPrerequisite: - Prerequisite: anyheavy Valued: Cost: 2000 Tooltip: @@ -322,8 +305,6 @@ Buildable: Queue: Building BuildPaletteOrder: 60 - ProvidesCustomPrerequisite: - Prerequisite: anyradar Valued: Cost: 1400 Tooltip: @@ -349,8 +330,6 @@ Tooltip: Name: Starport Description: Provides a dropzone for vehicle reinforcements - ProvidesCustomPrerequisite: - Prerequisite: anystarport Buildable: Queue: Building BuildPaletteOrder: 60 diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 15eb594d82..c5c3df8814 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -207,21 +207,42 @@ CRATE: SelectionShares: 2 NoBaseSelectionShares: 9001 Unit: mcvo - GiveUnitCrateAction@Trike: + GiveUnitCrateAction@TrikeA: SelectionShares: 7 - Unit: trike - GiveUnitCrateAction@Quad: + Unit: trikea + GiveUnitCrateAction@TrikeH: + SelectionShares: 7 + Unit: trikeh + GiveUnitCrateAction@QuadA: SelectionShares: 6 - Unit: quad + Unit: quada + GiveUnitCrateAction@QuadH: + SelectionShares: 6 + Unit: quadh + GiveUnitCrateAction@QuadO: + SelectionShares: 6 + Unit: quado GiveUnitCrateAction@Raider: SelectionShares: 6 Unit: raider - GiveUnitCrateAction@SiegeTank: + GiveUnitCrateAction@SiegeTankA: SelectionShares: 6 - Unit: siegetank - GiveUnitCrateAction@MissileTank: + Unit: siegetanka + GiveUnitCrateAction@SiegeTankH: SelectionShares: 6 - Unit: missiletank + Unit: siegetankh + GiveUnitCrateAction@SiegeTankO: + SelectionShares: 6 + Unit: siegetanko + GiveUnitCrateAction@MissileTankA: + SelectionShares: 6 + Unit: missiletanka + GiveUnitCrateAction@MissileTankH: + SelectionShares: 6 + Unit: missiletankh + GiveUnitCrateAction@MissileTankO: + SelectionShares: 6 + Unit: missiletanko GiveUnitCrateAction@CombatA: SelectionShares: 5 Unit: combata diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 2da74ea1d9..0a690176b7 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -27,18 +27,17 @@ Transforms: TransformSounds: BUILD1.aud -HARVESTER: +^HARVESTER: Inherits: ^Vehicle Buildable: Queue: Vehicle BuildPaletteOrder: 10 - Prerequisites: anyref,anyheavy - Owner: atreides,harkonnen,ordos Valued: Cost: 1100 Tooltip: Name: Spice Harvester Description: Collects Spice for processing.\n Unarmed + Icon: harvestericon Selectable: Priority: 7 Bounds: 42,42 @@ -62,18 +61,17 @@ HARVESTER: Range: 4 -AttackMove: -TRIKE: +^TRIKE: Inherits: ^Vehicle Buildable: Queue: Vehicle BuildPaletteOrder: 15 - Prerequisites: anylight - Owner: atreides,harkonnen Valued: Cost: 200 Tooltip: Name: Scout Trike Description: Weak Scout.\n Decent vs. Infantry + Icon: trikeicon Selectable: Bounds: 24,24 Health: @@ -91,18 +89,17 @@ TRIKE: PrimaryOffset: 0,0,0,-4 AutoTarget: -QUAD: +^QUAD: Inherits: ^Vehicle Buildable: Queue: Vehicle BuildPaletteOrder: 30 - Prerequisites: anylight - Owner: atreides,harkonnen,ordos Valued: Cost: 400 Tooltip: Name: Quad Description: Fast scout vehicle, armed with \nrockets.\n Strong vs Vehicles\n Weak vs Infantry + Icon: quadicon Health: HP: 120 Armor: @@ -154,18 +151,17 @@ QUAD: Selectable: Bounds: 30,30 -SIEGETANK: +^SIEGETANK: Inherits: ^Tank Buildable: Queue: Vehicle BuildPaletteOrder: 80 - Prerequisites: anyradar - Owner: atreides,harkonnen,ordos Valued: Cost: 600 Tooltip: Name: Siege Tank Description: Long-range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft + Icon: siegetankicon Health: HP: 75 Armor: @@ -189,18 +185,17 @@ SIEGETANK: Selectable: Bounds: 30,30 -MISSILETANK: +^MISSILETANK: Inherits: ^Tank Valued: Cost: 800 Tooltip: Name: Missile Tank Description: Long range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft + Icon: missiletankicon Buildable: Queue: Vehicle BuildPaletteOrder: 50 - Prerequisites: anyheavy - Owner: atreides,harkonnen,ordos Mobile: Speed: 6 Health: diff --git a/mods/d2k/weapons.yaml b/mods/d2k/weapons.yaml index 6a8341c8c3..31c5dd4f3c 100644 --- a/mods/d2k/weapons.yaml +++ b/mods/d2k/weapons.yaml @@ -239,36 +239,30 @@ TowerMissle: SmudgeType: SandCrater, RockCrater Damage: 25 -MammothTusk: - ROF: 60 +FakeMissile: + ROF: 90 Range: 8 + Burst: 1 Report: MISSLE1 - Burst: 2 - ValidTargets: Ground, Air - Projectile: Missile - Speed: 30 - Arm: 2 + Projectile: Bullet + Speed: 35 High: true - Shadow: false - Proximity: true -# Trail: smokey - ContrailLength: 10 - Inaccuracy: 3 - Image: DRAGON - ROT: 5 - RangeLimit: 40 + Angle: .2 + Inaccuracy: 70 + Image: MISSILE + Trail: smokey + ContrailLength: 30 Warhead: - Spread: 6 + Spread: 10 Versus: - None: 90% - Wood: 75% - Light: 60% - Heavy: 25% - Explosion: med_explosion - WaterExplosion: med_splash - InfDeath: 2 + Wood: 0% + Heavy: 0% + Concrete: 0% + Explosion: large_explosion + WaterExplosion: large_splash SmudgeType: SandCrater, RockCrater - Damage: 45 + Damage: 0 + ImpactSound: kaboom12 155mm: ROF: 85 From 3dc39b2c9de9bdca56c60c84a038486bd73d1c07 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 2 Jul 2012 09:42:20 +1200 Subject: [PATCH 36/36] fixed #2167 -- silly inconsistency between InfDeath and dieN sequence numbering --- OpenRA.Game/GameRules/WeaponInfo.cs | 2 +- OpenRA.Mods.Cnc/SpawnViceroid.cs | 2 +- OpenRA.Mods.RA/Render/RenderInfantry.cs | 2 +- OpenRA.Mods.RA/TeslaInstantKills.cs | 2 +- mods/cnc/weapons.yaml | 78 +++++++++--------- mods/d2k/weapons.yaml | 58 ++++++------- mods/ra/weapons.yaml | 104 ++++++++++++------------ 7 files changed, 124 insertions(+), 124 deletions(-) diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index 1bc07ecd42..101e77aeec 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -26,7 +26,7 @@ namespace OpenRA.GameRules public readonly string WaterExplosion = null; // explosion effect on hitting water (usually a splash) public readonly string[] SmudgeType = { }; // type of smudge to apply public readonly int[] Size = { 0, 0 }; // size of the explosion. provide 2 values for a ring effect (outer/inner) - public readonly int InfDeath = 0; // infantry death animation to use + public readonly int InfDeath = 1; // infantry death animation to use public readonly string ImpactSound = null; // sound to play on impact public readonly string WaterImpactSound = null; // sound to play on impact with water public readonly int Damage = 0; // how much (raw) damage to deal diff --git a/OpenRA.Mods.Cnc/SpawnViceroid.cs b/OpenRA.Mods.Cnc/SpawnViceroid.cs index ffe3c8558f..b7f584abe2 100644 --- a/OpenRA.Mods.Cnc/SpawnViceroid.cs +++ b/OpenRA.Mods.Cnc/SpawnViceroid.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.Cnc [ActorReference] public readonly string ViceroidActor = "vice"; public readonly int Probability = 10; public readonly string Owner = "Creeps"; - public readonly int InfDeath = 5; + public readonly int InfDeath = 6; public object Create(ActorInitializer init) { return new SpawnViceroid(this); } } diff --git a/OpenRA.Mods.RA/Render/RenderInfantry.cs b/OpenRA.Mods.RA/Render/RenderInfantry.cs index f3cd34b495..bba5c0a611 100644 --- a/OpenRA.Mods.RA/Render/RenderInfantry.cs +++ b/OpenRA.Mods.RA/Render/RenderInfantry.cs @@ -127,7 +127,7 @@ namespace OpenRA.Mods.RA.Render self.World.AddFrameEndTask(w => { if (!self.Destroyed) - w.Add(new Corpse(self, "die{0}".F(e.Warhead.InfDeath + 1))); + w.Add(new Corpse(self, "die{0}".F(e.Warhead.InfDeath))); }); } } diff --git a/OpenRA.Mods.RA/TeslaInstantKills.cs b/OpenRA.Mods.RA/TeslaInstantKills.cs index df50b42947..57da307888 100755 --- a/OpenRA.Mods.RA/TeslaInstantKills.cs +++ b/OpenRA.Mods.RA/TeslaInstantKills.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA { public float GetDamageModifier(Actor attacker, WarheadInfo warhead ) { - if( warhead != null && warhead.InfDeath == 5 ) + if( warhead != null && warhead.InfDeath == 6 ) return 1000f; return 1f; } diff --git a/mods/cnc/weapons.yaml b/mods/cnc/weapons.yaml index a7e222c044..a010367eee 100644 --- a/mods/cnc/weapons.yaml +++ b/mods/cnc/weapons.yaml @@ -8,7 +8,7 @@ UnitExplode: Light: 60% Heavy: 25% Explosion: 8 - InfDeath: 3 + InfDeath: 4 ImpactSound: xplobig6 UnitExplodeSmall: @@ -21,7 +21,7 @@ UnitExplodeSmall: Light: 60% Heavy: 25% Explosion: 8 - InfDeath: 3 + InfDeath: 4 ImpactSound: xplos GrenadierExplode: @@ -34,7 +34,7 @@ GrenadierExplode: Light: 60% Heavy: 25% Explosion: 8 - InfDeath: 2 + InfDeath: 3 ImpactSound: xplos Atomic: @@ -48,7 +48,7 @@ Atomic: Light: 60% Heavy: 25% Explosion: 6 - InfDeath: 4 + InfDeath: 5 ImpactSound: nukexplo Warhead@areanuke: DamageModel: PerCell @@ -62,7 +62,7 @@ Atomic: Light: 60% Heavy: 25% Delay: 3 - InfDeath: 4 + InfDeath: 5 ImpactSound: xplobig4 IonCannon: @@ -75,7 +75,7 @@ IonCannon: Wood: 60% Light: 60% Heavy: 25% - InfDeath: 4 + InfDeath: 5 Warhead@area: DamageModel: PerCell Damage: 200 @@ -88,7 +88,7 @@ IonCannon: Light: 60% Heavy: 25% Delay: 3 - InfDeath: 4 + InfDeath: 5 Sniper: Report: RAMGUN2 @@ -104,7 +104,7 @@ Sniper: Wood: 5% Light: 5% Heavy: 5% - InfDeath: 1 + InfDeath: 2 HighV: ROF: 40 @@ -120,7 +120,7 @@ HighV: Wood: 50% Light: 50% Heavy: 25% - InfDeath: 1 + InfDeath: 2 Explosion: 1 HeliAGGun: @@ -140,7 +140,7 @@ HeliAGGun: Wood: 50% Light: 50% Heavy: 25% - InfDeath: 1 + InfDeath: 2 Explosion: 1 HeliAAGun: @@ -160,7 +160,7 @@ HeliAAGun: Wood: 50% Light: 50% Heavy: 25% - InfDeath: 1 + InfDeath: 2 Explosion: 1 Pistol: @@ -176,7 +176,7 @@ Pistol: Wood: 50% Light: 50% Heavy: 25% - InfDeath: 1 + InfDeath: 2 Explosion: 1 Damage: 1 @@ -194,7 +194,7 @@ M16: Light: 30% Heavy: 10% Explosion: 1 - InfDeath: 1 + InfDeath: 2 Damage: 15 Rockets: @@ -220,7 +220,7 @@ Rockets: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -251,7 +251,7 @@ BikeRockets: Wood: 30% Light: 75% Heavy: 30% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -282,7 +282,7 @@ OrcaAGMissiles: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -313,7 +313,7 @@ OrcaAAMissiles: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -332,7 +332,7 @@ Flamethrower: Wood: 200% Light: 75% Heavy: 25% - InfDeath: 4 + InfDeath: 5 ImpactSound: flamer2 SmudgeType: Scorch Damage: 35 @@ -352,7 +352,7 @@ BigFlamer: Wood: 200% Light: 75% Heavy: 25% - InfDeath: 4 + InfDeath: 5 Explosion: 3 ImpactSound: flamer2 SmudgeType: Scorch @@ -372,7 +372,7 @@ Chemspray: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 5 + InfDeath: 6 SmudgeType: Scorch ImpactSound: xplos @@ -392,7 +392,7 @@ Grenade: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 2 + InfDeath: 3 Explosion: 5 ImpactSound: xplos SmudgeType: Crater @@ -412,7 +412,7 @@ Grenade: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -432,7 +432,7 @@ Grenade: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -452,7 +452,7 @@ Grenade: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -473,7 +473,7 @@ Grenade: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -493,7 +493,7 @@ TurretGun: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -523,7 +523,7 @@ MammothMissiles: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -554,7 +554,7 @@ MammothMissiles: Wood: 50% Light: 100% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -585,7 +585,7 @@ MammothMissiles: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -611,7 +611,7 @@ ArtilleryShell: Wood: 75% Light: 60% Heavy: 25% - InfDeath: 2 + InfDeath: 3 Explosion: 8 SmudgeType: Crater ImpactSound: XPLOSML2 @@ -629,7 +629,7 @@ MachineGun: Wood: 50% Light: 50% Heavy: 25% - InfDeath: 1 + InfDeath: 2 Explosion: 1 Damage: 15 @@ -657,7 +657,7 @@ BoatMissile: Wood: 75% Light: 60% Heavy: 25% - InfDeath: 2 + InfDeath: 3 Explosion: 5 ImpactSound: xplos SmudgeType: Crater @@ -688,7 +688,7 @@ TowerMissle: Wood: 75% Light: 60% Heavy: 25% - InfDeath: 2 + InfDeath: 3 Explosion: 5 ImpactSound: xplos SmudgeType: Crater @@ -705,7 +705,7 @@ Napalm: Wood: 100% Light: 60% Heavy: 25% - InfDeath: 4 + InfDeath: 5 Explosion: 3 ImpactSound: flamer2 SmudgeType: Scorch @@ -719,7 +719,7 @@ Napalm.Crate: Wood: 100% Light: 60% Heavy: 25% - InfDeath: 4 + InfDeath: 5 Explosion: 3 ImpactSound: flamer2 SmudgeType: Scorch @@ -734,7 +734,7 @@ Laser: BeamRadius: 1 Warhead: Spread: 1 - InfDeath: 4 + InfDeath: 5 SmudgeType: Scorch Damage: 200 @@ -760,7 +760,7 @@ SAMMissile: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: 4 ImpactSound: xplos SmudgeType: Crater @@ -788,7 +788,7 @@ HonestJohn: Wood: 75% Light: 60% Heavy: 25% - InfDeath: 2 + InfDeath: 3 Explosion: 5 ImpactSound: xplos SmudgeType: Crater @@ -798,7 +798,7 @@ Tiberium: ROF: 4 Warhead: Spread: 1 - InfDeath: 5 + InfDeath: 6 Damage: 1 PreventProne: yes diff --git a/mods/d2k/weapons.yaml b/mods/d2k/weapons.yaml index 31c5dd4f3c..433a18655e 100644 --- a/mods/d2k/weapons.yaml +++ b/mods/d2k/weapons.yaml @@ -12,7 +12,7 @@ M1Carbine: Heavy: 10% Concrete: 10% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 15 Dragon: @@ -41,7 +41,7 @@ Dragon: Concrete: 20% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 50 ImpactSound: kaboom12 @@ -71,7 +71,7 @@ QuadRockets: Wood: 30% Light: 75% Heavy: 30% - InfDeath: 3 + InfDeath: 4 Explosion: med_explosion WaterExplosion: med_splash ImpactSound: kaboom12 @@ -93,7 +93,7 @@ TurretGun: Light: 75% Concrete: 50% Explosion: small_explosion - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 60 @@ -122,7 +122,7 @@ TowerMissle: Wood: 75% Light: 60% Heavy: 25% - InfDeath: 2 + InfDeath: 3 Explosion: small_explosion ImpactSound: kaboom12 SmudgeType: SandCrater, RockCrater @@ -143,7 +143,7 @@ TowerMissle: Heavy: 40% Concrete: 30% Explosion: small_explosion - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 16 @@ -162,7 +162,7 @@ TowerMissle: Light: 75% Concrete: 50% Explosion: small_explosion - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 30 @@ -183,7 +183,7 @@ TowerMissle: Light: 75% Concrete: 50% Explosion: small_explosion - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 40 @@ -203,7 +203,7 @@ TowerMissle: Light: 75% Concrete: 50% Explosion: small_explosion - InfDeath: 3 + InfDeath: 4 SmudgeType: SandCrater, RockCrater Damage: 50 @@ -232,7 +232,7 @@ TowerMissle: Wood: 75% Light: 75% Heavy: 50% - InfDeath: 3 + InfDeath: 4 Explosion: med_explosion WaterExplosion: med_splash ImpactSound: kaboom12 @@ -286,7 +286,7 @@ FakeMissile: Concrete: 50% Explosion: large_explosion WaterExplosion: med_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: SandCrater, RockCrater Damage: 220 @@ -298,7 +298,7 @@ TTankZap: Projectile: TeslaZap Warhead: Spread: 1 - InfDeath: 5 + InfDeath: 6 Damage: 100 ChainGun: @@ -317,7 +317,7 @@ ChainGun: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 20 M60mg: @@ -335,7 +335,7 @@ M60mg: Heavy: 10% Concrete: 10% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 15 Demolish: @@ -359,7 +359,7 @@ Atomic: Heavy: 25% Concrete: 50% Explosion: nuke - InfDeath: 4 + InfDeath: 5 ImpactSound: EXPLSML2 Warhead@areanuke: DamageModel: PerCell @@ -373,7 +373,7 @@ Atomic: Heavy: 25% Concrete: 50% Delay: 4 - InfDeath: 4 + InfDeath: 5 ImpactSound: EXPLLG2 CrateNuke: @@ -387,7 +387,7 @@ CrateNuke: Heavy: 25% Concrete: 50% Explosion: nuke - InfDeath: 4 + InfDeath: 5 ImpactSound: EXPLSML2 Warhead@areanuke: DamageModel: PerCell @@ -401,7 +401,7 @@ CrateNuke: Heavy: 25% Concrete: 50% Delay: 4 - InfDeath: 4 + InfDeath: 5 ImpactSound: EXPLLG2 CrateExplosion: @@ -415,7 +415,7 @@ CrateExplosion: Heavy: 25% Explosion: self_destruct WaterExplosion: self_destruct - InfDeath: 3 + InfDeath: 4 ImpactSound: EXPLSML4 UnitExplode: @@ -429,7 +429,7 @@ UnitExplode: Heavy: 25% Explosion: self_destruct WaterExplosion: large_splash - InfDeath: 3 + InfDeath: 4 ImpactSound: EXPLMD1 UnitExplodeSmall: @@ -442,7 +442,7 @@ UnitExplodeSmall: Light: 60% Heavy: 25% Explosion: large_explosion - InfDeath: 3 + InfDeath: 4 ImpactSound: EXPLSML2 WormJaw: @@ -480,7 +480,7 @@ RedEye: Light: 60% Heavy: 25% Explosion: med_explosion - InfDeath: 2 + InfDeath: 3 SmudgeType: SandCrater, RockCrater Damage: 40 @@ -498,7 +498,7 @@ Sniper: Wood: 5% Light: 5% Heavy: 5% - InfDeath: 1 + InfDeath: 2 Vulcan: ROF: 30 @@ -515,7 +515,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Warhead@2: Spread: 3 @@ -525,7 +525,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 2 Warhead@3: @@ -536,7 +536,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 4 Warhead@4: @@ -547,7 +547,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 6 Warhead@5: @@ -558,7 +558,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 8 Warhead@6: @@ -569,6 +569,6 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 10 \ No newline at end of file diff --git a/mods/ra/weapons.yaml b/mods/ra/weapons.yaml index 2957425ad7..4136cf3c29 100644 --- a/mods/ra/weapons.yaml +++ b/mods/ra/weapons.yaml @@ -12,7 +12,7 @@ Colt45: Heavy: 5% Concrete: 5% Explosion: piff - InfDeath: 1 + InfDeath: 2 Damage: 50 ZSU-23: @@ -48,7 +48,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Warhead@2: Spread: 3 @@ -58,7 +58,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 2 Warhead@3: @@ -69,7 +69,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 4 Warhead@4: @@ -80,7 +80,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 6 Warhead@5: @@ -91,7 +91,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 8 Warhead@6: @@ -102,7 +102,7 @@ Vulcan: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 10 Delay: 10 @@ -135,7 +135,7 @@ Maverick: Concrete: 50% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 70 @@ -157,7 +157,7 @@ FireballLauncher: Concrete: 50% Explosion: napalm WaterExplosion: napalm - InfDeath: 4 + InfDeath: 5 SmudgeType: Scorch ImpactSound: firebl3 Damage: 150 @@ -183,7 +183,7 @@ Flamer: Concrete: 50% Explosion: small_napalm WaterExplosion: small_napalm - InfDeath: 4 + InfDeath: 5 SmudgeType: Scorch ImpactSound: firebl3 Damage: 8 @@ -205,7 +205,7 @@ ChainGun: Concrete: 25% Explosion: piffs WaterExplosion: small_splash - InfDeath: 1 + InfDeath: 2 Damage: 20 ChainGun.Yak: @@ -225,7 +225,7 @@ ChainGun.Yak: Concrete: 25% Explosion: piffs WaterExplosion: small_splash - InfDeath: 1 + InfDeath: 2 Damage: 40 Pistol: @@ -242,7 +242,7 @@ Pistol: Heavy: 25% Concrete: 25% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 1 M1Carbine: @@ -259,7 +259,7 @@ M1Carbine: Heavy: 10% Concrete: 10% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 15 Dragon: @@ -288,7 +288,7 @@ Dragon: Concrete: 20% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 50 ImpactSound: kaboom12 @@ -321,7 +321,7 @@ HellfireAG: Concrete: 50% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 40 @@ -353,7 +353,7 @@ HellfireAA: Concrete: 50% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 40 @@ -376,7 +376,7 @@ Grenade: Heavy: 5% Explosion: med_explosion WaterExplosion: small_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 60 ImpactSound: kaboom12 @@ -397,7 +397,7 @@ Grenade: Concrete: 30% Explosion: small_explosion WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 16 @@ -417,7 +417,7 @@ Grenade: Concrete: 50% Explosion: small_explosion WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 30 @@ -439,7 +439,7 @@ Grenade: Concrete: 50% Explosion: small_explosion WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 40 @@ -460,7 +460,7 @@ Grenade: Concrete: 50% Explosion: small_explosion WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 50 @@ -480,7 +480,7 @@ TurretGun: Concrete: 50% Explosion: small_explosion WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 60 @@ -511,7 +511,7 @@ MammothTusk: Heavy: 25% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 45 @@ -537,7 +537,7 @@ MammothTusk: Concrete: 50% Explosion: large_explosion WaterExplosion: med_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 220 @@ -557,7 +557,7 @@ M60mg: Concrete: 10% Explosion: piffs WaterExplosion: small_splash - InfDeath: 1 + InfDeath: 2 Damage: 15 Napalm: @@ -578,7 +578,7 @@ Napalm: Concrete: 50% Explosion: napalm WaterExplosion: med_splash - InfDeath: 4 + InfDeath: 5 SmudgeType: Scorch ImpactSound: firebl3 Damage: 100 @@ -593,7 +593,7 @@ CrateNapalm: Concrete: 50% Explosion: napalm WaterExplosion: napalm - InfDeath: 4 + InfDeath: 5 SmudgeType: Scorch ImpactSound: firebl3 Damage: 600 @@ -609,7 +609,7 @@ CrateExplosion: Heavy: 25% Explosion: self_destruct WaterExplosion: self_destruct - InfDeath: 3 + InfDeath: 4 ImpactSound: kaboom15 CrateNuke: @@ -624,7 +624,7 @@ CrateNuke: Concrete: 50% Explosion: nuke WaterExplosion: nuke - InfDeath: 4 + InfDeath: 5 ImpactSound: kaboom1 Warhead@areanuke: DamageModel: PerCell @@ -638,7 +638,7 @@ CrateNuke: Heavy: 25% Concrete: 50% Delay: 4 - InfDeath: 4 + InfDeath: 5 ImpactSound: kaboom22 @@ -650,7 +650,7 @@ TeslaZap: Projectile: TeslaZap Warhead: Spread: 1 - InfDeath: 5 + InfDeath: 6 Damage: 100 Nike: @@ -678,7 +678,7 @@ Nike: Heavy: 50% Concrete: 0% Explosion: med_explosion - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 100 @@ -706,7 +706,7 @@ RedEye: Light: 60% Heavy: 25% Explosion: med_explosion - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 40 @@ -732,7 +732,7 @@ RedEye: Heavy: 25% Explosion: large_explosion WaterExplosion: large_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 250 ImpactSound: kaboom12 @@ -760,7 +760,7 @@ SubMissile: Heavy: 30% Explosion: large_explosion WaterExplosion: large_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 300 ImpactSound: kaboom12 @@ -794,7 +794,7 @@ Stinger: Concrete: 50% Explosion: med_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 30 @@ -821,7 +821,7 @@ TorpTube: Light: 75% Concrete: 50% WaterExplosion: large_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 180 @@ -841,7 +841,7 @@ TorpTube: Concrete: 50% Explosion: small_explosion WaterExplosion: med_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 25 @@ -863,7 +863,7 @@ DepthCharge: Light: 75% Concrete: 50% WaterExplosion: large_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 80 @@ -882,7 +882,7 @@ ParaBomb: Concrete: 50% Explosion: self_destruct WaterExplosion: small_splash - InfDeath: 3 + InfDeath: 4 SmudgeType: Crater Damage: 500 ImpactSound: kaboom15 @@ -898,7 +898,7 @@ DogJaw: Light: 0% Heavy: 0% Concrete: 0% - InfDeath: 0 + InfDeath: 1 Damage: 100 Heal: @@ -914,7 +914,7 @@ Heal: Light: 0% Heavy: 0% Concrete: 0% - InfDeath: 0 + InfDeath: 1 Damage: -50 SilencedPPK: @@ -931,7 +931,7 @@ SilencedPPK: Heavy: 0% Concrete: 0% Explosion: piffs - InfDeath: 1 + InfDeath: 2 Damage: 150 SCUD: @@ -958,7 +958,7 @@ SCUD: Heavy: 25% Explosion: napalm WaterExplosion: large_splash - InfDeath: 2 + InfDeath: 3 SmudgeType: Crater Damage: 600 ImpactSound: firebl3 @@ -976,7 +976,7 @@ Atomic: Concrete: 50% Explosion: nuke WaterExplosion: nuke - InfDeath: 4 + InfDeath: 5 ImpactSound: kaboom1 Warhead@areanuke: DamageModel: PerCell @@ -990,7 +990,7 @@ Atomic: Heavy: 25% Concrete: 50% Delay: 4 - InfDeath: 4 + InfDeath: 5 ImpactSound: kaboom22 UnitExplode: @@ -1004,7 +1004,7 @@ UnitExplode: Heavy: 25% Explosion: self_destruct WaterExplosion: large_splash - InfDeath: 3 + InfDeath: 4 ImpactSound: kaboom22 UnitExplodeSmall: @@ -1017,7 +1017,7 @@ UnitExplodeSmall: Light: 60% Heavy: 25% Explosion: large_explosion - InfDeath: 3 + InfDeath: 4 ImpactSound: kaboom15 Crush: @@ -1044,7 +1044,7 @@ APMine: Heavy: 0% Concrete: 0% ImpactSound: mine1 - InfDeath: 2 + InfDeath: 3 Explosion: napalm Demolish: @@ -1061,7 +1061,7 @@ PortaTesla: Projectile: TeslaZap Warhead: Spread: 1 - InfDeath: 5 + InfDeath: 6 Damage: 45 TTankZap: @@ -1072,7 +1072,7 @@ TTankZap: Projectile: TeslaZap Warhead: Spread: 1 - InfDeath: 5 + InfDeath: 6 Damage: 100 FLAK-23: