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 OnDrop() { // Shift all virus down foreach (var v in crowd) { if (v.VirusPosition.IsHand) { continue; } Change.Invoke(v.VirusId, v.VirusPosition, v.VirusPosition.WithY(v.VirusPosition.Y + 1) ); } var grades = Enum.GetValues(typeof(Virus.Grade)); var newRow = Enumerable.Range(1, Width).Select(i => { var v = new Virus(); v.VirusPosition = Position.OnBoard(i, 1); v.VirusGrade = (Virus.Grade)grades.GetValue(rand.Next(grades.Length)); return(v); }); foreach (var v in newRow) { Spawn.Invoke(v); } }
public Position WithY(int newY) { return(Position.OnBoard(X, newY)); }
public Position WithX(int newX) { return(Position.OnBoard(newX, Y)); }