Esempio n. 1
0
        void OnManipulate()
        {
            if (holder.HeldId == Virus.Id.Null)
            {
                var column = VirusFromPosition(pos => pos.X == holder.X).OrderByDescending(v => v.VirusPosition.Y);
                if (column.Count() < 1)
                {
                    return;
                }

                var toTake = column.First();
                holder.HeldId = toTake.VirusId;
                Change.Invoke(toTake.VirusId, toTake.VirusPosition, Position.Hand());
            }
            else
            {
                var toPlace = VirusFromId(holder.HeldId).First();
                var end     = crowd.Select(v => v.VirusPosition)
                              .Where(pos => pos.X == holder.X)
                              .OrderByDescending(pos => pos.Y)
                              .Select(pos => pos.Y + 1)
                              .DefaultIfEmpty(1)
                              .First();
                Change.Invoke(toPlace.VirusId, Position.Hand(), Position.OnBoard(holder.X, end));

                holder.HeldId = Virus.Id.Null;
            }
        }
Esempio n. 2
0
        void OnChange(Virus.Id id, Position from, Position to)
        {
            var changed = VirusFromId(id).First();

            changed.VirusPosition = to;

            // Pull up
            if (1 < to.Y && to.Y < from.Y)
            {
                Where(to.WithY(to.Y + 1), downer => Change.Invoke(downer.VirusId, downer.VirusPosition, to));
            }

            // Place
            if (1 < to.Y && from == Position.Hand())
            {
                Where(to.WithY(to.Y - 1), upper => {
                    if (!(
                            (upper.VirusGrade == Virus.Grade.Big && changed.VirusGrade == Virus.Grade.Mid) ||
                            (upper.VirusGrade == Virus.Grade.Mid && changed.VirusGrade == Virus.Grade.Tiny)
                            ))
                    {
                        return;
                    }
                    Absorb.Invoke(upper.VirusId, changed.VirusId);
                });
            }
        }
Esempio n. 3
0
 void OnMove(int X)
 {
     holder.X = X;
     if (holder.HeldId != Virus.Id.Null)
     {
         var toPlace = VirusFromId(holder.HeldId).First();
         Change.Invoke(toPlace.VirusId, Position.Hand(), Position.Hand());
     }
 }