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; } }
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); }); } }
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()); } }