diff --git a/OpenRA.FileFormats/Manifest.cs b/OpenRA.FileFormats/Manifest.cs index 54c46ea58e..363357e333 100644 --- a/OpenRA.FileFormats/Manifest.cs +++ b/OpenRA.FileFormats/Manifest.cs @@ -26,6 +26,7 @@ namespace OpenRA.FileFormats public readonly Dictionary Packages; public readonly MiniYaml LoadScreen; + public readonly MiniYaml LobbyDefaults; public readonly Dictionary> Fonts; public readonly int TileSize = 24; @@ -57,6 +58,7 @@ namespace OpenRA.FileFormats PackageContents = YamlList(yaml, "PackageContents"); LoadScreen = yaml["LoadScreen"]; + LobbyDefaults = yaml["LobbyDefaults"]; Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key, x => Pair.New(x.Value.NodesDict["Font"].Value, int.Parse(x.Value.NodesDict["Size"].Value))); diff --git a/OpenRA.Game/Graphics/ShroudRenderer.cs b/OpenRA.Game/Graphics/ShroudRenderer.cs index 3a8358ae2f..3f8ef3ed2e 100644 --- a/OpenRA.Game/Graphics/ShroudRenderer.cs +++ b/OpenRA.Game/Graphics/ShroudRenderer.cs @@ -15,8 +15,8 @@ namespace OpenRA.Graphics { public class ShroudRenderer { + World world; Map map; - ShroudInfo shroudInfo; Sprite[] shadowBits = Game.modData.SpriteLoader.LoadAllSprites("shadow"); Sprite[,] sprites, fogSprites; int shroudHash; @@ -46,8 +46,8 @@ namespace OpenRA.Graphics public ShroudRenderer(World world) { + this.world = world; this.map = world.Map; - shroudInfo = Rules.Info["player"].Traits.Get(); sprites = new Sprite[map.MapSize.X, map.MapSize.Y]; fogSprites = new Sprite[map.MapSize.X, map.MapSize.Y]; @@ -152,9 +152,10 @@ namespace OpenRA.Graphics { if (initializePalettes) { - if (shroudInfo.Fog) + if (world.LobbyInfo.GlobalSettings.Fog) fogPalette = wr.Palette("fog"); - shroudPalette = wr.Palette("shroud"); + + shroudPalette = world.LobbyInfo.GlobalSettings.Fog ? wr.Palette("shroud") : wr.Palette("shroudfog"); initializePalettes = false; } @@ -165,7 +166,7 @@ namespace OpenRA.Graphics // We draw the shroud when disabled to hide the sharp map edges DrawShroud(wr, clipRect, sprites, shroudPalette); - if (shroudInfo.Fog) + if (world.LobbyInfo.GlobalSettings.Fog) DrawShroud(wr, clipRect, fogSprites, fogPalette); } diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index d6e52d77ad..32c9df85a2 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -92,7 +92,9 @@ namespace OpenRA.Network public bool Dedicated; public string Difficulty; public bool Crates = true; - public string StartingUnitsClass = "default"; + public bool Shroud = true; + public bool Fog = true; + public string StartingUnitsClass = "none"; public bool AllowVersionMismatch; } diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 6592c0835c..cfd618afa4 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -106,6 +106,7 @@ namespace OpenRA.Server lobbyInfo.GlobalSettings.Map = settings.Map; lobbyInfo.GlobalSettings.ServerName = settings.Name; lobbyInfo.GlobalSettings.Dedicated = settings.Dedicated; + FieldLoader.Load(lobbyInfo.GlobalSettings, modData.Manifest.LobbyDefaults); foreach (var t in ServerTraits.WithInterface()) t.ServerStarted(this); @@ -526,7 +527,10 @@ namespace OpenRA.Server DispatchOrders(toDrop, toDrop.MostRecentFrame, new byte[] {0xbf}); if (!conns.Any()) + { + FieldLoader.Load(lobbyInfo.GlobalSettings, ModData.Manifest.LobbyDefaults); TempBans.Clear(); + } if (conns.Any() || lobbyInfo.GlobalSettings.Dedicated) SyncLobbyInfo(); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index b543fbf5ca..8bbc5db90d 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -64,6 +64,8 @@ namespace OpenRA.Traits 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 INotifyAddedToWorld { void AddedToWorld(Actor self); } + public interface INotifyRemovedFromWorld { void RemovedFromWorld(Actor self); } 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/Traits/World/Shroud.cs b/OpenRA.Game/Traits/World/Shroud.cs index 2b87e4b872..86fb52a6a5 100644 --- a/OpenRA.Game/Traits/World/Shroud.cs +++ b/OpenRA.Game/Traits/World/Shroud.cs @@ -18,14 +18,11 @@ namespace OpenRA.Traits { public class ShroudInfo : ITraitInfo { - public readonly bool Shroud = true; - public readonly bool Fog = true; - public object Create(ActorInitializer init) { return new Shroud(init.self, this); } + public object Create(ActorInitializer init) { return new Shroud(init.self); } } public class Shroud { - public ShroudInfo Info; Actor self; Map map; @@ -42,9 +39,8 @@ namespace OpenRA.Traits public int Hash { get; private set; } - public Shroud(Actor self, ShroudInfo info) + public Shroud(Actor self) { - Info = info; this.self = self; map = self.World.Map; @@ -58,7 +54,7 @@ namespace OpenRA.Traits self.World.ActorAdded += AddShroudGeneration; self.World.ActorRemoved += RemoveShroudGeneration; - if (!info.Shroud) + if (!self.World.LobbyInfo.GlobalSettings.Shroud) ExploredBounds = map.Bounds; } @@ -252,7 +248,7 @@ namespace OpenRA.Traits if (!map.IsInMap(x, y)) return false; - if (!Info.Shroud) + if (!self.World.LobbyInfo.GlobalSettings.Shroud) return true; return explored[x, y] && (generatedShroudCount[x, y] == 0 || visibleCount[x, y] > 0); @@ -271,7 +267,7 @@ namespace OpenRA.Traits if (x < 0 || x >= map.MapSize.X || y < 0 || y >= map.MapSize.Y) return false; - if (!Info.Fog) + if (!self.World.LobbyInfo.GlobalSettings.Fog) return true; return visibleCount[x, y] > 0; diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 7c2d6177a6..fe07516552 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -159,6 +159,9 @@ namespace OpenRA a.IsInWorld = true; actors.Add(a); ActorAdded(a); + + foreach (var t in a.TraitsImplementing()) + t.AddedToWorld(a); } public void Remove(Actor a) @@ -166,7 +169,9 @@ namespace OpenRA a.IsInWorld = false; actors.Remove(a); ActorRemoved(a); - + + foreach (var t in a.TraitsImplementing()) + t.RemovedFromWorld(a); } public void Add(IEffect b) { effects.Add(b); } diff --git a/OpenRA.Mods.RA/Buildings/BibLayer.cs b/OpenRA.Mods.RA/Buildings/BibLayer.cs index ce4711c1ea..503d7dc400 100755 --- a/OpenRA.Mods.RA/Buildings/BibLayer.cs +++ b/OpenRA.Mods.RA/Buildings/BibLayer.cs @@ -20,72 +20,40 @@ namespace OpenRA.Mods.RA.Buildings { class BibLayerInfo : ITraitInfo { - public readonly string[] BibTypes = { "bib3", "bib2", "bib1" }; - public readonly int[] BibWidths = { 2, 3, 4 }; - public readonly bool FrozenUnderFog = false; - public object Create(ActorInitializer init) { return new BibLayer(init.self, this); } + public object Create(ActorInitializer init) { return new BibLayer(init.self); } } struct CachedBib { - public Dictionary> Tiles; + public Dictionary Tiles; public IEnumerable Footprint; public bool Visible; + public bool Immediate; } - class BibLayer : IRenderOverlay, IWorldLoaded, ITickRender + class BibLayer : IRenderOverlay, ITickRender { World world; - BibLayerInfo info; Dictionary visible; Dictionary dirty; - Sprite[][] bibSprites; + Cache sprites; - public BibLayer(Actor self, BibLayerInfo info) + public BibLayer(Actor self) { - this.info = info; - bibSprites = info.BibTypes.Select(x => Game.modData.SpriteLoader.LoadAllSprites(x)).ToArray(); - - self.World.ActorAdded += a => DoBib(a, true); - self.World.ActorRemoved += a => DoBib(a, false); - } - - public void WorldLoaded(World w) - { - world = w; + world = self.World; visible = new Dictionary(); dirty = new Dictionary(); + sprites = new Cache(x => Game.modData.SpriteLoader.LoadAllSprites(x)); } - public void DoBib(Actor b, bool isAdd) + public void Update(Actor a, CachedBib bib) { - if (!b.HasTrait()) - return; + dirty[a] = bib; + } - var buildingInfo = b.Info.Traits.Get(); - var size = buildingInfo.Dimensions.X; - var bibOffset = buildingInfo.Dimensions.Y - 1; - - var bib = Array.IndexOf(info.BibWidths, size); - if (bib < 0) - { - Log.Write("debug", "Cannot bib {0}-wide building {1}", size, b.Info.Name); - return; - } - - dirty[b] = new CachedBib() - { - Footprint = FootprintUtils.Tiles(b), - Tiles = new Dictionary>(), - Visible = isAdd - }; - - for (var i = 0; i < 2 * size; i++) - { - var cell = b.Location + new CVec(i % size, i / size + bibOffset); - var tile = new TileReference((byte)(bib + 1), (byte) i); - dirty[b].Tiles.Add(cell, tile); - } + public Sprite[] LoadSprites(string bibType) + { + return sprites[bibType]; } public void TickRender(WorldRenderer wr, Actor self) @@ -93,7 +61,7 @@ namespace OpenRA.Mods.RA.Buildings var remove = new List(); foreach (var kv in dirty) { - if (!info.FrozenUnderFog || kv.Value.Footprint.Any(c => !self.World.FogObscures(c))) + if (kv.Value.Immediate || kv.Value.Footprint.Any(c => !self.World.FogObscures(c))) { if (kv.Value.Visible) visible[kv.Key] = kv.Value; @@ -119,16 +87,68 @@ namespace OpenRA.Mods.RA.Buildings { if (!cliprect.Contains(kv.Key.X, kv.Key.Y)) continue; + if (world.ShroudObscures(kv.Key)) continue; - var tile = bibSprites[kv.Value.type - 1][kv.Value.index]; - tile.DrawAt(wr.ScreenPxPosition(kv.Key.CenterPosition) - 0.5f * tile.size, pal); + kv.Value.DrawAt(wr.ScreenPxPosition(kv.Key.CenterPosition) - 0.5f * kv.Value.size, pal); } } } } - public class BibInfo : TraitInfo, Requires { } - public class Bib { } + public class BibInfo : ITraitInfo, Requires + { + public readonly string Sprite = "bib3"; + + public object Create(ActorInitializer init) { return new Bib(init.self, this); } + } + + public class Bib : INotifyAddedToWorld, INotifyRemovedFromWorld + { + readonly BibInfo info; + readonly BibLayer bibLayer; + bool firstAdd; + + public Bib(Actor self, BibInfo info) + { + this.info = info; + bibLayer = self.World.WorldActor.Trait(); + firstAdd = true; + } + + void DoBib(Actor self, bool add) + { + var buildingInfo = self.Info.Traits.Get(); + var size = buildingInfo.Dimensions.X; + var bibOffset = buildingInfo.Dimensions.Y - 1; + var sprites = bibLayer.LoadSprites(info.Sprite); + + if (sprites.Length != 2*size) + throw new InvalidOperationException("{0} is an invalid bib for a {1}-wide building".F(info.Sprite, size)); + + var immediate = !self.HasTrait() || + (firstAdd && self.Info.Traits.GetOrDefault().StartsRevealed); + + var dirty = new CachedBib() + { + Footprint = FootprintUtils.Tiles(self), + Tiles = new Dictionary(), + Visible = add, + Immediate = immediate + }; + + for (var i = 0; i < 2 * size; i++) + { + var cell = self.Location + new CVec(i % size, i / size + bibOffset); + dirty.Tiles.Add(cell, sprites[i]); + } + + firstAdd = false; + bibLayer.Update(self, dirty); + } + + public void AddedToWorld(Actor self) { DoBib(self, true); } + public void RemovedFromWorld(Actor self) { DoBib(self, false); } + } } diff --git a/OpenRA.Mods.RA/LeavesHusk.cs b/OpenRA.Mods.RA/LeavesHusk.cs index 1fc3f91fe3..c543da970c 100644 --- a/OpenRA.Mods.RA/LeavesHusk.cs +++ b/OpenRA.Mods.RA/LeavesHusk.cs @@ -36,6 +36,7 @@ namespace OpenRA.Mods.RA { var td = new TypeDictionary { + new ParentActorInit(self), new LocationInit(self.Location), new CenterLocationInit(self.CenterLocation), new OwnerInit(self.Owner), diff --git a/OpenRA.Mods.RA/MPStartUnits.cs b/OpenRA.Mods.RA/MPStartUnits.cs index dc571d74d1..bab7fac798 100644 --- a/OpenRA.Mods.RA/MPStartUnits.cs +++ b/OpenRA.Mods.RA/MPStartUnits.cs @@ -15,7 +15,7 @@ namespace OpenRA.Mods.RA { public class MPStartUnitsInfo : TraitInfo { - public readonly string Class = "default"; + public readonly string Class = "none"; public readonly string[] Races = { }; public readonly string BaseActor = null; diff --git a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs index 14b1620797..e9bacfb9a7 100644 --- a/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs @@ -19,20 +19,25 @@ namespace OpenRA.Mods.RA { public class FrozenUnderFogInfo : ITraitInfo, Requires, Requires { - public object Create(ActorInitializer init) { return new FrozenUnderFog(init.self); } + public readonly bool StartsRevealed = false; + + public object Create(ActorInitializer init) { return new FrozenUnderFog(init, this); } } public class FrozenUnderFog : IRenderModifier, IVisibilityModifier, ITickRender { FrozenActorProxy proxy; IEnumerable footprint; - bool visible; + bool visible, cacheFirstFrame; - public FrozenUnderFog(Actor self) + public FrozenUnderFog(ActorInitializer init, FrozenUnderFogInfo info) { - footprint = FootprintUtils.Tiles(self); - proxy = new FrozenActorProxy(self, footprint); - self.World.AddFrameEndTask(w => w.Add(proxy)); + footprint = FootprintUtils.Tiles(init.self); + proxy = new FrozenActorProxy(init.self, footprint); + init.world.AddFrameEndTask(w => w.Add(proxy)); + + // Spawned actors (e.g. building husks) shouldn't be revealed + cacheFirstFrame = info.StartsRevealed && !init.Contains(); } public bool IsVisible(Actor self, Player byPlayer) @@ -46,6 +51,13 @@ namespace OpenRA.Mods.RA return; visible = IsVisible(self, self.World.RenderPlayer); + + if (cacheFirstFrame) + { + visible = true; + cacheFirstFrame = false; + } + if (visible) proxy.SetRenderables(self.Render(wr)); } diff --git a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs index 6b28a1b7a7..a20246f745 100644 --- a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs @@ -326,6 +326,32 @@ namespace OpenRA.Mods.RA.Server server.SyncLobbyInfo(); return true; }}, + { "shroud", + s => + { + if (!client.IsAdmin) + { + server.SendOrderTo(conn, "Message", "Only the host can set that option"); + return true; + } + + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.Shroud); + server.SyncLobbyInfo(); + return true; + }}, + { "fog", + s => + { + if (!client.IsAdmin) + { + server.SendOrderTo(conn, "Message", "Only the host can set that option"); + return true; + } + + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.Fog); + server.SyncLobbyInfo(); + return true; + }}, { "assignteams", s => { diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index d8869f06d0..fb2e025eac 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -327,7 +327,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var classNames = new Dictionary() { {"none", "MCV Only"}, - {"default", "Light Support"}, + {"light", "Light Support"}, {"heavy", "Heavy Support"}, }; @@ -360,6 +360,24 @@ namespace OpenRA.Mods.RA.Widgets.Logic optionsBin.Get("STARTINGUNITS_DESC").IsVisible = startingUnits.IsVisible; } + var enableShroud = optionsBin.GetOrNull("SHROUD_CHECKBOX"); + if (enableShroud != null) + { + enableShroud.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Shroud; + enableShroud.IsDisabled = configurationDisabled; + enableShroud.OnClick = () => orderManager.IssueOrder(Order.Command( + "shroud {0}".F(!orderManager.LobbyInfo.GlobalSettings.Shroud))); + }; + + var enableFog = optionsBin.GetOrNull("FOG_CHECKBOX"); + if (enableFog != null) + { + enableFog.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Fog; + enableFog.IsDisabled = configurationDisabled; + enableFog.OnClick = () => orderManager.IssueOrder(Order.Command( + "fog {0}".F(!orderManager.LobbyInfo.GlobalSettings.Fog))); + }; + var disconnectButton = lobby.Get("DISCONNECT_BUTTON"); disconnectButton.OnClick = () => { CloseWindow(); onExit(); }; diff --git a/mods/cnc/chrome/dialogs.yaml b/mods/cnc/chrome/dialogs.yaml index deefa547d7..a0ebdc245a 100644 --- a/mods/cnc/chrome/dialogs.yaml +++ b/mods/cnc/chrome/dialogs.yaml @@ -206,45 +206,57 @@ Background@LOBBY_OPTIONS_BIN: Children: Label@TITLE: X:0 - Y:50 + Y:40 Width:PARENT_RIGHT Height:25 Font:Bold Align:Center Text: Map Options Checkbox@ALLOWCHEATS_CHECKBOX: - X:150 - Y:80 + X:80 + Y:75 Width:230 Height:20 - Text:Enable Cheats / Debug Menu + Text:Cheats / Debug Menu Checkbox@CRATES_CHECKBOX: - X:150 + X:80 Y:110 Width:230 Height:20 - Text:Enable Crates + Text:Crates + Checkbox@SHROUD_CHECKBOX: + X:310 + Y:75 + Width:230 + Height:20 + Text:Shroud + Checkbox@FOG_CHECKBOX: + X:310 + Y:110 + Width:230 + Height:20 + Text:Fog of War Label@STARTINGUNITS_DESC: - X:150 - Y:140 + X:135 + Y:142 Width:120 Height:25 Text:Starting Units: DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: - X:245 - Y:140 + X:230 + Y:142 Width:140 Height:25 Font:Bold Label@DIFFICULTY_DESC: - X:150 - Y:170 + X:125 + Y:177 Width:120 Height:25 Text:Mission Difficulty: DropDownButton@DIFFICULTY_DROPDOWNBUTTON: - X:265 - Y:170 + X:230 + Y:177 Width:100 Height:25 - Font:Bold \ No newline at end of file + Font:Bold diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 8aa018e6d4..d5da8da5b2 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -52,6 +52,7 @@ Sequences: mods/cnc/sequences/funpark.yaml mods/cnc/sequences/civilian.yaml mods/cnc/sequences/campaign.yaml + Cursors: mods/cnc/cursors.yaml @@ -117,6 +118,14 @@ ServerTraits: PlayerPinger MasterServerPinger +LobbyDefaults: + AllowCheats: false + Crates: true + StartingUnitsClass: light + FragileAlliances: false + Shroud: true + Fog: true + ChromeMetrics: mods/cnc/metrics.yaml diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 8c3f55a1ea..751e5b4014 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -324,7 +324,6 @@ -DeadBuildingState: -Buildable: -GivesBuildableArea: - -FrozenUnderFog: Health: HP: 400 Armor: @@ -337,6 +336,8 @@ -Sellable: Tooltip: Name: Civilian Building + FrozenUnderFog: + StartsRevealed: true ^CivBuildingHusk: AppearsOnRadar: @@ -349,6 +350,8 @@ Tooltip: Name: Civilian Building (Destroyed) BodyOrientation: + FrozenUnderFog: + StartsRevealed: true ^TechBuilding: Inherits: ^CivBuilding @@ -379,6 +382,10 @@ Name: Field (Destroyed) BelowUnits: BodyOrientation: + RenderBuilding: + Palette: terrain + FrozenUnderFog: + StartsRevealed: true ^Wall: AppearsOnRadar: @@ -408,6 +415,7 @@ Sellable: Guardable: BodyOrientation: + FrozenUnderFog: ^Tree: Tooltip: @@ -429,6 +437,8 @@ Type: Wood AutoTargetIgnore: BodyOrientation: + FrozenUnderFog: + StartsRevealed: true ^Rock: Tooltip: @@ -444,6 +454,8 @@ EditorAppearance: RelativeToTopLeft: yes BodyOrientation: + FrozenUnderFog: + StartsRevealed: true ^Husk: Health: diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 178bf52614..e9ec07d07a 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -23,6 +23,7 @@ FACT: RevealsShroud: Range: 10 Bib: + Sprite: bib2 Production: Produces: Building,Defense Transforms: @@ -72,6 +73,7 @@ NUKE: RevealsShroud: Range: 4 Bib: + Sprite: bib3 NUK2: Inherits: ^Building @@ -96,6 +98,7 @@ NUK2: RevealsShroud: Range: 4 Bib: + Sprite: bib3 PROC: Inherits: ^Building @@ -118,6 +121,7 @@ PROC: RevealsShroud: Range: 6 Bib: + Sprite: bib2 TiberiumRefinery: DockOffset: 0,2 TickRate: 15 @@ -191,6 +195,7 @@ PYLE: RevealsShroud: Range: 5 Bib: + Sprite: bib3 RallyPoint: Exit@1: SpawnOffset: -10,2 @@ -230,6 +235,7 @@ HAND: RevealsShroud: Range: 5 Bib: + Sprite: bib3 RallyPoint: Exit@1: SpawnOffset: 12,24 @@ -266,6 +272,7 @@ AFLD: RevealsShroud: Range: 7 Bib: + Sprite: bib1 RallyPoint: RallyPoint: 4,2 BelowUnits: @@ -305,6 +312,7 @@ WEAP: RevealsShroud: Range: 4 Bib: + Sprite: bib2 -RenderBuilding: RenderBuildingWarFactory: RallyPoint: @@ -381,6 +389,7 @@ HQ: RevealsShroud: Range: 10 Bib: + Sprite: bib3 ProvidesRadar: RenderDetectionCircle: DetectCloaked: @@ -445,6 +454,7 @@ EYE: RevealsShroud: Range: 10 Bib: + Sprite: bib3 ProvidesRadar: RenderDetectionCircle: DetectCloaked: @@ -485,6 +495,7 @@ TMPL: RevealsShroud: Range: 6 Bib: + Sprite: bib2 NukePower: Image: atomicnh ChargeTime: 300 diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index 0da2d447c6..18506ba034 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -264,6 +264,9 @@ World: ShroudPalette@fog: Name: fog Type: Fog + ShroudPalette@combined: + Name: shroudfog + Type: Combined Country@gdi: Name: GDI Race: gdi @@ -273,7 +276,6 @@ World: ProductionQueueFromSelection: ProductionTabsWidget: PRODUCTION_TABS BibLayer: - FrozenUnderFog: true DomainIndex: ResourceLayer: ResourceClaimLayer: @@ -315,22 +317,27 @@ World: Races: gdi, nod BaseActor: mcv MPStartUnits@defaultgdia: + Class: light Races: gdi BaseActor: mcv SupportActors: e1,e1,e1,e1,e1,e3,e3,jeep MPStartUnits@defaultgdib: + Class: light Races: gdi BaseActor: mcv SupportActors: e1,e1,e1,e1,e1,e1,e3,apc MPStartUnits@defaultnoda: + Class: light Races: nod BaseActor: mcv SupportActors: e1,e1,e1,e1,e3,bggy,bike MPStartUnits@defaultnodb: + Class: light Races: nod BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,e3,bggy MPStartUnits@defaultnodc: + Class: light Races: nod BaseActor: mcv SupportActors: e1,e1,e1,e1,e1,e1,e1,e3,bike diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 10318c4d50..df8ca2ca70 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -104,6 +104,14 @@ ServerTraits: PlayerPinger MasterServerPinger +LobbyDefaults: + AllowCheats: false + Crates: true + StartingUnitsClass: none + FragileAlliances: false + Shroud: false + Fog: true + ChromeMetrics: mods/d2k/metrics.yaml diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index af1f33ef81..367d800a60 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -230,7 +230,6 @@ Sellable: GivesBounty: DebugMuzzlePositions: - Bib: Guardable: Range: 3 BodyOrientation: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 2f0dd202b2..cfdcb23cbd 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -5,6 +5,8 @@ Footprint: xxx xxx Dimensions: 3,2 Adjacent: 4 + Bib: + Sprite: bib3x Buildable: Queue: Building BuildPaletteOrder: 1000 @@ -51,6 +53,8 @@ Power: 100 Footprint: xx xx Dimensions: 2,2 + Bib: + Sprite: bib2x Health: HP: 400 Armor: @@ -78,6 +82,8 @@ Power: -20 Footprint: =x xx Dimensions: 2,2 + Bib: + Sprite: bib2x Health: HP: 800 Armor: @@ -119,6 +125,8 @@ Power: -30 Footprint: xxx x== Dimensions: 3,2 + Bib: + Sprite: bib3x Health: HP: 900 Armor: @@ -173,7 +181,6 @@ PipCount: 5 Capacity: 2000 -EmitInfantryOnSell: - -Bib: ^LIGHT: Inherits: ^Building @@ -193,6 +200,8 @@ Power: -20 Footprint: xxx xx= Dimensions: 3,2 + Bib: + Sprite: bib3x Health: HP: 750 Armor: @@ -230,6 +239,8 @@ Power: -30 Footprint: _x_ xxx =xx Dimensions: 3,3 + Bib: + Sprite: bib3x Health: HP: 1500 Armor: @@ -269,6 +280,8 @@ Power: -40 Footprint: xxx xxx Dimensions: 3,2 + Bib: + Sprite: bib3x Health: HP: 1000 Armor: @@ -298,6 +311,8 @@ Power: -40 Footprint: xxx x=x =x= Dimensions: 3,3 + Bib: + Sprite: bib3x Health: HP: 1000 Armor: @@ -420,7 +435,6 @@ GUNTOWER: RenderDetectionCircle: DetectCloaked: Range: 5 - -Bib: GUNTOWER.Husk: Inherits: ^TowerHusk @@ -479,7 +493,6 @@ ROCKETTOWER: RenderDetectionCircle: DetectCloaked: Range: 6 - -Bib: ROCKETTOWER.Husk: Inherits: ^TowerHusk @@ -520,7 +533,6 @@ REPAIR: ValuePercentage: 50 RallyPoint: RallyPoint: 1,3 - -Bib: ^HIGHTECH: Inherits: ^Building @@ -540,6 +552,8 @@ REPAIR: Power: -40 Footprint: _x_ xxx xxx Dimensions: 3,3 + Bib: + Sprite: bib3x Health: HP: 1500 Armor: @@ -580,6 +594,8 @@ RESEARCH: Power: -40 Footprint: xxx xxx Dimensions: 3,2 + Bib: + Sprite: bib3x Health: HP: 1000 Armor: @@ -607,6 +623,8 @@ RESEARCH: Power: -50 Footprint: _x_ xxx =xx Dimensions: 3,3 + Bib: + Sprite: bib3x Health: HP: 2000 Armor: @@ -628,6 +646,8 @@ SIETCH: Footprint: xx xx Dimensions: 2,2 TerrainTypes: Cliff + Bib: + Sprite: bib2x Health: HP: 400 Armor: @@ -652,6 +672,8 @@ PALACEC: Building: Footprint: xxx xxx Dimensions: 3,2 + Bib: + Sprite: bib3x RenderBuilding: HasMakeAnimation: false diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 0241c1bd2c..240dfc6826 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -342,6 +342,9 @@ World: ShroudPalette@fog: Name: fog Type: Fog + ShroudPalette@combined: + Name: shroudfog + Type: Combined Country@Atreides: Name: Atreides Race: atreides @@ -352,9 +355,6 @@ World: Name: Ordos Race: ordos BibLayer: - BibTypes: bib3x, bib2x - BibWidths: 3, 2 - FrozenUnderFog: true DomainIndex: ResourceLayer: ResourceClaimLayer: diff --git a/mods/ra/chrome/lobby-dialogs.yaml b/mods/ra/chrome/lobby-dialogs.yaml index 3e5c90b046..f26378c3b4 100644 --- a/mods/ra/chrome/lobby-dialogs.yaml +++ b/mods/ra/chrome/lobby-dialogs.yaml @@ -59,39 +59,63 @@ Background@LOBBY_OPTIONS_BIN: Children: Label@TITLE: X:0 - Y:50 + Y:40 Width:PARENT_RIGHT Height:25 Font:Bold Align:Center Text: Map Options Checkbox@ALLOWCHEATS_CHECKBOX: - X:150 - Y:80 - Width:220 + X:80 + Y:75 + Width:230 Height:20 - Text:Enable Cheats / Debug Menu - Checkbox@CRATES_CHECKBOX: - X:150 + Text:Cheats / Debug Menu + Checkbox@FRAGILEALLIANCES_CHECKBOX: + X:80 Y:110 Width:220 Height:20 - Text:Enable Crates - Checkbox@FRAGILEALLIANCES_CHECKBOX: - X:150 - Y:140 - Width:220 - Height:20 Text:Allow Team Changes + Checkbox@CRATES_CHECKBOX: + X:80 + Y:145 + Width:230 + Height:20 + Text:Crates + Checkbox@SHROUD_CHECKBOX: + X:310 + Y:75 + Width:230 + Height:20 + Text:Shroud + Checkbox@FOG_CHECKBOX: + X:310 + Y:110 + Width:230 + Height:20 + Text:Fog of War + Label@STARTINGUNITS_DESC: + X:215 + Y:142 + Width:120 + Height:25 + Text:Starting Units: + DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: + X:310 + Y:142 + Width:140 + Height:25 + Font:Bold Label@DIFFICULTY_DESC: - X:150 - Y:170 + X:195 + Y:177 Width:120 Height:25 Text:Mission Difficulty: DropDownButton@DIFFICULTY_DROPDOWNBUTTON: - X:265 - Y:170 + X:310 + Y:177 Width:100 Height:25 - Font:Bold \ No newline at end of file + Font:Bold diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml index ae6717ca6c..a047367bd4 100644 --- a/mods/ra/maps/Fort-Lonestar/map.yaml +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -521,6 +521,7 @@ Rules: Armor: Type: Wood Bib: + Sprite: bib3 RevealsShroud: Range: 3 Capturable: diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 2756cd7e14..375eeae817 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -120,6 +120,14 @@ ServerTraits: PlayerPinger MasterServerPinger +LobbyDefaults: + AllowCheats: false + Crates: true + StartingUnitsClass: none + FragileAlliances: false + Shroud: true + Fog: true + ChromeMetrics: mods/ra/metrics.yaml diff --git a/mods/ra/rules/civilian.yaml b/mods/ra/rules/civilian.yaml index 9ab9f9dcfe..2b961ce769 100644 --- a/mods/ra/rules/civilian.yaml +++ b/mods/ra/rules/civilian.yaml @@ -69,6 +69,7 @@ FCOM: RevealsShroud: Range: 10 Bib: + Sprite: bib3 HOSP: Inherits: ^TechBuilding @@ -300,6 +301,7 @@ MISS: Tooltip: Name: Technology Center Bib: + Sprite: bib2 BIO: Inherits: ^TechBuilding @@ -319,6 +321,7 @@ OILB: Health: HP: 1000 Bib: + Sprite: bib3 RevealsShroud: Range: 3 Capturable: diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index d4d49b2504..f1dc99b41c 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -272,6 +272,7 @@ UpdatesPlayerStatistics: Guardable: BodyOrientation: + FrozenUnderFog: ^TechBuilding: Inherits: ^Building @@ -290,6 +291,8 @@ -Sellable: -Capturable: -CapturableBar: + FrozenUnderFog: + StartsRevealed: true ^AmmoBox: Inherits: ^TechBuilding @@ -370,6 +373,8 @@ Type: Wood AutoTargetIgnore: BodyOrientation: + FrozenUnderFog: + StartsRevealed: true ^Husk: Husk: @@ -489,6 +494,8 @@ ProximityCaptor: Types:Tree BodyOrientation: + FrozenUnderFog: + StartsRevealed: true ^DesertCivBuilding: Inherits: ^CivBuilding diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 5bcd057356..b1e3476f22 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -372,6 +372,7 @@ DOME: RevealsShroud: Range: 10 Bib: + Sprite: bib3 ProvidesRadar: IronCurtainable: Infiltratable: @@ -844,6 +845,7 @@ ATEK: RevealsShroud: Range: 10 Bib: + Sprite: bib3 IronCurtainable: GpsPower: Image: gpssicon @@ -880,6 +882,7 @@ WEAP: RevealsShroud: Range: 4 Bib: + Sprite: bib2 -RenderBuilding: RenderBuildingWarFactory: RallyPoint: @@ -909,6 +912,7 @@ FACT: RevealsShroud: Range: 5 Bib: + Sprite: bib2 Production: Produces: Building,Defense IronCurtainable: @@ -952,6 +956,7 @@ PROC: RevealsShroud: Range: 6 Bib: + Sprite: bib2 OreRefinery: StoresOre: PipCount: 17 @@ -1027,6 +1032,7 @@ HPAD: RevealsShroud: Range: 5 Bib: + Sprite: bib3 Exit@1: SpawnOffset: 0,-6 ExitCell: 0,0 @@ -1114,6 +1120,7 @@ POWR: RevealsShroud: Range: 4 Bib: + Sprite: bib3 IronCurtainable: DeadBuildingState: @@ -1143,6 +1150,7 @@ APWR: RevealsShroud: Range: 4 Bib: + Sprite: bib2 IronCurtainable: DeadBuildingState: @@ -1172,6 +1180,7 @@ STEK: RevealsShroud: Range: 4 Bib: + Sprite: bib2 IronCurtainable: BARR: @@ -1198,6 +1207,7 @@ BARR: RevealsShroud: Range: 5 Bib: + Sprite: bib3 RallyPoint: Exit@1: SpawnOffset: -4,19 @@ -1235,6 +1245,7 @@ TENT: RevealsShroud: Range: 5 Bib: + Sprite: bib3 RallyPoint: Exit@1: SpawnOffset: -1,19 @@ -1317,6 +1328,7 @@ FACF: RevealsShroud: Range: 4 Bib: + Sprite: bib2 RenderBuilding: Image: FACT Fake: @@ -1346,6 +1358,7 @@ WEAF: RevealsShroud: Range: 4 Bib: + Sprite: bib2 -RenderBuilding: RenderBuildingWarFactory: Image: WEAP @@ -1438,6 +1451,7 @@ DOMF: RevealsShroud: Range: 4 Bib: + Sprite: bib3 RenderBuilding: Image: DOME Fake: diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml index 59ca031e8f..d93ff73c0b 100644 --- a/mods/ra/rules/system.yaml +++ b/mods/ra/rules/system.yaml @@ -601,6 +601,9 @@ World: ShroudPalette@fog: Name: fog Type: Fog + ShroudPalette@combined: + Name: shroudfog + Type: Combined Country@0: Name: Allies Race: allies @@ -608,7 +611,6 @@ World: Name: Soviet Race: soviet BibLayer: - FrozenUnderFog: true DomainIndex: ResourceLayer: ResourceClaimLayer: @@ -644,9 +646,38 @@ World: DebugOverlay: SpawnMapActors: CreateMPPlayers: - MPStartUnits: + MPStartUnits@mcvonly: + Class: none Races: soviet, allies BaseActor: mcv + MPStartUnits@lightallies: + Class: light + Races: allies + BaseActor: mcv + SupportActors: e1,e1,e1,e3,e3,jeep,1tnk + InnerSupportRadius: 3 + OuterSupportRadius: 5 + MPStartUnits@lightsoviet: + Class: light + Races: soviet + BaseActor: mcv + SupportActors: e1,e1,e1,e3,e3,apc,ftrk + InnerSupportRadius: 3 + OuterSupportRadius: 5 + MPStartUnits@heavyallies: + Class: heavy + Races: allies + BaseActor: mcv + SupportActors: e1,e1,e1,e3,e3,jeep,1tnk,2tnk,2tnk,2tnk + InnerSupportRadius: 3 + OuterSupportRadius: 5 + MPStartUnits@heavysoviet: + Class: heavy + Races: soviet + BaseActor: mcv + SupportActors: e1,e1,e1,e3,e3,apc,ftrk,3tnk,3tnk + InnerSupportRadius: 3 + OuterSupportRadius: 5 MPStartLocations: SpawnMPUnits: SpatialBins: diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 6dae190fc8..77c15fb7c3 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -143,6 +143,14 @@ ServerTraits: PlayerPinger MasterServerPinger +LobbyDefaults: + AllowCheats: false + Crates: true + StartingUnitsClass: none + FragileAlliances: false + Shroud: true + Fog: true + ChromeMetrics: mods/ra/metrics.yaml diff --git a/mods/ts/rules/structures.yaml b/mods/ts/rules/structures.yaml index c8a080b9a0..c446623d7e 100644 --- a/mods/ts/rules/structures.yaml +++ b/mods/ts/rules/structures.yaml @@ -14,7 +14,6 @@ GACNST: Type: Wood RevealsShroud: Range: 5 - Bib: Production: Produces: Building,Defense Valued: @@ -58,7 +57,6 @@ GAPOWR: Type: Wood RevealsShroud: Range: 4 - Bib: GAPILE: Inherits: ^Building @@ -84,7 +82,6 @@ GAPILE: Type: Wood RevealsShroud: Range: 5 - Bib: # RallyPoint: #TODO: setup sequences Exit@1: SpawnOffset: -64,64,0 @@ -117,7 +114,6 @@ GAWEAP: HP: 1000 RevealsShroud: Range: 4 - Bib: -RenderBuilding: RenderBuildingWarFactory: # RallyPoint: # TODO: setup sequences @@ -302,7 +298,6 @@ GASPOT: # TODO: has moving spotlights Type: Wood RevealsShroud: Range: 4 - Bib: RenderDetectionCircle: DetectCloaked: Range: 3 diff --git a/mods/ts/rules/system.yaml b/mods/ts/rules/system.yaml index 86b8ccedc2..9900500350 100644 --- a/mods/ts/rules/system.yaml +++ b/mods/ts/rules/system.yaml @@ -111,7 +111,6 @@ World: Race: nod ResourceLayer: ResourceClaimLayer: -# BibLayer: # TODO: file not found: bib3 DebugOverlay: SpawnMapActors: CreateMPPlayers: