Example #1
0
        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);
            }
        }
Example #2
0
        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
                }
            });
        }