public State (State parent, float second, int distance_from_start, bool limbs_crossed) { this.parent = parent; this.second = second; this.distance_from_start = distance_from_start; this.limbs_crossed = limbs_crossed; this.id = NxtId++; }
public static void Calculate (State from, Node to, List<Limb[]> output) { if (!IsArcValid(from, to)) { return; } int hoverable_count = 0; Limb[] original = new Limb[from.limbs.Length]; for (int i = 0; i < from.limbs.Length; ++i) { Limb from_limb = from.limbs[i]; Analyzer.Node.Limb to_limb = to.limbs[i]; if (to_limb == null) { original[i] = Limb.ToPassiveDown(from_limb, to.second); } else { original[i] = LimbHelper.TransitionToV3(from_limb, to_limb, to.second); } if (IsHoverable(original[i].main.movement)) { ++hoverable_count; } if (IsHoverable(original[i].sub.movement)) { ++hoverable_count; } else if (IsHoverable(original[i].extra.movement)) { ++hoverable_count; } original[i].sanityCheck(); } if (!IsOverlapping(original) && IsValidOrNot3Bracket(original)) { output.Add(original); } if (hoverable_count >= 2) { for (int limb_index = 0; limb_index < from.limbs.Length; ++limb_index) { Limb limb = original[limb_index]; if (IsHoverable(limb.main.movement)) { Limb[] with_unknown = CloneWithHover(original, limb_index, to.second, 0); if (!IsOverlapping(with_unknown) && IsValidOrNot3Bracket(with_unknown)) { output.Add(with_unknown); } } if (IsHoverable(limb.sub.movement)) { if (IsHoverable(limb.extra.movement)) { Limb[] with_unknown = CloneWithHover(original, limb_index, to.second, 1, 2); if (!IsOverlapping(with_unknown) && IsValidOrNot3Bracket(with_unknown)) { output.Add(with_unknown); } } else { Limb[] with_unknown = CloneWithHover(original, limb_index, to.second, 1); if (!IsOverlapping(with_unknown) && IsValidOrNot3Bracket(with_unknown)) { output.Add(with_unknown); } } } else if (IsHoverable(limb.extra.movement)) { Limb[] with_unknown = CloneWithHover(original, limb_index, to.second, 2); if (!IsOverlapping(with_unknown) && IsValidOrNot3Bracket(with_unknown)) { output.Add(with_unknown); } } } } }
public static bool IsArcValid (State from, Node to) { for (int i = 0; i < from.limbs.Length; ++i) { if (to.limbs[i] == null) { continue; } if (!LimbHelper.IsArcValid(from.limbs[i], to.limbs[i])) { return false; } } return true; }
public static State TransitionTo (State from, Limb[] to, float second, int distance_from_start, Beat beat, ICostFactory cost_factory) { State nxt = null; Vector facing = FacingCalculator.Calculate(to, from.facing); Vector facing_desired = FacingCalculator.CalculateDesiredFacing(facing, from.facing_desired); if (IsArcValidWithoutCrossing(to, facing_desired)) { nxt = new State(from, second, distance_from_start, false); } else if (IsArcValidWithCrossing(to, facing_desired)) { //nxt = new State(from, second, distance_from_start, true); return null; } else { return null; } //Transition for (int i = 0; i < from.limbs.Length; ++i) { nxt.limbs[i] = to[i]; } nxt.beat = beat; nxt.facing = facing; nxt.facing_desired = facing_desired; nxt.sanityCheck(); nxt.cost = cost_factory.Calculate(nxt); return nxt; }