async Task BlightAdded(ITokenAddedArgs args) { bool isCascading = args.Reason switch { AddReason.AsReplacement => false, AddReason.MovedTo => false, AddReason.Added => true, // Generic add AddReason.Ravage => true, // blight from ravage AddReason.BlightedIsland => true, // blight from blighted island card AddReason.SpecialRule => true, // Heart of wildfire - Blight from add presence _ => throw new ArgumentException(nameof(args.Reason)) }; if (!isCascading) { return; } // remove from card. await TakeFromBlightSouce(args.Count, args.Space); if (BlightCard != null && blightOnCard <= 0) { Log(new IslandBlighted(BlightCard)); await BlightCard.OnBlightDepleated(this); } // Calc side effects bool isFirstBlight = Tokens[args.Space].Blight.Count == 1; var effect = new AddBlightEffect { DestroyPresence = true, Cascade = !isFirstBlight, GameState = this, Space = args.Space }; await ModifyBlightAddedEffect.InvokeAsync(effect); // Destory presence if (effect.DestroyPresence) { foreach (var spirit in Spirits) { if (spirit.Presence.IsOn(args.Space)) { await spirit.Presence.Destroy(args.Space, this, DestoryPresenceCause.Blight, args.Reason); } } } // Cascade blight if (effect.Cascade) { Space cascadeTo = await Spirits[0].Action.Decision(Select.Space.ForAdjacent( $"Cascade blight from {args.Space.Label} to", args.Space, Select.AdjacentDirection.Outgoing, args.Space.Adjacent.Where(x => !Island.Terrain_ForPowerAndBlight.IsOneOf(x, Terrain.Ocean)), Present.Always )); await Tokens[cascadeTo].Blight.Add(1, args.Reason); // Cascading blight shares original blights reason. } }
void BestowTheEnduranceOfBedrock(AddBlightEffect effect) { // When blight is added to one of your lands, // if the blight is less than or equal to your presence, if (effect.GameState.Tokens[effect.Space].Blight <= Presence.CountOn(effect.Space)) { // it does not cascade or destroy presence (yours or others')." effect.Cascade = false; effect.DestroyPresence = false; } }