diff --git a/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs b/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs index f2467eb682..a4a90bfd88 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs @@ -50,6 +50,13 @@ namespace OpenRA.Mods.Common.Traits yield return tile + position; } + public static IEnumerable PathableTiles(string name, BuildingInfo buildingInfo, CPos position) + { + var footprint = buildingInfo.Footprint.Where(x => !char.IsWhiteSpace(x)).ToArray(); + foreach (var tile in TilesWhere(name, buildingInfo.Dimensions, footprint, a => a == '_')) + yield return tile + position; + } + static IEnumerable TilesWhere(string name, CVec dim, char[] footprint, Func cond) { if (footprint.Length != dim.X * dim.Y) diff --git a/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj b/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj index f2e9b0f651..b59843ae05 100644 --- a/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj +++ b/OpenRA.Mods.TS/OpenRA.Mods.TS.csproj @@ -69,6 +69,7 @@ + diff --git a/OpenRA.Mods.TS/Traits/Buildings/LowBridge.cs b/OpenRA.Mods.TS/Traits/Buildings/LowBridge.cs new file mode 100644 index 0000000000..d1eeb93fd0 --- /dev/null +++ b/OpenRA.Mods.TS/Traits/Buildings/LowBridge.cs @@ -0,0 +1,72 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.TS.Traits +{ + [Desc("Bridge actor that can't be passed underneath.")] + class LowBridgeInfo : ITraitInfo, Requires + { + public readonly string TerrainType = "Road"; + + public object Create(ActorInitializer init) { return new LowBridge(init.Self, this); } + } + + class LowBridge : INotifyAddedToWorld, INotifyRemovedFromWorld + { + readonly LowBridgeInfo info; + readonly IEnumerable cells; + + public LowBridge(Actor self, LowBridgeInfo info) + { + this.info = info; + + var buildingInfo = self.Info.TraitInfo(); + cells = FootprintUtils.PathableTiles(self.Info.Name, buildingInfo, self.Location); + } + + void UpdateTerrain(Actor self, byte terrainIndex) + { + foreach (var cell in cells) + self.World.Map.CustomTerrain[cell] = terrainIndex; + + var domainIndex = self.World.WorldActor.TraitOrDefault(); + if (domainIndex != null) + domainIndex.UpdateCells(self.World, cells); + } + + void INotifyAddedToWorld.AddedToWorld(Actor self) + { + var tileSet = self.World.Map.Rules.TileSet; + var terrainIndex = tileSet.GetTerrainIndex(info.TerrainType); + UpdateTerrain(self, terrainIndex); + } + + void KillUnitsOnBridge(Actor self) + { + foreach (var c in cells) + foreach (var a in self.World.ActorMap.GetActorsAt(c)) + if (a.Info.HasTraitInfo() && !a.Trait().CanEnterCell(c)) + a.Kill(self); + } + + void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) + { + UpdateTerrain(self, byte.MaxValue); + KillUnitsOnBridge(self); + } + } +} diff --git a/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs b/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs index 34f6f2d075..896b66c99e 100644 --- a/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs +++ b/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs @@ -18,6 +18,7 @@ using OpenRA.FileSystem; using OpenRA.Mods.Common; using OpenRA.Mods.Common.FileFormats; using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; namespace OpenRA.Mods.TS.UtilityCommands { @@ -72,40 +73,41 @@ namespace OpenRA.Mods.TS.UtilityCommands { 0x47, "palet02" }, { 0x48, "palet03" }, { 0x49, "palet04" }, - /* - { 0x4A, "lobrdg01" }, - { 0x4B, "lobrdg02" }, - { 0x4C, "lobrdg03" }, - { 0x4D, "lobrdg04" }, - { 0x4E, "lobrdg05" }, - { 0x4F, "lobrdg06" }, - { 0x50, "lobrdg07" }, - { 0x51, "lobrdg08" }, - { 0x52, "lobrdg09" }, - { 0x53, "lobrdg10" }, - { 0x54, "lobrdg11" }, - { 0x55, "lobrdg12" }, - { 0x56, "lobrdg13" }, - { 0x57, "lobrdg14" }, - { 0x58, "lobrdg15" }, - { 0x59, "lobrdg16" }, - { 0x5A, "lobrdg17" }, - { 0x5B, "lobrdg18" }, - { 0x5C, "lobrdg19" }, - { 0x5D, "lobrdg20" }, - { 0x5E, "lobrdg21" }, - { 0x5F, "lobrdg22" }, - { 0x60, "lobrdg23" }, - { 0x61, "lobrdg24" }, - { 0x62, "lobrdg25" }, - { 0x63, "lobrdg26" }, - { 0x64, "lobrdg27" }, - { 0x65, "lobrdg28" }, - { 0x7A, "lobrdg1" }, - { 0x7B, "lobrdg2" }, - { 0x7C, "lobrdg3" }, - { 0x7D, "lobrdg4" }, - */ + + { 0x4A, "lobrdg_b" }, // lobrdg01 + { 0x4B, "lobrdg_b" }, // lobrdg02 + { 0x4C, "lobrdg_b" }, // lobrdg03 + { 0x4D, "lobrdg_b" }, // lobrdg04 + { 0x4E, "lobrdg_b" }, // lobrdg05 + { 0x4F, "lobrdg_b" }, // lobrdg06 + { 0x50, "lobrdg_b" }, // lobrdg07 + { 0x51, "lobrdg_b" }, // lobrdg08 + { 0x52, "lobrdg_b" }, // lobrdg09 + { 0x53, "lobrdg_a" }, // lobrdg10 + { 0x54, "lobrdg_a" }, // lobrdg11 + { 0x55, "lobrdg_a" }, // lobrdg12 + { 0x56, "lobrdg_a" }, // lobrdg13 + { 0x57, "lobrdg_a" }, // lobrdg14 + { 0x58, "lobrdg_a" }, // lobrdg15 + { 0x59, "lobrdg_a" }, // lobrdg16 + { 0x5A, "lobrdg_a" }, // lobrdg17 + { 0x5B, "lobrdg_a" }, // lobrdg18 + { 0x5C, "lobrdg_r_se" }, // lobrdg19 + { 0x5D, "lobrdg_r_se" }, // lobrdg20 + { 0x5E, "lobrdg_r_nw" }, // lobrdg21 + { 0x5F, "lobrdg_r_nw" }, // lobrdg22 + { 0x60, "lobrdg_r_ne" }, // lobrdg23 + { 0x61, "lobrdg_r_ne" }, // lobrdg24 + { 0x62, "lobrdg_r_sw" }, // lobrdg25 + { 0x63, "lobrdg_r_sw" }, // lobrdg26 + { 0x64, "lobrdg_b_d" }, // lobrdg27 + { 0x65, "lobrdg_a_d" }, // lobrdg28 + + { 0x7A, "lobrdg_r_se" }, // lobrdg1 + { 0x7B, "lobrdg_r_nw" }, // lobrdg2 + { 0x7C, "lobrdg_r_ne" }, // lobrdg3 + { 0x7D, "lobrdg_r_sw" }, // lobrdg4 + { 0xA7, "veinhole" }, { 0xA8, "srock01" }, { 0xA9, "srock02" }, @@ -157,6 +159,57 @@ namespace OpenRA.Mods.TS.UtilityCommands { 0x7D, new Size(3, 1) }, }; + static readonly Dictionary OverlayToHealth = new Dictionary() + { + // 1,3 bridge tiles + { 0x4A, DamageState.Undamaged }, + { 0x4B, DamageState.Undamaged }, + { 0x4C, DamageState.Undamaged }, + { 0x4D, DamageState.Undamaged }, + + { 0x4E, DamageState.Heavy }, + { 0x4F, DamageState.Heavy }, + + { 0x50, DamageState.Heavy }, + + { 0x51, DamageState.Critical }, + { 0x52, DamageState.Critical }, + + // 3,1 bridge tiles + { 0x53, DamageState.Undamaged }, + { 0x54, DamageState.Undamaged }, + { 0x55, DamageState.Undamaged }, + { 0x56, DamageState.Undamaged }, + + { 0x57, DamageState.Heavy }, + { 0x58, DamageState.Heavy }, + + { 0x59, DamageState.Heavy }, + + { 0x5A, DamageState.Critical }, + { 0x5B, DamageState.Critical }, + + // Ramps + { 0x5C, DamageState.Undamaged }, + { 0x5D, DamageState.Heavy }, + { 0x5E, DamageState.Undamaged }, + { 0x5F, DamageState.Heavy }, + { 0x60, DamageState.Undamaged }, + { 0x61, DamageState.Heavy }, + { 0x62, DamageState.Undamaged }, + { 0x63, DamageState.Heavy }, + + // Ramp duplicates + { 0x7A, DamageState.Undamaged }, + { 0x7B, DamageState.Undamaged }, + { 0x7C, DamageState.Undamaged }, + { 0x7D, DamageState.Undamaged }, + + // actually dead, placeholders for resurrection + { 0x64, DamageState.Undamaged }, + { 0x65, DamageState.Undamaged }, + }; + static readonly Dictionary ResourceFromOverlay = new Dictionary() { // "tib" - Regular Tiberium @@ -367,6 +420,21 @@ namespace OpenRA.Mods.TS.UtilityCommands new OwnerInit("Neutral") }; + DamageState damageState; + if (OverlayToHealth.TryGetValue(overlayType, out damageState)) + { + var health = 100; + if (damageState == DamageState.Critical) + health = 25; + else if (damageState == DamageState.Heavy) + health = 50; + else if (damageState == DamageState.Medium) + health = 75; + + if (health != 100) + ar.Add(new HealthInit(health)); + } + map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save())); continue; diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 5adcfcc1be..51ebf32705 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -81,6 +81,7 @@ Rules: ts|rules/shared-support.yaml ts|rules/shared-vehicles.yaml ts|rules/trees.yaml + ts|rules/bridges.yaml Weapons: ts|weapons/bombsandgrenades.yaml @@ -101,6 +102,7 @@ Sequences: ts|sequences/structures.yaml ts|sequences/vehicles.yaml ts|sequences/trees.yaml + ts|sequences/bridges.yaml VoxelSequences: ts|sequences/voxels.yaml diff --git a/mods/ts/rules/bridges.yaml b/mods/ts/rules/bridges.yaml new file mode 100644 index 0000000000..13d5bf8d2e --- /dev/null +++ b/mods/ts/rules/bridges.yaml @@ -0,0 +1,47 @@ +LOBRDG_A: + Inherits: ^LowBridge_A + +LOBRDG_A_D: + Inherits: ^LowBridge_A + -RenderSprites: + RenderSpritesEditorOnly: + Palette: terrainalpha + EditorOnlyTooltip: + Name: Dead Bridge + -LowBridge: + +LOBRDG_B: + Inherits: ^LowBridge_B + +LOBRDG_B_D: + Inherits: ^LowBridge_B + -RenderSprites: + RenderSpritesEditorOnly: + Palette: terrainalpha + EditorOnlyTooltip: + Name: Dead Bridge + -LowBridge: + +LOBRDG_R_SE: + Inherits: ^LowBridge_B + EditorOnlyTooltip: + Name: Bridge Ramp + Description: South East + +LOBRDG_R_NW: + Inherits: ^LowBridge_B + EditorOnlyTooltip: + Name: Bridge Ramp + Description: North West + +LOBRDG_R_NE: + Inherits: ^LowBridge_A + EditorOnlyTooltip: + Name: Bridge Ramp + Description: North East + +LOBRDG_R_SW: + Inherits: ^LowBridge_A + EditorOnlyTooltip: + Name: Bridge Ramp + Description: South West diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 9cc12dbfdb..357232fa3a 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -883,6 +883,36 @@ LineBuildNode: Connections: 0,-1, 0,1 +^LowBridge: + AlwaysVisible: + RenderSprites: + Palette: terraindecoration + WithSpriteBody: + AutoSelectionSize: + AppearsOnRadar: + RadarColorFromTerrain: + Terrain: Road + BodyOrientation: + UseClassicPerspectiveFudge: false + QuantizedFacings: 1 + Tooltip: + Name: Bridge + Health: + +^LowBridge_A: + Inherits: ^LowBridge + Building: + Footprint: ___ + Dimensions: 3, 1 + LowBridge: + +^LowBridge_B: + Inherits: ^LowBridge + Building: + Footprint: _ _ _ + Dimensions: 1, 3 + LowBridge: + ^HealsOnTiberium: DamagedByTerrain: Damage: -2 diff --git a/mods/ts/rules/palettes.yaml b/mods/ts/rules/palettes.yaml index d954d5f438..30083e5b13 100644 --- a/mods/ts/rules/palettes.yaml +++ b/mods/ts/rules/palettes.yaml @@ -109,5 +109,9 @@ BaseName: cloak BasePalette: player Alpha: 0.55 + PaletteFromPaletteWithAlpha@terrainalpha: + BasePalette: terraindecoration + Name: terrainalpha + Alpha: 0.55 PlayerHighlightPalette: MenuPaletteEffect: diff --git a/mods/ts/sequences/bridges.yaml b/mods/ts/sequences/bridges.yaml new file mode 100644 index 0000000000..ab7521bd51 --- /dev/null +++ b/mods/ts/sequences/bridges.yaml @@ -0,0 +1,70 @@ +lobrdg_a: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg10 # lobrdg11, 12, 13 + damaged-idle: lobrdg16 + sw: lobrdg14 + damaged-sw: lobrdg17 + ne: lobrdg15 + damaged-ne: lobrdg18 + +lobrdg_a_d: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg10 # actually lobrdg28 + +lobrdg_b: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg01 # lobrdg02, 03, 04 + damaged-idle: lobrdg07 + se: lobrdg06 + damaged-se: lobrdg09 + nw: lobrdg05 + damaged-nw: lobrdg08 + +lobrdg_b_d: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg01 # actually lobrdg27 + +lobrdg_r_se: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg19 + damaged-idle: lobrdg20 + +lobrdg_r_nw: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg21 + damaged-idle: lobrdg22 + +lobrdg_r_ne: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg23 + damaged-idle: lobrdg24 + +lobrdg_r_sw: + Defaults: + ZOffset: -1c511 + UseTilesetExtension: true + Start: 1 + idle: lobrdg25 + damaged-idle: lobrdg26 +