private static void CompactAndContinue(MyFormation form, Point delta) { const double densistyLimit = 0.01; var move = form.ShiftTo(delta); // move.Interruptable = false; move.IsAnticollision = true; if (form.Density < densistyLimit && form.Alive && form.Count > 0) { var scale1 = form.ScalePoint(form.MassCenter, 0.1); // scale1.Interruptable = false; scale1.IsAnticollision = true; scale1.AbortAtWorldTick = Global.World.TickIndex + (int)(Math.Sqrt(form.Rect.SqrDiameter) / (4 * form.MaxSpeed)); var rotate = form.RotateCenter(Math.PI / 2); // rotate.Interruptable = false; rotate.StartCondition = () => Global.World.TickIndex >= scale1.AbortAtWorldTick; rotate.AbortAtWorldTick = scale1.AbortAtWorldTick + 10; move.StartCondition = () => Global.World.TickIndex >= rotate.AbortAtWorldTick; InsertToExecutingSequence(form, scale1, rotate, move); } else { InsertToExecutingSequence(form, move); } }
public static FormationResult CreateMyFormation(MyFormation f1, MyFormation f2) { var center = (f1.Rect.Center + f2.Rect.Center) / 2; var formation = new MyFormation { GroupIndex = GetMyFreeFormationIndex(), Alive = false, Type = f1.Type }; Global.ActionQueue.AbortOldActionsFor(f1); Global.ActionQueue.AbortOldActionsFor(f2); var select1 = f1.GetSelectionAction(); select1.Priority = ActionPriority.High; var select2 = f2.GetSelectionAction(); select2.ActionType = ActionType.AddToSelection; select2.Priority = ActionPriority.High; foreach (var vehicle in f1.Vehicles) { formation.Vehicles.Add(vehicle.Key, vehicle.Value); } foreach (var vehicle in f2.Vehicles) { formation.Vehicles.Add(vehicle.Key, vehicle.Value); } var assign = new Action { ActionType = ActionType.Assign, Group = formation.GroupIndex, Priority = ActionPriority.High }; assign.Callback = () => { formation.Update(); formation.Alive = true; assign.Status = ActionStatus.Finished; }; Global.MyFormations.Remove(f1.GroupIndex); Global.MyFormations.Remove(f2.GroupIndex); Global.MyFormations.Add(formation.GroupIndex, formation); var scale1 = formation.ScalePoint(center, 0.1); scale1.Priority = ActionPriority.High; var scale2 = formation.ScalePoint(center, 1.1); scale2.Priority = ActionPriority.High; return(new FormationResult { Formation = formation, GroupIndex = formation.GroupIndex, ActionList = new List <Action> { select1, select2, assign, scale1, scale2 } }); }