Add static Tiberian Sun low bridges.

This commit is contained in:
Matthias Mailänder
2016-06-12 09:31:39 +02:00
committed by Paul Chote
parent 5482fdb839
commit 4717d3e190
9 changed files with 335 additions and 34 deletions

View File

@@ -50,6 +50,13 @@ namespace OpenRA.Mods.Common.Traits
yield return tile + position; yield return tile + position;
} }
public static IEnumerable<CPos> 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<CVec> TilesWhere(string name, CVec dim, char[] footprint, Func<char, bool> cond) static IEnumerable<CVec> TilesWhere(string name, CVec dim, char[] footprint, Func<char, bool> cond)
{ {
if (footprint.Length != dim.X * dim.Y) if (footprint.Length != dim.X * dim.Y)

View File

@@ -69,6 +69,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="Activities\VoxelHarvesterDockSequence.cs" /> <Compile Include="Activities\VoxelHarvesterDockSequence.cs" />
<Compile Include="SpriteLoaders\TmpTSLoader.cs" /> <Compile Include="SpriteLoaders\TmpTSLoader.cs" />
<Compile Include="Traits\Buildings\LowBridge.cs" />
<Compile Include="Traits\Buildings\TiberianSunRefinery.cs" /> <Compile Include="Traits\Buildings\TiberianSunRefinery.cs" />
<Compile Include="Traits\Render\WithDockingOverlay.cs" /> <Compile Include="Traits\Render\WithDockingOverlay.cs" />
<Compile Include="Traits\Render\WithPermanentInjury.cs" /> <Compile Include="Traits\Render\WithPermanentInjury.cs" />

View File

@@ -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<BuildingInfo>
{
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<CPos> cells;
public LowBridge(Actor self, LowBridgeInfo info)
{
this.info = info;
var buildingInfo = self.Info.TraitInfo<BuildingInfo>();
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<DomainIndex>();
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<IPositionableInfo>() && !a.Trait<IPositionable>().CanEnterCell(c))
a.Kill(self);
}
void INotifyRemovedFromWorld.RemovedFromWorld(Actor self)
{
UpdateTerrain(self, byte.MaxValue);
KillUnitsOnBridge(self);
}
}
}

View File

@@ -18,6 +18,7 @@ using OpenRA.FileSystem;
using OpenRA.Mods.Common; using OpenRA.Mods.Common;
using OpenRA.Mods.Common.FileFormats; using OpenRA.Mods.Common.FileFormats;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.TS.UtilityCommands namespace OpenRA.Mods.TS.UtilityCommands
{ {
@@ -72,40 +73,41 @@ namespace OpenRA.Mods.TS.UtilityCommands
{ 0x47, "palet02" }, { 0x47, "palet02" },
{ 0x48, "palet03" }, { 0x48, "palet03" },
{ 0x49, "palet04" }, { 0x49, "palet04" },
/*
{ 0x4A, "lobrdg01" }, { 0x4A, "lobrdg_b" }, // lobrdg01
{ 0x4B, "lobrdg02" }, { 0x4B, "lobrdg_b" }, // lobrdg02
{ 0x4C, "lobrdg03" }, { 0x4C, "lobrdg_b" }, // lobrdg03
{ 0x4D, "lobrdg04" }, { 0x4D, "lobrdg_b" }, // lobrdg04
{ 0x4E, "lobrdg05" }, { 0x4E, "lobrdg_b" }, // lobrdg05
{ 0x4F, "lobrdg06" }, { 0x4F, "lobrdg_b" }, // lobrdg06
{ 0x50, "lobrdg07" }, { 0x50, "lobrdg_b" }, // lobrdg07
{ 0x51, "lobrdg08" }, { 0x51, "lobrdg_b" }, // lobrdg08
{ 0x52, "lobrdg09" }, { 0x52, "lobrdg_b" }, // lobrdg09
{ 0x53, "lobrdg10" }, { 0x53, "lobrdg_a" }, // lobrdg10
{ 0x54, "lobrdg11" }, { 0x54, "lobrdg_a" }, // lobrdg11
{ 0x55, "lobrdg12" }, { 0x55, "lobrdg_a" }, // lobrdg12
{ 0x56, "lobrdg13" }, { 0x56, "lobrdg_a" }, // lobrdg13
{ 0x57, "lobrdg14" }, { 0x57, "lobrdg_a" }, // lobrdg14
{ 0x58, "lobrdg15" }, { 0x58, "lobrdg_a" }, // lobrdg15
{ 0x59, "lobrdg16" }, { 0x59, "lobrdg_a" }, // lobrdg16
{ 0x5A, "lobrdg17" }, { 0x5A, "lobrdg_a" }, // lobrdg17
{ 0x5B, "lobrdg18" }, { 0x5B, "lobrdg_a" }, // lobrdg18
{ 0x5C, "lobrdg19" }, { 0x5C, "lobrdg_r_se" }, // lobrdg19
{ 0x5D, "lobrdg20" }, { 0x5D, "lobrdg_r_se" }, // lobrdg20
{ 0x5E, "lobrdg21" }, { 0x5E, "lobrdg_r_nw" }, // lobrdg21
{ 0x5F, "lobrdg22" }, { 0x5F, "lobrdg_r_nw" }, // lobrdg22
{ 0x60, "lobrdg23" }, { 0x60, "lobrdg_r_ne" }, // lobrdg23
{ 0x61, "lobrdg24" }, { 0x61, "lobrdg_r_ne" }, // lobrdg24
{ 0x62, "lobrdg25" }, { 0x62, "lobrdg_r_sw" }, // lobrdg25
{ 0x63, "lobrdg26" }, { 0x63, "lobrdg_r_sw" }, // lobrdg26
{ 0x64, "lobrdg27" }, { 0x64, "lobrdg_b_d" }, // lobrdg27
{ 0x65, "lobrdg28" }, { 0x65, "lobrdg_a_d" }, // lobrdg28
{ 0x7A, "lobrdg1" },
{ 0x7B, "lobrdg2" }, { 0x7A, "lobrdg_r_se" }, // lobrdg1
{ 0x7C, "lobrdg3" }, { 0x7B, "lobrdg_r_nw" }, // lobrdg2
{ 0x7D, "lobrdg4" }, { 0x7C, "lobrdg_r_ne" }, // lobrdg3
*/ { 0x7D, "lobrdg_r_sw" }, // lobrdg4
{ 0xA7, "veinhole" }, { 0xA7, "veinhole" },
{ 0xA8, "srock01" }, { 0xA8, "srock01" },
{ 0xA9, "srock02" }, { 0xA9, "srock02" },
@@ -157,6 +159,57 @@ namespace OpenRA.Mods.TS.UtilityCommands
{ 0x7D, new Size(3, 1) }, { 0x7D, new Size(3, 1) },
}; };
static readonly Dictionary<byte, DamageState> OverlayToHealth = new Dictionary<byte, DamageState>()
{
// 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<byte, byte[]> ResourceFromOverlay = new Dictionary<byte, byte[]>() static readonly Dictionary<byte, byte[]> ResourceFromOverlay = new Dictionary<byte, byte[]>()
{ {
// "tib" - Regular Tiberium // "tib" - Regular Tiberium
@@ -367,6 +420,21 @@ namespace OpenRA.Mods.TS.UtilityCommands
new OwnerInit("Neutral") 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())); map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, ar.Save()));
continue; continue;

View File

@@ -81,6 +81,7 @@ Rules:
ts|rules/shared-support.yaml ts|rules/shared-support.yaml
ts|rules/shared-vehicles.yaml ts|rules/shared-vehicles.yaml
ts|rules/trees.yaml ts|rules/trees.yaml
ts|rules/bridges.yaml
Weapons: Weapons:
ts|weapons/bombsandgrenades.yaml ts|weapons/bombsandgrenades.yaml
@@ -101,6 +102,7 @@ Sequences:
ts|sequences/structures.yaml ts|sequences/structures.yaml
ts|sequences/vehicles.yaml ts|sequences/vehicles.yaml
ts|sequences/trees.yaml ts|sequences/trees.yaml
ts|sequences/bridges.yaml
VoxelSequences: VoxelSequences:
ts|sequences/voxels.yaml ts|sequences/voxels.yaml

View File

@@ -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

View File

@@ -883,6 +883,36 @@
LineBuildNode: LineBuildNode:
Connections: 0,-1, 0,1 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: ^HealsOnTiberium:
DamagedByTerrain: DamagedByTerrain:
Damage: -2 Damage: -2

View File

@@ -109,5 +109,9 @@
BaseName: cloak BaseName: cloak
BasePalette: player BasePalette: player
Alpha: 0.55 Alpha: 0.55
PaletteFromPaletteWithAlpha@terrainalpha:
BasePalette: terraindecoration
Name: terrainalpha
Alpha: 0.55
PlayerHighlightPalette: PlayerHighlightPalette:
MenuPaletteEffect: MenuPaletteEffect:

View File

@@ -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