using System; using System.Collections.Generic; using System.Linq; using System.Text; using CommonLang.Property; using CommonAI.RTS; using CommonLang.Vector; using CommonAI.Zone.Instance; using CommonLang; using CommonAI.Zone.EventTrigger; namespace CommonAI.Zone.ZoneEditor.EventTrigger { [DescAttribute("地图坐标")] public abstract class PositionValue : AbstractValue { [DescAttribute("值", "值")] public class VALUE : PositionValue { public float X; public float Y; public override string ToString() { return string.Format("坐标({0},{1})", X, Y); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { return new Vector2(X, Y); } } [DescAttribute("单位坐标", "功能")] public class PositionOfUnit : PositionValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.NA(); public override string ToString() { return string.Format("({0})坐标", Unit); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return new Vector2(unit.X, unit.Y); } return null; } } [DescAttribute("Flag坐标", "功能")] public class CenterOfFlag : PositionValue { [DescAttribute("Flag")] public FlagValue Flag = new FlagValue.EditorPoint(); public override string ToString() { return string.Format("({0})坐标", Flag); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceFlag flag = Flag.GetValue(api, args); if (flag != null) { return new Vector2(flag.X, flag.Y); } return null; } } [DescAttribute("Flag内随机点", "功能")] public class RandomPointInFlag : PositionValue { [DescAttribute("Flag")] public FlagValue Flag = new FlagValue.EditorRegion(); public override string ToString() { return string.Format("({0})内随机点", Flag); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceFlag flag = Flag.GetValue(api, args); if (flag != null) { Random rd = api.ZoneAPI.RandomN; var pos = flag.getRandomPos(rd); return new Vector2(pos.X, pos.Y); } return null; } } [DescAttribute("相对坐标", "功能")] public class PointWithOffset : PositionValue { [DescAttribute("参照位置")] public PositionValue SrcPosition = new PositionValue.VALUE(); [DescAttribute("偏移位置")] public float OffsetX; [DescAttribute("偏移位置")] public float OffsetY; public override string ToString() { return string.Format("相对于({0})位置偏移({1}{2})", SrcPosition, OffsetX, OffsetY); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { Vector2 pos = SrcPosition.GetValue(api, args); if (pos != null) { pos.AddX(OffsetX); pos.AddY(OffsetY); return pos; } return null; } } [DescAttribute("相对坐标(变量)", "功能")] public class PointWithOffsetVar : PositionValue { [DescAttribute("参照位置")] public PositionValue SrcPosition = new PositionValue.VALUE(); [DescAttribute("偏移位置")] public RealValue OffsetX = new RealValue.VALUE(); [DescAttribute("偏移位置")] public RealValue OffsetY = new RealValue.VALUE(); public override string ToString() { return string.Format("相对于({0})位置偏移({1}{2})", SrcPosition, OffsetX, OffsetY); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { Vector2 pos = SrcPosition.GetValue(api, args); if (pos != null) { pos.AddX(OffsetX.GetValue(api, args)); pos.AddY(OffsetY.GetValue(api, args)); return pos; } return null; } } [DescAttribute("相对极坐标", "功能")] public class PointWithPolarOffset : PositionValue { [DescAttribute("参照位置")] public PositionValue SrcPosition = new PositionValue.VALUE(); [DescAttribute("半径")] public float Radius = 1; [DescAttribute("角度(0~360)")] public float Angle; public override string ToString() { return string.Format("相对于({0})位置偏移(半径:{1} 角度:{2})", SrcPosition, Radius, Angle); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { Vector2 pos = SrcPosition.GetValue(api, args); if (pos != null) { float da = CMath.DegreesToRadians(Angle); float dx = (float)(Math.Cos(da) * Radius); float dy = (float)(Math.Sin(da) * Radius); pos.AddX(dx); pos.AddY(dy); return pos; } return null; } } [DescAttribute("相对极坐标(变量)", "功能")] public class PointWithPolarOffsetVar : PositionValue { [DescAttribute("参照位置")] public PositionValue SrcPosition = new PositionValue.VALUE(); [DescAttribute("半径")] public RealValue Radius = new RealValue.VALUE(); [DescAttribute("角度(0~360)")] public RealValue Angle = new RealValue.VALUE(); public override string ToString() { return string.Format("相对于({0})位置偏移(半径:{1} 角度:{2})", SrcPosition, Radius, Angle); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { Vector2 pos = SrcPosition.GetValue(api, args); if (pos != null) { float va = Angle.GetValue(api, args); float vr = Radius.GetValue(api, args); float da = CMath.DegreesToRadians(va); float dx = (float)(Math.Cos(da) * vr); float dy = (float)(Math.Sin(da) * vr); pos.AddX(dx); pos.AddY(dy); return pos; } return null; } } [DescAttribute("单位相对极坐标", "功能")] public class PointWithPolarOfUnit : PositionValue { [DescAttribute("参照单位")] public UnitValue SrcUnit = new UnitValue.Trigging(); [DescAttribute("半径")] public float Radius = 1; [DescAttribute("角度(0~360)")] public float Angle; public override string ToString() { return string.Format("相对于单位({0})位置朝向偏移(半径:{1} 角度:{2})", SrcUnit, Radius, Angle); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = SrcUnit.GetValue(api, args); if (unit != null) { Vector2 pos = new Vector2(unit.X, unit.Y); float da = CMath.DegreesToRadians(Angle) + unit.Direction; float dx = (float)(Math.Cos(da) * Radius); float dy = (float)(Math.Sin(da) * Radius); pos.AddX(dx); pos.AddY(dy); return pos; } return null; } } [DescAttribute("单位相对极坐标(变量)", "功能")] public class PointWithPolarOfUnitVar : PositionValue { [DescAttribute("参照单位")] public UnitValue SrcUnit = new UnitValue.Trigging(); [DescAttribute("半径")] public RealValue Radius = new RealValue.VALUE(); [DescAttribute("角度(0~360)")] public RealValue Angle = new RealValue.VALUE(); public override string ToString() { return string.Format("相对于单位({0})位置朝向偏移(半径:{1} 角度:{2})", SrcUnit, Radius, Angle); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = SrcUnit.GetValue(api, args); if (unit != null) { float va = Angle.GetValue(api, args); float vr = Radius.GetValue(api, args); Vector2 pos = new Vector2(unit.X, unit.Y); float da = CMath.DegreesToRadians(va) + unit.Direction; float dx = (float)(Math.Cos(da) * vr); float dy = (float)(Math.Sin(da) * vr); pos.AddX(dx); pos.AddY(dy); return pos; } return null; } } [DescAttribute("相对范围内随机可移动点", "功能")] public class RandomMoveableInRange : PositionValue { [DescAttribute("参照位置")] public PositionValue SrcPosition = new PositionValue.VALUE(); [DescAttribute("半径")] public RealValue Radius = new RealValue.VALUE(20); public override string ToString() { return string.Format("相对于位置:{0}半径:{1}范围内随机可移动点", SrcPosition, Radius); } public override Vector2 GetValue(IEditorValueAdapter api, EventArguments args) { Vector2 pos = SrcPosition.GetValue(api, args); if (pos != null) { var node = api.ZoneAPI.PathFinder.FindNearRandomMoveableNode(api.ZoneAPI.RandomN, pos.X, pos.Y, Radius.GetValue(api, args)); if (node != null) { return new Vector2(node.PosX, node.PosY); } } return null; } } } }