public static CombatEventTree Parse(CombatEvent evt) { CombatEventTree root = new CombatEventTree(); root.Event = evt; root.NodeState = CombatEventTreeState.INITED; root.TreeState = CombatEventTreeState.INITED; if (evt.Children == null) { return(root); } // children are CombatEffectEvent for (int i = 0, cnt = evt.Children.Count; i < cnt; ++i) { CombatEffectEvent effect = evt.Children[i] as CombatEffectEvent; CombatEventTree sub_tree = Parse(effect); if (effect.Parent < 0) { root.AddChild(sub_tree); } else { CombatEvent parent_effect = evt.Children[effect.Parent]; CombatEventTree parent = root.FindInChildren(parent_effect); parent.AddChild(sub_tree); } } return(root); }
public CombatEventTree FindInSiblings(CombatEvent evt) { if (m_parent == null) { return(null); } // speed up CombatEventTree found = null; if (s_nodeCache.TryGetValue(evt.GetHashCode(), out found)) { if (found.IsAncestor(m_parent) && found != this) { return(found); } } EB.Debug.LogWarning("CombatEventTree.FindInSiblings: cache miss"); var iter = m_parent.GetChildrenNonAlloc(); while (iter.MoveNext()) { CombatEventTree sibling = iter.Current; if (sibling == this) { continue; } if (sibling.Event.Equals(evt)) { iter.Dispose(); return(sibling); } } iter.Dispose(); iter = m_parent.GetChildrenNonAlloc(); while (iter.MoveNext()) { CombatEventTree sibling = iter.Current; if (sibling == this) { continue; } found = sibling.FindInChildren(evt); if (found != null) { iter.Dispose(); return(found); } } iter.Dispose(); return(null); }
public CombatEventTree FindInChildren(CombatEvent evt) { // speed up CombatEventTree found = null; if (s_nodeCache.TryGetValue(evt.GetHashCode(), out found)) { if (found.IsAncestor(this)) { return(found); } } EB.Debug.LogWarning("CombatEventTree.FindInChildren: cache miss"); var iter = GetChildrenNonAlloc(); while (iter.MoveNext()) { CombatEventTree child = iter.Current; if (child.Event.Equals(evt)) { iter.Dispose(); return(child); } found = child.FindInChildren(evt); if (found != null) { iter.Dispose(); return(found); } } iter.Dispose(); return(null); }