public GameStateChangedEventArgs(IGameStateModifier modifier, IGameState state)
 {
     Modifier = modifier;
     State    = state;
 }
示例#2
0
        internal void Apply(IGameStateModifier modifier)
        {
            var tagChange = modifier as TagChange;

            if (tagChange != null && !tagChange.CanApply)
            {
                if (TryResolveEntityName(tagChange.EntityName, out var entityId))
                {
                    tagChange.ResolveEntityId(entityId);
                }
                else
                {
                    Log.Debug($"Could not apply tag={tagChange.Tag}, value={tagChange.Value} on {tagChange.EntityName}");
                    return;
                }
            }

            var isCreationTag = tagChange?.CreationTag == true;

            var isReady = IsReady();

            if (isReady)
            {
                if (_initialQueue.Any())
                {
                    if (_initialQueue.Any())
                    {
                        Ready?.Invoke(new GameCreatedEventArgs(this));
                    }
                    while (_initialQueue.Count > 0)
                    {
                        Modified?.Invoke(new GameStateChangedEventArgs(_initialQueue.Dequeue(), this));
                    }
                }

                // Wait for all creation tags to be applied before invoking Modified
                if (isCreationTag)
                {
                    _creationTags.Enqueue(tagChange);
                }
                else
                {
                    while (_creationTags.Count > 0)
                    {
                        Modified?.Invoke(new GameStateChangedEventArgs(_creationTags.Dequeue(), this));
                    }
                }
            }
            else
            {
                _initialQueue.Enqueue(modifier);
            }

            modifier.Apply(this);
            _modifiers.Add(modifier);

            if (tagChange?.Tag == GameTag.ZONE && tagChange.EntityId.HasValue &&
                Entities.TryGetValue(tagChange.EntityId.Value, out var entity))
            {
                if (entity.IsSpell && tagChange.Value == (int)Zone.PLAY && tagChange.PreviousValue == (int)Zone.HAND)
                {
                    var controller = GetPlayer(entity.Controller);
                    if (controller != null)
                    {
                        controller.SpellsPlayed++;
                    }
                }
            }

            if (modifier is ShowEntity showEntity && Entities.TryGetValue(showEntity.EntityId, out entity))
            {
                GetPlayer(entity.Id)?.PredictedCardIds.Remove(showEntity.CardId);
            }
            if (modifier is FullEntity fullEntity && Entities.TryGetValue(fullEntity.Data.Id, out entity))
            {
                GetPlayer(entity.Id)?.PredictedCardIds.Remove(fullEntity.Data.CardId);
            }

            if (modifier is ChangeEntity changeEntity && Entities.TryGetValue(changeEntity.EntityId, out entity))
            {
                const int ChameleosDbfId = 46706;
                if (entity.GetTag(GameTag.TRANSFORMED_FROM_CARD) == ChameleosDbfId)
                {
                    void HandleChameleosReveal(BlockGameEvent e)
                    {
                        _gameStateEvents.BlockEnd -= HandleChameleosReveal;
                        if (e.Data.Type == BlockType.TRIGGER && entity.HasTag(GameTag.SHIFTING) && (e.Data.CardId == Priest.Chameleos ||
                                                                                                    e.Data.CardId == NonCollectible.Neutral.Chameleos_ShiftingEnchantment))
                        {
                            GetPlayer(entity.Controller)?.PredictedCardIds.Add(changeEntity.CardId);
                        }
                    }

                    _gameStateEvents.BlockEnd += HandleChameleosReveal;
                }
            }

            if (isReady && !isCreationTag)
            {
                Modified?.Invoke(new GameStateChangedEventArgs(modifier, this));
            }
        }