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(); } }
static public int SumAny(this TokenCountDictionary counts, params TokenClass[] healthyInvaders) => counts.OfAnyType(healthyInvaders).Sum(k => counts[k]);
static public bool HasAny(this TokenCountDictionary counts, params TokenClass[] healthyInvaders) => counts.OfAnyType(healthyInvaders).Any();
public static TokenFrom1Space ForStrife(TokenCountDictionary tokens, params TokenClass[] groups) => new TokenFrom1Space("Add Strife", tokens.Space, (groups != null && groups.Length > 0) ? tokens.OfAnyType(groups) : tokens.Invaders(), Present.Always );