Merge pull request #9414 from atlimit8/TurretFacingsInit

Support loading multiple turret facings
This commit is contained in:
Oliver Brakmann
2015-11-01 13:18:17 +01:00
7 changed files with 49 additions and 20 deletions

View File

@@ -14,7 +14,15 @@ using OpenRA.Traits;
namespace OpenRA namespace OpenRA
{ {
public class ActorInitializer public interface IActorInitializer
{
World World { get; }
T Get<T>() where T : IActorInit;
U Get<T, U>() where T : IActorInit<U>;
bool Contains<T>() where T : IActorInit;
}
public class ActorInitializer : IActorInitializer
{ {
public readonly Actor Self; public readonly Actor Self;
public World World { get { return Self.World; } } public World World { get { return Self.World; } }
@@ -47,14 +55,6 @@ namespace OpenRA
public int Value(World world) { return value; } public int Value(World world) { return value; }
} }
public class TurretFacingInit : IActorInit<int>
{
[FieldFromYamlKey] readonly int value = 128;
public TurretFacingInit() { }
public TurretFacingInit(int init) { value = init; }
public int Value(World world) { return value; }
}
public class LocationInit : IActorInit<CPos> public class LocationInit : IActorInit<CPos>
{ {
[FieldFromYamlKey] readonly CPos value = CPos.Zero; [FieldFromYamlKey] readonly CPos value = CPos.Zero;

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Graphics
IEnumerable<IRenderable> Render(WorldRenderer wr, WPos pos); IEnumerable<IRenderable> Render(WorldRenderer wr, WPos pos);
} }
public class ActorPreviewInitializer public class ActorPreviewInitializer : IActorInitializer
{ {
public readonly ActorInfo Actor; public readonly ActorInfo Actor;
public readonly WorldRenderer WorldRenderer; public readonly WorldRenderer WorldRenderer;

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits
var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>(); var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0; var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing; var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
var anim = new Animation(init.World, image, () => turretFacing); var anim = new Animation(init.World, image, () => turretFacing);
anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits
var voxel = VoxelProvider.GetVoxel(image, Sequence); var voxel = VoxelProvider.GetVoxel(image, Sequence);
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing; var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, t.Turret);
var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw), facings); var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw), facings);
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation)); var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
var voxel = VoxelProvider.GetVoxel(image, Sequence); var voxel = VoxelProvider.GetVoxel(image, Sequence);
var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation)); var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation));
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing; var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret);
var turretBodyOrientation = new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw); var turretBodyOrientation = new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw);
var turretOrientation = new[] { turretBodyOrientation, body.QuantizeOrientation(orientation, facings) }; var turretOrientation = new[] { turretBodyOrientation, body.QuantizeOrientation(orientation, facings) };
yield return new VoxelAnimation(voxel, () => turretOffset, () => turretOrientation, () => false, () => 0); yield return new VoxelAnimation(voxel, () => turretOffset, () => turretOrientation, () => false, () => 0);

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -47,8 +48,15 @@ namespace OpenRA.Mods.Common.Traits
public WVec Offset { get { return info.Offset + localOffset; } } public WVec Offset { get { return info.Offset + localOffset; } }
public string Name { get { return info.Turret; } } public string Name { get { return info.Turret; } }
public static int GetInitialTurretFacing(ActorInitializer init, int def) public static int GetInitialTurretFacing(IActorInitializer init, int def, string turret = null)
{ {
if (turret != null && init.Contains<TurretFacingsInit>())
{
int facing;
if (init.Get<TurretFacingsInit, Dictionary<string, int>>().TryGetValue(turret, out facing))
return facing;
}
if (init.Contains<TurretFacingInit>()) if (init.Contains<TurretFacingInit>())
return init.Get<TurretFacingInit, int>(); return init.Get<TurretFacingInit, int>();
@@ -61,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
public Turreted(ActorInitializer init, TurretedInfo info) public Turreted(ActorInitializer init, TurretedInfo info)
{ {
this.info = info; this.info = info;
TurretFacing = GetInitialTurretFacing(init, info.InitialFacing); TurretFacing = GetInitialTurretFacing(init, info.InitialFacing, info.Turret);
} }
public void Created(Actor self) public void Created(Actor self)
@@ -128,4 +136,21 @@ namespace OpenRA.Mods.Common.Traits
return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)); return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing));
} }
} }
public class TurretFacingInit : IActorInit<int>
{
[FieldFromYamlKey] readonly int value = 128;
public TurretFacingInit() { }
public TurretFacingInit(int init) { value = init; }
public int Value(World world) { return value; }
}
public class TurretFacingsInit : IActorInit<Dictionary<string, int>>
{
[DictionaryFromYamlKey]
readonly Dictionary<string, int> value = new Dictionary<string, int>();
public TurretFacingsInit() { }
public TurretFacingsInit(Dictionary<string, int> init) { value = init; }
public Dictionary<string, int> Value(World world) { return value; }
}
} }

View File

@@ -8,6 +8,7 @@
*/ */
#endregion #endregion
using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Mods.Common.Warheads; using OpenRA.Mods.Common.Warheads;
@@ -107,11 +108,14 @@ namespace OpenRA.Mods.RA.Traits
if (facing != null) if (facing != null)
td.Add(new FacingInit(facing.Facing)); td.Add(new FacingInit(facing.Facing));
// TODO: This will only take the first turret if there are multiple var turreted = self.TraitsImplementing<Turreted>();
// This isn't a problem with the current units, but may be a problem for mods if (turreted.Any())
var turreted = self.TraitsImplementing<Turreted>().FirstOrDefault(); {
if (turreted != null) var turretFacings = new Dictionary<string, int>();
td.Add(new TurretFacingInit(turreted.TurretFacing)); foreach (var t in turreted)
turretFacings.Add(t.Name, t.TurretFacing);
td.Add(new TurretFacingsInit(turretFacings));
}
// TODO: untie this and move to Mods.Common // TODO: untie this and move to Mods.Common
var chronoshiftable = self.TraitOrDefault<Chronoshiftable>(); var chronoshiftable = self.TraitOrDefault<Chronoshiftable>();