private void WriteAxis(PositionEffectAxisInfo axis, XmlWriter writer) { if (axis.Base.HasValue) { writer.WriteAttributeString("base", axis.Base.Value.ToString()); } else { writer.WriteAttributeString("base", "Inherit"); } if (axis.Offset.HasValue) { writer.WriteAttributeString("offset", axis.Offset.Value.ToString()); writer.WriteAttributeString("direction", axis.OffsetDirection.ToString()); } }
private PositionEffectAxisInfo ParsePositionBehavior(PositionEffectPartInfo info, XElement prop) { var axisInfo = new PositionEffectAxisInfo(); XAttribute baseAttr = prop.Attribute("base"); if (baseAttr != null) { if (baseAttr.Value == "Inherit") { axisInfo.Base = null; } else { axisInfo.Base = prop.TryAttribute <float>("base"); } } axisInfo.BaseVar = prop.TryAttribute <string>("baseVar"); if (prop.Attribute("offset") != null) { axisInfo.Offset = prop.TryAttribute <float?>("offset"); try { axisInfo.OffsetDirection = prop.GetAttribute <OffsetDirection>("direction"); } catch { throw new GameXmlException(prop, "Position offset direction was not valid!"); } } axisInfo.OffsetVar = prop.TryAttribute <string>("offsetVar"); return(axisInfo); }
private Effect ParsePositionBehavior(PositionEffectAxisInfo axisInfo, Axis axis) { Effect action = e => { }; var baseVar = axisInfo.BaseVar; var offsetVar = axisInfo.OffsetVar; if (baseVar != null) { if (axis == Axis.X) { action = entity => { var x = CheckNumericVar(entity, baseVar); if (x.HasValue) { PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(x.Value, pos.Position.Y)); } } } } ; else { action = entity => { var y = CheckNumericVar(entity, baseVar); if (y.HasValue) { PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X, y.Value)); } } } }; } else if (axisInfo.Base == null) { action = entity => { PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null && entity.Parent != null) { PositionComponent parentPos = entity.Parent.GetComponent <PositionComponent>(); if (parentPos != null) { pos.SetPosition(axis == Axis.X ? new PointF(parentPos.Position.X, pos.Position.Y) : new PointF(pos.Position.X, parentPos.Position.Y)); } } }; } else { if (axis == Axis.X) { action = entity => { PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(axisInfo.Base.Value, pos.Position.Y)); } } } ; else { action = entity => { PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X, axisInfo.Base.Value)); } } }; } if (axisInfo.Offset != null || offsetVar != null) { switch (axisInfo.OffsetDirection) { case OffsetDirection.Inherit: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null && entity.Parent != null) { Direction offdir = entity.Parent.Direction; switch (offdir) { case Direction.Down: pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset)); break; case Direction.Up: pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset)); break; case Direction.Left: pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y)); break; case Direction.Right: pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y)); break; } } }; break; case OffsetDirection.Input: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); InputComponent input = entity.GetComponent <InputComponent>(); if (input != null && pos != null) { if (axis == Axis.Y) { if (input.Down) { pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset)); } else if (input.Up) { pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset)); } } else { if (input.Left) { pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y)); } else if (input.Right || (!input.Up && !input.Down)) { pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y)); } } } }; break; case OffsetDirection.Left: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y)); } }; break; case OffsetDirection.Right: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y)); } }; break; case OffsetDirection.Down: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset)); } }; break; case OffsetDirection.Up: action += entity => { var offset = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0; PositionComponent pos = entity.GetComponent <PositionComponent>(); if (pos != null) { pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset)); } }; break; } } return(action); }