using System; using System.Collections.Generic; using System.Text; using CommonLang.Property; using CommonAI.Zone.Attributes; using CommonAI.Zone.ZoneEditor; using CommonLang.Formula; using CommonAI.Zone.Instance; using CommonAI.RTS; using CommonLang.Vector; using CommonLang; using CommonAI.Zone.EventTrigger; namespace CommonAI.Zone.ZoneEditor.EventTrigger { [DescAttribute("整形")] public abstract class IntegerValue : AbstractValue { [DescAttribute("值", "值")] public class VALUE : IntegerValue { [DescAttribute("值")] public int Value = 0; public VALUE() { } public VALUE(int v) { this.Value = v; } public override string ToString() { return Value + ""; } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { return Value; } } [DescAttribute("整形计算", "数学")] public class IntegerOP : IntegerValue { [DescAttribute("值1")] public IntegerValue Value1 = new IntegerValue.VALUE(); [DescAttribute("运算符")] public NumericOP OP = NumericOP.ADD; [DescAttribute("值2")] public IntegerValue Value2 = new IntegerValue.VALUE(); public override string ToString() { return string.Format("({0}) {1} ({2})", Value1, FormulaHelper.ToString(OP), Value2); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { int ret = FormulaHelper.Calculate(Value1.GetValue(api, args), OP, Value2.GetValue(api, args)); return ret; } } [DescAttribute("函数-返回最小值", "数学")] public class MinFunction : IntegerValue { [DescAttribute("值1")] public IntegerValue Value1 = new IntegerValue.VALUE(); [DescAttribute("值2")] public IntegerValue Value2 = new IntegerValue.VALUE(); public override string ToString() { return string.Format("取{0}和{1}最小值", Value1, Value2); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { int v1 = Value1.GetValue(api, args); int v2 = Value2.GetValue(api, args); return Math.Min(v1, v2); } } [DescAttribute("函数-返回最大值", "数学")] public class MaxFunction : IntegerValue { [DescAttribute("值1")] public IntegerValue Value1 = new IntegerValue.VALUE(); [DescAttribute("值2")] public IntegerValue Value2 = new IntegerValue.VALUE(); public override string ToString() { return string.Format("取{0}和{1}最大值", Value1, Value2); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { int v1 = Value1.GetValue(api, args); int v2 = Value2.GetValue(api, args); return Math.Max(v1, v2); } } [DescAttribute("随机整形", "数学")] public class RandomInt : IntegerValue { [DescAttribute("最小值")] public IntegerValue Min = new IntegerValue.VALUE(0); [DescAttribute("最大值(小于)")] public IntegerValue Max = new IntegerValue.VALUE(10); public override string ToString() { return string.Format("{0}~{1}(不包括)随机数", Min, Max); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { int max = Max.GetValue(api, args); int min = Min.GetValue(api, args); return api.ZoneAPI.RandomN.Next(min, max); } } [DescAttribute("从小数转换", "转换")] public class ConvertFromReal : IntegerValue { [DescAttribute("值")] public RealValue Value = new RealValue.VALUE(); public override string ToString() { return string.Format("从{0}转换", Value); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { float value = Value.GetValue(api, args); return (int)value; } } [DescAttribute("从字符串转换", "转换")] public class ParseFromString : IntegerValue { [DescAttribute("值")] public StringValue Value = new StringValue.VALUE("1"); public override string ToString() { return string.Format("从{0}转换", Value); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { string value = Value.GetValue(api, args); int ret = 0; int.TryParse(value, out ret); return ret; } } [DescAttribute("迭代中的整形", "循环迭代")] public class PickingIteratorInt32 : IntegerValue { public override string ToString() { return "迭代中的整形"; } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { return args.IteratingInt32; } } //---------------------------------------------------------------------------------------------- #region __场景__ [DescAttribute("游戏运行时间(秒)", "场景")] public class TotalTimeSEC : IntegerValue { public override string ToString() { return string.Format("游戏运行时间(秒)"); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { return api.ZoneAPI.PassTimeSEC; } } [DescAttribute("阵营总共死亡数量", "场景")] public class TotalForceDeadCount : IntegerValue { [DescAttribute("阵营")] public IntegerValue SelectForce = new IntegerValue.VALUE(0); public override string ToString() { return string.Format("{0}阵营总共死亡数量", SelectForce); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { byte force = (byte)SelectForce.GetValue(api, args); return api.ZoneAPI.GetTotalForceDead(force); ; } } [DescAttribute("场景内所有单位数量", "场景")] public class ZoneTotalUnitCount : IntegerValue { public override string ToString() { return string.Format("场景内所有单位数量"); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { return api.ZoneAPI.GetAllUnitsCount(); } } [DescAttribute("场景内某阵营单位数量", "场景")] public class ZoneTotalForceUnitCount : IntegerValue { [DescAttribute("阵营")] public IntegerValue SelectForce = new IntegerValue.VALUE(0); public override string ToString() { return string.Format("场景内阵营{0}单位数量", SelectForce); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { byte force = (byte)SelectForce.GetValue(api, args); return api.ZoneAPI.GetForceUnitsCount(force); ; } } [DescAttribute("场景用户自定义属性", "场景")] public class ZoneIntegerAttribute : IntegerValue { [DescAttribute("键值")] public string Key; public override string ToString() { return string.Format("场景键值[{0}]", Key); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { try { return int.Parse(api.ZoneAPI.GetAttribute(Key) as string); } catch (Exception err) { Console.WriteLine("ZoneIntegerAttribute : " + Key + ", catch: " + err); } return 0; } } #endregion //---------------------------------------------------------------------------------------------- #region __单位__ [DescAttribute("单位用户自定义属性", "单位 - 属性")] public class UnitIntegerAttribute : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); [DescAttribute("键值")] public string Key; public override string ToString() { return string.Format("单位({0})键值[{1}]", Unit, Key); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { try { return int.Parse(unit.GetAttribute(Key) as string); } catch (Exception err) { Console.WriteLine("UnitIntegerAttribute : " + Key + ", catch: " + err); } return 0; } return 0; } } [DescAttribute("单位模板ID", "单位 - 属性")] public class UnitTemplateID : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("单位({0})模板ID", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Info.TemplateID; } return 0; } } [DescAttribute("单位血量", "单位 - 属性")] public class UnitHP : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("单位({0}).HP", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.CurrentHP; } return 0; } } [DescAttribute("单位最大血量", "单位 - 属性")] public class UnitMaxHP : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("单位({0}).MaxHP", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.MaxHP; } return 0; } } [DescAttribute("单位等级", "单位 - 属性")] public class UnitLevel : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("单位({0}).Level", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Level; } return 0; } } [DescAttribute("单位阵营", "单位 - 属性")] public class UnitForce : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("单位({0}).阵营", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Force; } return 0; } } [DescAttribute("单位-死亡次数", "单位 - 统计")] public class UnitDeadCount : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("({0})死亡次数", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Statistic.DeadCount; } return 0; } } [DescAttribute("单位-总共杀死怪物数量", "单位 - 统计")] public class UnitKillUnitCount : IntegerValue { [DescAttribute("杀死的单位类型")] public UnitInfo.UnitType KillType = UnitInfo.UnitType.TYPE_MONSTER; [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("({0})总共杀死怪物数量", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Statistic.GetKillUnitCount(KillType); } return 0; } } [DescAttribute("单位-总共杀死玩家数量", "单位 - 统计")] public class UnitKillPlayerCount : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("{0}总共杀死玩家数量", Unit); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return unit.Statistic.KillPlayerCount; } return 0; } } [DescAttribute("单位拥有道具数量", "单位 - 属性")] public class UnitInventoryItemCount : IntegerValue { [DescAttribute("单位")] public UnitValue Unit = new UnitValue.Trigging(); [DescAttribute("物品ID")] public ItemTemplateValue Item = new ItemTemplateValue.Template(); public override string ToString() { return string.Format("单位({0})拥有道具{1}数量", Unit, Item); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); ItemTemplate temp = Item.GetValue(api, args); if (unit != null && temp != null) { return unit.GetItemCountInInventory(temp.ID); } return 0; } } #endregion //---------------------------------------------------------------------------------------------- #region __FLAGS__ [DescAttribute("区域内单位数量", "区域")] public class RegionUnitCount : IntegerValue { [DescAttribute("区域")] public FlagValue Region = new FlagValue.EditorRegion(); public override string ToString() { return string.Format("区域({0})内单位数量", Region); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { ZoneRegion region = Region.GetValue(api, args) as ZoneRegion; if (region != null) { return region.getObjectsCountInRegion(); } return 0; } } [DescAttribute("区域内指定阵营单位数量", "区域")] public class RegionForceUnitCount : IntegerValue { [DescAttribute("区域")] public FlagValue Region = new FlagValue.EditorRegion(); [DescAttribute("阵营")] public IntegerValue Force = new IntegerValue.VALUE(0); public override string ToString() { return string.Format("区域({0})内阵营{1}的单位数量", Region, Force); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { ZoneRegion region = Region.GetValue(api, args) as ZoneRegion; if (region != null) { int force = Force.GetValue(api, args); int ret = region.getObjectsCountInRegion((InstanceUnit unit) => { return (unit.IsPlayer && !unit.IsDead() && unit.Force == force); }); return ret; } return 0; } } [DescAttribute("区域内指定阵营和类型单位数量", "区域")] public class RegionForceTypeUnitCount : IntegerValue { [DescAttribute("区域")] public FlagValue Region = new FlagValue.EditorRegion(); [DescAttribute("阵营")] public IntegerValue Force = new IntegerValue.VALUE(0); [DescAttribute("类型")] public UnitInfo.UnitType ObjType = UnitInfo.UnitType.TYPE_PLAYER; public override string ToString() { return string.Format("区域({0})内阵营{1}的类型为{2}单位数量", Region, Force, ObjType); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { ZoneRegion region = Region.GetValue(api, args) as ZoneRegion; if (region != null) { byte force = (byte)Force.GetValue(api, args); int ret = region.getObjectsCountInRegion((InstanceUnit unit) => { if (unit.Info.UType == ObjType && unit.Force == force) { return true; } return false; }); return ret; } return 0; } } [DescAttribute("遍历区域内满足条件单位数量", "区域")] public class RegionExpectUnitCount : IntegerValue { [DescAttribute("区域")] public FlagValue Region = new FlagValue.EditorRegion(); [DescAttribute("条件")] public BooleanValue Condition = new BooleanValue.UnitIsAlived(); public override string ToString() { return string.Format("遍历区域({0})内满足({1})的单位数量", Region, Condition); } public override Int32 GetValue(IEditorValueAdapter api, EventArguments args) { EventTriggerAdapter evtapi = api as EventTriggerAdapter; if (evtapi != null) { ZoneRegion region = Region.GetValue(api, args) as ZoneRegion; if (region != null) { int ret = 0; using (var units = ListObjectPool.AllocAutoRelease()) { args = args.Clone(); region.getObjectsInRegion(units); foreach (InstanceUnit u in units) { args.IteratingUnit = (u); bool coodi = Condition.GetValue(api, args); if (coodi) { ret++; } args.IteratingUnit = (null); } } return ret; } } return 0; } } #endregion //---------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------- } }