public GameStateChangedEventArgs(IGameStateModifier modifier, IGameState state) { Modifier = modifier; State = state; }
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)); } }