Ejemplo n.º 1
0
        public void GameStateChange_TagChange()
        {
            TagChange tagChange = null;
            var       parser    = new PowerParser(new MockGameInfo());

            parser.GameStateChange += args => tagChange = args as TagChange;

            parser.Parse(new Line("Power", "D 00:31:50.8318211 PowerTaskList.DebugPrintPower() -     TAG_CHANGE Entity=Epix tag=RESOURCES_USED value=2"));
            Assert.IsNotNull(tagChange);
            Assert.IsNull(tagChange.EntityId);
            Assert.AreEqual("Epix", tagChange.EntityName);
            Assert.AreEqual(GameTag.RESOURCES_USED, tagChange.Tag);
            Assert.AreEqual(2, tagChange.Value);

            parser.Parse(new Line("Power", "D 00:31:50.8318211 PowerTaskList.DebugPrintPower() -     TAG_CHANGE Entity=2 tag=RESOURCES_USED value=2"));
            Assert.IsNotNull(tagChange);
            Assert.AreEqual(2, tagChange.EntityId);
            Assert.AreEqual(GameTag.RESOURCES_USED, tagChange.Tag);
            Assert.AreEqual(2, tagChange.Value);

            tagChange = null;
            parser.Parse(new Line("Power", "D 00:31:50.8568882 PowerTaskList.DebugPrintPower() -     TAG_CHANGE Entity=[entityName=Vilefin Inquisitor id=60 zone=HAND zonePos=4 cardId=OG_006 player=2] tag=ZONE value=PLAY"));
            Assert.IsNotNull(tagChange);
            Assert.AreEqual(60, tagChange.EntityId);
            Assert.AreEqual(GameTag.ZONE, tagChange.Tag);
            Assert.AreEqual((int)Zone.PLAY, tagChange.Value);
        }
Ejemplo n.º 2
0
    public TagChange GetDeepCopy()
    {
        TagChange tc = new TagChange();

        tc.isAnAddition = isAnAddition;
        tc.tag          = tag;
        return(tc);
    }
Ejemplo n.º 3
0
        public void ResolveEntity()
        {
            var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null));

            Assert.IsNull(tc.EntityId);
            tc.ResolveEntityId(1);
            Assert.AreEqual(1, tc.EntityId);
        }
Ejemplo n.º 4
0
        public void ResolveEntity_NoMultipleCalls()
        {
            var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null));

            tc.ResolveEntityId(1);
            tc.ResolveEntityId(2);
            Assert.AreEqual(1, tc.EntityId);
        }
Ejemplo n.º 5
0
        public void Apply_NoEntityId_NoCreationTag()
        {
            var tc   = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null));
            var game = new MockGameState();

            tc.Apply(game);
            Assert.IsNull(tc.EntityId);
            Assert.IsNull(tc.PreviousValue);
        }
Ejemplo n.º 6
0
        public void Apply_ValidEntity()
        {
            var tc   = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 1, null));
            var game = new MockGameState();

            game.Entities.Add(1, new Entity(1, "CARD_ID"));

            tc.Apply(game);
            Assert.AreEqual(0, tc.PreviousValue);
            Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Tags[tc.Tag]);
        }
Ejemplo n.º 7
0
        public void Constructor()
        {
            var data = new TagChangeData(GameTag.HEALTH, 5, true, 1, "NAME");
            var tc   = new TagChange(data);

            Assert.AreEqual(data.Tag, tc.Tag);
            Assert.AreEqual(data.Value, tc.Value);
            Assert.IsTrue(tc.CreationTag);
            Assert.AreEqual(data.EntityId, tc.EntityId);
            Assert.AreEqual(data.EntityName, tc.EntityName);
        }
Ejemplo n.º 8
0
        public void Apply_InvalidEntity()
        {
            var tc     = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 2, null));
            var game   = new MockGameState();
            var entity = new Entity(1, "CARD_ID");

            game.Entities.Add(1, entity);

            tc.Apply(game);
            Assert.IsNull(tc.PreviousValue);
        }
Ejemplo n.º 9
0
        public void GameStateChange_TagChange_CreationTag()
        {
            TagChange tagChange = null;
            var       parser    = new PowerParser(new MockGameInfo());

            parser.GameStateChange += args => tagChange = args as TagChange;

            parser.Parse(new Line("Power", "D 00:31:50.9189508 PowerTaskList.DebugPrintPower() -         tag=CONTROLLER value=2"));
            Assert.IsNotNull(tagChange);
            Assert.IsTrue(tagChange.CreationTag);
            Assert.AreEqual(GameTag.CONTROLLER, tagChange.Tag);
            Assert.AreEqual(2, tagChange.Value);
        }
Ejemplo n.º 10
0
        public void Apply_ValidEntity_ControllerChange()
        {
            var tc   = new TagChange(new TagChangeData(GameTag.CONTROLLER, 1, false, 1, null));
            var game = new MockGameState();

            game.Entities.Add(1, new Entity(1, "CARD_ID"));

            tc.Apply(game);
            Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalController);

            var tc2 = new TagChange(new TagChangeData(GameTag.CONTROLLER, 2, false, 1, null));

            tc2.Apply(game);
            Assert.AreEqual(tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalController);
        }
Ejemplo n.º 11
0
        public void Apply_ValidEntity_ZoneChange()
        {
            var tc   = new TagChange(new TagChangeData(GameTag.ZONE, (int)Zone.DECK, false, 1, null));
            var game = new MockGameState {
                CurrentTurn = 1
            };

            game.Entities.Add(1, new Entity(1, "CARD_ID"));

            tc.Apply(game);
            Assert.AreEqual((Zone?)tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalZone);
            Assert.AreEqual(Zone.INVALID, game.Entities[tc.EntityId.Value].Info.PreviousZone);
            Assert.AreEqual(1, game.Entities[tc.EntityId.Value].Info.LastZoneChange);

            var tc2 = new TagChange(new TagChangeData(GameTag.ZONE, (int)Zone.HAND, false, 1, null));

            tc2.Apply(game);
            Assert.AreEqual((Zone?)tc.Value, game.Entities[tc.EntityId.Value].Info.OriginalZone);
        }
Ejemplo n.º 12
0
        public static void Handle(string timestamp, string data, ParserState state)
        {
            var trimmed     = data.Trim();
            var indentLevel = data.Length - trimmed.Length;

            data = trimmed;

            if (state.Node != null && indentLevel <= state.Node.IndentLevel)
            {
                var action = state.Node.Object as Action;
                if (action == null || action.Entity != 1 || !data.ToLower().Contains("mulligan"))
                {
                    state.Node = state.Node.Parent ?? state.Node;
                }
            }


            if (data == "CREATE_GAME")
            {
                state.CurrentGame = new Game {
                    Data = new List <GameData>(), TimeStamp = timestamp
                };
                state.Replay.Games.Add(state.CurrentGame);
                state.Node = new Node(typeof(Game), state.CurrentGame, 0, null);
                return;
            }

            var match = Regexes.ActionCreategameRegex.Match(data);

            if (match.Success)
            {
                var id = match.Groups[1].Value;
                Debug.Assert(id == "1");
                var gEntity = new GameEntity {
                    Id = int.Parse(id), Tags = new List <Tag>()
                };
                state.CurrentGame.Data.Add(gEntity);
                state.Node = new Node(typeof(GameEntity), gEntity, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionCreategamePlayerRegex.Match(data);
            if (match.Success)
            {
                var id        = match.Groups[1].Value;
                var playerId  = match.Groups[2].Value;
                var accountHi = match.Groups[3].Value;
                var accountLo = match.Groups[4].Value;
                var pEntity   = new PlayerEntity
                {
                    Id        = int.Parse(id),
                    AccountHi = accountHi,
                    AccountLo = accountLo,
                    PlayerId  = int.Parse(playerId),
                    Tags      = new List <Tag>()
                };
                state.CurrentGame.Data.Add(pEntity);
                state.Node = new Node(typeof(PlayerEntity), pEntity, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionStartRegex.Match(data);
            if (match.Success)
            {
                var rawEntity = match.Groups[1].Value;
                var rawType   = match.Groups[2].Value;
                var index     = match.Groups[3].Value;
                var rawTarget = match.Groups[4].Value;
                var entity    = Helper.ParseEntity(rawEntity, state);
                var target    = Helper.ParseEntity(rawTarget, state);
                var type      = Helper.ParseEnum <PowSubType>(rawType);
                var action    = new Action
                {
                    Data      = new List <GameData>(),
                    Entity    = entity,
                    Index     = int.Parse(index),
                    Target    = target,
                    TimeStamp = timestamp,
                    Type      = type
                };
                if (state.Node.Type == typeof(Game))
                {
                    ((Game)state.Node.Object).Data.Add(action);
                }
                else if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(action);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
                state.Node = new Node(typeof(Action), action, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionMetadataRegex.Match(data);
            if (match.Success)
            {
                var rawMeta    = match.Groups[1].Value;
                var rawData    = match.Groups[2].Value;
                var info       = match.Groups[3].Value;
                var parsedData = Helper.ParseEntity(rawData, state);
                var meta       = Helper.ParseEnum <MetaDataType>(rawMeta);
                var metaData   = new MetaData {
                    Data = parsedData, Info = int.Parse(info), Meta = meta, MetaInfo = new List <Info>()
                };
                if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(metaData);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
                state.Node = new Node(typeof(MetaData), metaData, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionMetaDataInfoRegex.Match(data);
            if (match.Success)
            {
                var index     = match.Groups[1].Value;
                var rawEntity = match.Groups[2].Value;
                var entity    = Helper.ParseEntity(rawEntity, state);
                var metaInfo  = new Info {
                    Id = entity, Index = int.Parse(index)
                };
                if (state.Node.Type == typeof(MetaData))
                {
                    ((MetaData)state.Node.Object).MetaInfo.Add(metaInfo);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
            }

            match = Regexes.ActionShowEntityRegex.Match(data);
            if (match.Success)
            {
                var rawEntity  = match.Groups[1].Value;
                var cardId     = match.Groups[2].Value;
                var entity     = Helper.ParseEntity(rawEntity, state);
                var showEntity = new ShowEntity {
                    CardId = cardId, Entity = entity, Tags = new List <Tag>()
                };
                if (state.Node.Type == typeof(Game))
                {
                    ((Game)state.Node.Object).Data.Add(showEntity);
                }
                else if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(showEntity);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
                state.Node = new Node(typeof(ShowEntity), showEntity, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionHideEntityRegex.Match(data);
            if (match.Success)
            {
                var rawEntity  = match.Groups[1].Value;
                var tagName    = match.Groups[2].Value;
                var value      = match.Groups[3].Value;
                var entity     = Helper.ParseEntity(rawEntity, state);
                var zone       = Helper.ParseTag(tagName, value);
                var hideEntity = new HideEntity {
                    Entity = entity, Zone = zone.Value, TimeStamp = timestamp
                };
                if (state.Node.Type == typeof(Game))
                {
                    ((Game)state.Node.Object).Data.Add(hideEntity);
                }
                else if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(hideEntity);
                }
                else
                {
                    throw new Exception("Invalid node: " + state.Node.Type);
                }
                return;
            }

            match = Regexes.ActionFullEntityUpdatingRegex.Match(data);
            if (!match.Success)
            {
                match = Regexes.ActionFullEntityCreatingRegex.Match(data);
            }
            if (match.Success)
            {
                var rawEntity  = match.Groups[1].Value;
                var cardId     = match.Groups[2].Value;
                var entity     = Helper.ParseEntity(rawEntity, state);
                var showEntity = new FullEntity {
                    CardId = cardId, Id = entity, Tags = new List <Tag>()
                };
                if (state.Node.Type == typeof(Game))
                {
                    ((Game)state.Node.Object).Data.Add(showEntity);
                }
                else if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(showEntity);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
                state.Node = new Node(typeof(FullEntity), showEntity, indentLevel, state.Node);
                return;
            }

            match = Regexes.ActionTagChangeRegex.Match(data);
            if (match.Success)
            {
                var rawEntity = match.Groups[1].Value;
                var tagName   = match.Groups[2].Value;
                var value     = match.Groups[3].Value;
                var tag       = Helper.ParseTag(tagName, value);
                if (tag.Name == (int)GameTag.CURRENT_PLAYER)
                {
                    UpdateCurrentPlayer(state, rawEntity, tag);
                }
                var entity = Helper.ParseEntity(rawEntity, state);
                if (tag.Name == (int)GameTag.ENTITY_ID)
                {
                    entity = UpdatePlayerEntity(state, rawEntity, tag, entity);
                }
                var tagChange = new TagChange {
                    Entity = entity, Name = tag.Name, Value = tag.Value
                };
                if (state.Node.Type == typeof(Game))
                {
                    ((Game)state.Node.Object).Data.Add(tagChange);
                }
                else if (state.Node.Type == typeof(Action))
                {
                    ((Action)state.Node.Object).Data.Add(tagChange);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type);
                }
                return;
            }

            match = Regexes.ActionTagRegex.Match(data);
            if (match.Success)
            {
                var tagName = match.Groups[1].Value;
                var value   = match.Groups[2].Value;
                var tag     = Helper.ParseTag(tagName, value);
                if (tag.Name == (int)GameTag.CURRENT_PLAYER)
                {
                    state.FirstPlayerId = ((PlayerEntity)state.Node.Object).Id;
                }
                if (state.Node.Type == typeof(GameEntity))
                {
                    ((GameEntity)state.Node.Object).Tags.Add(tag);
                }
                else if (state.Node.Type == typeof(PlayerEntity))
                {
                    ((PlayerEntity)state.Node.Object).Tags.Add(tag);
                }
                else if (state.Node.Type == typeof(FullEntity))
                {
                    ((FullEntity)state.Node.Object).Tags.Add(tag);
                }
                else if (state.Node.Type == typeof(ShowEntity))
                {
                    ((ShowEntity)state.Node.Object).Tags.Add(tag);
                }
                else
                {
                    throw new Exception("Invalid node " + state.Node.Type + " -- " + data);
                }
            }
        }
Ejemplo n.º 13
0
        public void CanNotApply()
        {
            var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, null, null));

            Assert.IsFalse(tc.CanApply);
        }
Ejemplo n.º 14
0
        public void CanApply_HasId()
        {
            var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, false, 1, null));

            Assert.IsTrue(tc.CanApply);
        }
Ejemplo n.º 15
0
        public void CanApply_CreationTag()
        {
            var tc = new TagChange(new TagChangeData(GameTag.HEALTH, 5, true, null, null));

            Assert.IsTrue(tc.CanApply);
        }