private bool KindCheck(ActionEffectInfo info, FlyTextKind targetKind)
        {
            var result = targetKind == info.kind;

            // Screenlog will log misses from enemies as Named/Miss, but they will show up to us as Named/Dodge
            if (!result)
            {
                return(targetKind is FlyTextKind.NamedDodge or FlyTextKind.Dodge && info.kind is FlyTextKind.NamedMiss or FlyTextKind.Miss);
            }
            return(true);
        }
        /**
         * @brief 提取数据
         *
         * @param node
         *
         * @return
         */
        public bool CollectDataFromDBC(DBC_Row node)
        {
            ActionId        = DBCUtil.ExtractNumeric <int>(node, "Id", 0, true);
            ActionLogicId   = DBCUtil.ExtractNumeric <int>(node, "LogicId", 0, true);
            BreakLevel      = DBCUtil.ExtractNumeric <int>(node, "BreakLevel", 0, true);
            CallbackSection = DBCUtil.ExtractNumeric <int>(node, "CallbackSection", 0, true);
            CallbackPoint   = DBCUtil.ExtractNumeric <float>(node, "CallbackPoint", 0, true);
            SectionNumber   = DBCUtil.ExtractNumeric <int>(node, "SectionNum", 0, true);

            EffectNum = DBCUtil.ExtractNumeric <int>(node, "EffectNum", 0, true);
            EffectList.Clear();
            for (int i = 0; i < EffectNum; i++)
            {
                string           keySuffix   = i.ToString();
                ActionEffectInfo effect_info = new ActionEffectInfo();
                effect_info.EffectTime       = DBCUtil.ExtractNumeric <float>(node, "EffectTime" + keySuffix, 0, false);
                effect_info.SkeletonNodeName = DBCUtil.ExtractString(node, "SkeletonNodeName" + keySuffix, "", false);
                effect_info.EffectName       = DBCUtil.ExtractString(node, "EffectName" + keySuffix, "", false);
                EffectList.Insert(i, effect_info);
            }

            for (int i = 0; i < SectionNumber; i++)
            {
                string        keySuffix     = i.ToString();
                ActionSection actionSection = new ActionSection();
                actionSection.ActionType  = DBCUtil.ExtractNumeric <int>(node, "ActionType" + keySuffix, -1, true);
                actionSection.WapMode     = DBCUtil.ExtractString(node, "WapMode" + keySuffix, "ONCE", false);
                actionSection.IsUpperBody = DBCUtil.ExtractBool(node, "IsUpperBody" + keySuffix, false, false);
                actionSection.PlaySpeed   = DBCUtil.ExtractNumeric <float>(node, "PlaySpeed" + keySuffix, 1.0f, false);
                actionSection.PlayTime    = DBCUtil.ExtractNumeric <float>(node, "PlayTime" + keySuffix, 0, false);
                actionSection.MoveSpeed   = DBCUtil.ExtractNumeric <float>(node, "MoveSpeed" + keySuffix, 0, false);
                actionSection.MoveTowards = DBCUtil.ExtractNumeric <int>(node, "MoveTowards" + keySuffix, 0, false);
                SectionList.Insert(i, actionSection);
            }

            ParamNum = DBCUtil.ExtractNumeric <int>(node, "ParamNum", 0, false);
            if (ParamNum > 0)
            {
                for (int i = 0; i < ParamNum; ++i)
                {
                    string key = "Param" + i.ToString();
                    ExtraParams.Insert(i, DBCUtil.ExtractString(node, key, "", false));
                }
            }
            return(true);
        }
        public void AddEffect(ActionEffectInfo info)
        {
            info.tick = GetTick();

            if (_store.TryGetValue(info.value, out var tmpList))
            {
                tmpList.Add(info);
            }
            else
            {
                tmpList = new List <ActionEffectInfo> {
                    info
                };
                _store.TryAdd(info.value, tmpList);
            }

            StoreLog($"Added effect {info}");
        }
 private bool TargetCheck(ActionEffectInfo info, uint charaId, List <uint> petIds)
 {
     return(info.sourceId == charaId || info.targetId == charaId || petIds.Contains(info.sourceId));
 }
        public bool TryGetEffect(uint value, FlyTextKind targetKind, uint charaId, List <uint> petIds, out ActionEffectInfo info)
        {
            StoreLog($"Looking for effect {value} {targetKind}...");
            info = default;
            if (!_store.TryGetValue(value, out var list))
            {
                return(false);
            }

            var effect = list.FirstOrDefault(x => x.value == value && x.step == ActionStep.Screenlog && KindCheck(x, targetKind) && TargetCheck(x, charaId, petIds));

            if (!list.Remove(effect))
            {
                return(false);
            }

            info = effect;
            StoreLog($"Retrieved effect {effect}");
            return(true);
        }
	public BaseInfo()
	{
		attackEffectInfo = new ActionEffectInfo();
		animationInfo = new AnimationInfo();
		audioInfo = new AudioInfo();
		
		attackModifierIcons = new List<string>();
		
		projectileInfo = null;
	}