示例#1
0
文件: State.cs 项目: baguio/SSC-AI
        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++;
        }
示例#2
0
 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);
                 }
             }
         }
     }
 }
示例#3
0
 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;
 }
示例#4
0
 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;
 }