Beispiel #1
0
    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;
     }
 }