async Task BringerPushNInvaders(Space source, int countToPush, params TokenClass[] healthyInvaders) { // We can't track which original invader is was killed, so let the user choose. // TokenCountDictionary tokens = ctx.Target(source).Tokens; TokenCountDictionary tokens = ctx.GameState.Tokens[source]; Token[] CalcInvaderTypes() => tokens.OfAnyType(healthyInvaders); var invaders = CalcInvaderTypes(); while (0 < countToPush && 0 < invaders.Length) { var invader = await ctx.Decision(Select.TokenFrom1Space.TokenToPush(source, countToPush, invaders, Present.Always)); if (invader == null) { break; } var destination = await ctx.Decision(new Select.Space( "Push " + invader.ToString() + " to", source.Adjacent.Where(s => ctx.Target(s).IsInPlay(Invader.Explorer)) , Present.Always )); await tokens.MoveTo(invader, destination); --countToPush; invaders = CalcInvaderTypes(); } }