public void TestDiff(string leftSerialized, string rightSerialized, string expected)
        {
            var notes = new Dictionary <int, string>();

            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(leftSerialized));
            var leftRequirements = builder.ToAchievement().CoreRequirements;

            builder = new AchievementBuilder();
            builder.ParseRequirements(Tokenizer.CreateTokenizer(rightSerialized));
            var rightRequirements = builder.ToAchievement().CoreRequirements;

            var vmRequirementGroup = new RequirementGroupViewModel("Group", leftRequirements, rightRequirements, NumberFormat.Decimal, notes);

            var strBuilder = new StringBuilder();

            foreach (var vmRequirement in vmRequirementGroup.Requirements)
            {
                var vmComparison = vmRequirement as RequirementComparisonViewModel;
                strBuilder.Append(vmComparison.Definition);
                strBuilder.Append('|');
                strBuilder.Append(vmComparison.OtherDefinition);
                strBuilder.Append('\n');
            }
            strBuilder.Length--;

            Assert.That(strBuilder.ToString(), Is.EqualTo(expected));
        }
        public void TestCommitVersionDetectedCulture()
        {
            using (var cultureOverride = new CultureOverride("fr-FR"))
            {
                var memoryStream = new MemoryStream();
                var achievements = Initialize(null, memoryStream);
                achievements.Title = "Title";
                Assert.That(achievements.Achievements.Count(), Is.EqualTo(0));

                var builder = new AchievementBuilder();
                builder.Title       = "T";
                builder.Description = "D";
                builder.Points      = 1;
                builder.CoreRequirements.Add(new Requirement
                {
                    Type = RequirementType.Trigger,
                    Left = new Field {
                        Size = FieldSize.Byte, Type = FieldType.MemoryAddress, Value = 0x1234
                    },
                    Operator = RequirementOperator.Equal,
                    Right    = new Field {
                        Type = FieldType.Value, Value = 1
                    }
                });;
                var achievement = builder.ToAchievement();

                achievements.Replace(null, achievement);

                achievements.Commit("Test", null, null);

                var output = Encoding.UTF8.GetString(memoryStream.ToArray());
                Assert.That(output, Is.EqualTo("0.79\r\nTitle\r\n0:\"T:0xH001234=1\":\"T\":\"D\": : : :Test:1:0:0:0:0:\r\n"));
            }
        }
        public void TestCommitNoFile()
        {
            var memoryStream = new MemoryStream();
            var achievements = Initialize(null, memoryStream);

            achievements.Title = "FromScript";
            Assert.That(achievements.Achievements.Count(), Is.EqualTo(0));

            var builder = new AchievementBuilder();

            builder.Title       = "T";
            builder.Description = "D";
            builder.Points      = 1;
            builder.CoreRequirements.Add(new Requirement
            {
                Left = new Field {
                    Size = FieldSize.Byte, Type = FieldType.MemoryAddress, Value = 0x1234
                },
                Operator = RequirementOperator.Equal,
                Right    = new Field {
                    Type = FieldType.Value, Value = 1
                }
            });
            var achievement = builder.ToAchievement();

            achievements.Replace(null, achievement);

            achievements.Commit("Test", null, null);

            var output = Encoding.UTF8.GetString(memoryStream.ToArray());

            Assert.That(output, Is.EqualTo("0.030\r\nFromScript\r\n0:\"0xH001234=1\":\"T\":\"D\": : : :Test:1:0:0:0:0:\r\n"));
        }
Beispiel #4
0
        public void TestParseRequirements(string input, string expected)
        {
            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(input));
            Assert.That(builder.RequirementsDebugString, Is.EqualTo(expected));
        }
Beispiel #5
0
        private void WriteAchievement(StreamWriter writer, string author, Achievement achievement, StringBuilder warning)
        {
            writer.Write(achievement.Id);
            writer.Write(":\"");

            var requirements = AchievementBuilder.SerializeRequirements(achievement);

            if (requirements.Length > AchievementMaxLength && warning != null)
            {
                warning.AppendFormat("Achievement \"{0}\" exceeds serialized limit ({1}/{2})", achievement.Title, requirements.Length, AchievementMaxLength);
                warning.AppendLine();
            }

            writer.Write(requirements);
            writer.Write("\":\"");

            WriteEscaped(writer, achievement.Title);
            writer.Write("\":\"");

            WriteEscaped(writer, achievement.Description);
            writer.Write("\":");

            writer.Write(" : : :"); // discontinued features

            writer.Write(author);   // author
            writer.Write(':');

            writer.Write(achievement.Points);
            writer.Write(':');

            writer.Write("0:0:0:0:"); // created, modified, upvotes, downvotes

            writer.Write(achievement.BadgeName);
            writer.WriteLine();
        }
Beispiel #6
0
        private string Process(string input)
        {
            var parser = Parse("achievement(\"T\", \"D\", 5, " + input + ")");

            Assert.That(parser.Achievements.Count(), Is.EqualTo(1));
            var achievement = parser.Achievements.First();
            var builder     = new AchievementBuilder(achievement);

            return(builder.SerializeRequirements());
        }
Beispiel #7
0
        public void TestAddAddress(string input, string expected)
        {
            var requirements = Evaluate(input);

            var builder = new StringBuilder();

            AchievementBuilder.AppendStringGroup(builder, requirements, NumberFormat.Hexadecimal);

            Assert.That(builder.ToString(), Is.EqualTo(expected));
        }
Beispiel #8
0
        /// <summary>
        /// Determines if the achievement's requirements match a second achievement.
        /// </summary>
        /// <returns><c>true</c> if the requirements match, <c>false</c> if not.</returns>
        public bool AreRequirementsSame(Achievement achievement)
        {
            var builder1 = new AchievementBuilder(this);

            builder1.Optimize();
            var builder2 = new AchievementBuilder(achievement);

            builder2.Optimize();

            return(builder1.AreRequirementsSame(builder2));
        }
Beispiel #9
0
 private static Achievement CreateValue(string definition)
 {
     var achievementBuilder = new AchievementBuilder();
     if (definition.Length > 2)
     {
         if (definition[1] == ':')
             achievementBuilder.ParseRequirements(Tokenizer.CreateTokenizer(definition));
         else
             achievementBuilder.ParseValue(Tokenizer.CreateTokenizer(definition));
     }
     return achievementBuilder.ToAchievement();
 }
Beispiel #10
0
        public void TestSimple()
        {
            var achievement = Evaluate("achievement(\"T\", \"D\", 5, byte(0x1234) == 1)");

            Assert.That(achievement.Title, Is.EqualTo("T"));
            Assert.That(achievement.Description, Is.EqualTo("D"));
            Assert.That(achievement.Points, Is.EqualTo(5));

            var builder = new AchievementBuilder(achievement);

            Assert.That(builder.SerializeRequirements(), Is.EqualTo("0xH001234=1"));
        }
Beispiel #11
0
        public void TestDefaultConstructor()
        {
            var builder = new AchievementBuilder();

            Assert.That(builder.Title, Is.EqualTo(""));
            Assert.That(builder.Description, Is.EqualTo(""));
            Assert.That(builder.Points, Is.EqualTo(0));
            Assert.That(builder.Id, Is.EqualTo(0));
            Assert.That(builder.BadgeName, Is.EqualTo(""));
            Assert.That(builder.CoreRequirements.Count, Is.EqualTo(0));
            Assert.That(builder.AlternateRequirements.Count, Is.EqualTo(0));
        }
        public void TestDefinition(string serialized, string expected)
        {
            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(serialized));

            var requirement   = builder.ToAchievement().CoreRequirements.First();
            var notes         = new Dictionary <int, string>();
            var vmRequirement = new RequirementViewModel(requirement, NumberFormat.Decimal, notes);

            Assert.That(vmRequirement.Definition, Is.EqualTo(expected));
        }
Beispiel #13
0
        public void TestParseRequirementsAddSourceUninitializedRight()
        {
            // ensures requirement.Right is uninitialized for AddSource
            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer("A:0xN20770f=0"));
            var requirement = builder.CoreRequirements.First();

            Assert.That(requirement.Right.Size, Is.EqualTo(FieldSize.None));
            Assert.That(requirement.Right.Type, Is.EqualTo(FieldType.None));
            Assert.That(requirement.Right.Value, Is.EqualTo(0));
        }
Beispiel #14
0
        public void TestSerializeRequirements(string input, string expected)
        {
            // verify serialization of the builder
            var achievement = CreateAchievement(input);

            Assert.That(achievement.SerializeRequirements(), Is.EqualTo(expected));

            // convert to actual achievement and verify serialization of that
            var cheev = achievement.ToAchievement();

            Assert.That(AchievementBuilder.SerializeRequirements(cheev), Is.EqualTo(expected));
        }
Beispiel #15
0
        /// <summary>
        /// Commits the achivement list back to the 'XXX-User.txt' file.
        /// </summary>
        public void Commit(string author)
        {
            var warning = new StringBuilder();

            using (var writer = new StreamWriter(_fileSystemService.CreateFile(_filename)))
            {
                writer.WriteLine(_version);
                writer.WriteLine(Title);

                foreach (var achievement in _achievements)
                {
                    writer.Write(achievement.Id);
                    writer.Write(":\"");

                    var requirements = AchievementBuilder.SerializeRequirements(achievement);
                    if (requirements.Length > AchievementMaxLength)
                    {
                        warning.AppendFormat("Achievement \"{0}\" exceeds serialized limit ({1}/{2})", achievement.Title, requirements.Length, AchievementMaxLength);
                        warning.AppendLine();
                    }

                    writer.Write(requirements);
                    writer.Write("\":\"");

                    WriteEscaped(writer, achievement.Title);
                    writer.Write("\":\"");

                    WriteEscaped(writer, achievement.Description);
                    writer.Write("\":");

                    writer.Write(" : : :"); // discontinued features

                    writer.Write(author);   // author
                    writer.Write(':');

                    writer.Write(achievement.Points);
                    writer.Write(':');

                    writer.Write("0:0:0:0:"); // created, modified, upvotes, downvotes

                    writer.Write(achievement.BadgeName);
                    writer.WriteLine();
                }
            }

            if (warning.Length > 0)
            {
                MessageBoxViewModel.ShowMessage(warning.ToString());
            }
        }
        public void TestRemovedRequirement()
        {
            var notes = new Dictionary <int, string>();

            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer("0xH1234=7"));
            var requirement = builder.ToAchievement().CoreRequirements.First();

            var vmRequirement = new RequirementComparisonViewModel(null, requirement, NumberFormat.Decimal, notes);

            Assert.That(vmRequirement.Definition, Is.EqualTo(""));
            Assert.That(vmRequirement.OtherDefinition, Is.EqualTo("byte(0x001234) == 7"));
            Assert.That(vmRequirement.IsModified, Is.True);
        }
Beispiel #17
0
        private static string Evaluate(string input)
        {
            var script    = "achievement(\"title\", \"desc\", 5,\n" + input + "\n)";
            var tokenizer = Tokenizer.CreateTokenizer(script);
            var parser    = new AchievementScriptInterpreter();

            if (parser.Run(tokenizer))
            {
                var achievement = parser.Achievements.First();
                var builder     = new AchievementBuilder(achievement);
                return(builder.RequirementsDebugString);
            }

            return(parser.Error.InnermostError.Message);
        }
Beispiel #18
0
        protected override ParseErrorExpression ModifyRequirements(AchievementBuilder builder)
        {
            // not actually modifying requirements, but allows us to do some validation
            foreach (var requirement in builder.CoreRequirements)
            {
                if (requirement.Type == RequirementType.AddHits)
                {
                    return(new ParseErrorExpression("tally not allowed in subclause"));
                }
                if (requirement.Type == RequirementType.SubHits)
                {
                    return(new ParseErrorExpression("tally not allowed in subclause"));
                }
            }

            return(null);
        }
Beispiel #19
0
        protected override ParseErrorExpression ModifyRequirements(AchievementBuilder builder)
        {
            var requirementsEx = RequirementEx.Combine(builder.CoreRequirements);

            foreach (var requirementEx in requirementsEx)
            {
                var lastCondition = requirementEx.Requirements.Last();
                if (lastCondition.Type != RequirementType.None)
                {
                    return(new ParseErrorExpression(string.Format("Cannot apply '{0}' to condition already flagged with {1}", Name.Name, lastCondition.Type)));
                }

                lastCondition.Type = RequirementType.SubHits;
            }

            return(null);
        }
        public void TestNotes(string serialized, string expected)
        {
            var notes = new Dictionary <int, string>();

            notes[0x1234] = "Addr1";
            notes[0x2345] = "Addr2";
            notes[0x3456] = "This note is long enough that it will need to be wrapped.";
            notes[0x4567] = "This note\nis multiple\nlines.";

            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(serialized));
            var requirement   = builder.ToAchievement().CoreRequirements.First();
            var vmRequirement = new RequirementViewModel(requirement, NumberFormat.Decimal, notes);

            Assert.That(vmRequirement.Notes, Is.EqualTo(expected));
        }
Beispiel #21
0
        private static bool Matches(string memAddr, SearchCriteria criteria)
        {
            AchievementBuilder builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(memAddr));

            if (criteria.NumConditionsComparison != RequirementOperator.None)
            {
                var numConditions = builder.CoreRequirements.Count;
                foreach (var altGroup in builder.AlternateRequirements)
                {
                    numConditions += altGroup.Count;
                }
                if (!ValueMatches(numConditions, criteria.NumConditions, criteria.NumConditionsComparison))
                {
                    return(false);
                }
            }

            if (!ValueMatches(builder.AlternateRequirements.Count, criteria.NumAltGroups, criteria.NumAltGroupsComparison))
            {
                return(false);
            }

            foreach (var condition in builder.CoreRequirements)
            {
                if (ConditionMatches(condition, criteria))
                {
                    return(true);
                }
            }

            foreach (var altGroup in builder.AlternateRequirements)
            {
                foreach (var condition in altGroup)
                {
                    if (ConditionMatches(condition, criteria))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Beispiel #22
0
        public void TestPredicateWithDefaultParameter()
        {
            var script = "function p(addr, id=17) => byte(addr) == id\n" +
                         "achievement(\"title\", \"desc\", 5, any_of([1, 2, 3], p))";
            var tokenizer = Tokenizer.CreateTokenizer(script);
            var parser    = new AchievementScriptInterpreter();

            if (!parser.Run(tokenizer))
            {
                Assert.Fail(parser.ErrorMessage);
            }

            var achievement = parser.Achievements.First();
            var builder     = new AchievementBuilder(achievement);

            Assert.That(builder.RequirementsDebugString, Is.EqualTo(
                            "byte(0x000001) == 17 || byte(0x000002) == 17 || byte(0x000003) == 17"));
        }
Beispiel #23
0
        public void TestScopedVariable()
        {
            var script = "function ItemInInventory(id) => any_of(range(0x1200, 0x1208, step=2), addr => word(addr) == id)\n" +
                         "achievement(\"title\", \"desc\", 5, ItemInInventory(17))";
            var tokenizer = Tokenizer.CreateTokenizer(script);
            var parser    = new AchievementScriptInterpreter();

            if (!parser.Run(tokenizer))
            {
                Assert.Fail(parser.ErrorMessage);
            }

            var achievement = parser.Achievements.First();
            var builder     = new AchievementBuilder(achievement);

            Assert.That(builder.RequirementsDebugString, Is.EqualTo(
                            "word(0x001200) == 17 || word(0x001202) == 17 || word(0x001204) == 17 || word(0x001206) == 17 || word(0x001208) == 17"));
        }
Beispiel #24
0
        /// <summary>
        /// Commits the asset list back to the 'XXX-User.txt' file.
        /// </summary>
        public void Commit(string author, StringBuilder warning, List <AssetBase> assetsToValidate)
        {
            double version = 0.30;

            foreach (var achievement in _achievements)
            {
                var achievementMinimumVersion = AchievementBuilder.GetMinimumVersion(achievement);
                if (achievementMinimumVersion > version)
                {
                    version = achievementMinimumVersion;
                }
            }

            foreach (var leaderboard in _leaderboards)
            {
                var leaderboardMinimumVersion = AchievementBuilder.GetMinimumVersion(leaderboard);
                if (leaderboardMinimumVersion > version)
                {
                    version = leaderboardMinimumVersion;
                }
            }

            if (version > 0.30)
            {
                Version = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:F2}", version);
            }

            using (var writer = new StreamWriter(_fileSystemService.CreateFile(_filename)))
            {
                writer.WriteLine(Version);
                writer.WriteLine(Title);

                foreach (var achievement in _achievements)
                {
                    WriteAchievement(writer, author, achievement, (assetsToValidate == null || assetsToValidate.Contains(achievement)) ? warning : null);
                }

                foreach (var leaderboard in _leaderboards)
                {
                    WriteLeaderboard(writer, leaderboard, (assetsToValidate == null || assetsToValidate.Contains(leaderboard)) ? warning : null);
                }
            }
        }
Beispiel #25
0
        public void TestConstructAlts()
        {
            var achievement = Evaluate("trigger = always_false()\n" +
                                       "for i in range(0, 10)\n" +
                                       "    trigger = trigger || word(0x1000+i) == 10 && prev(word(0x1000+i)) < 10\n" +
                                       "achievement(\"A\", \"B\", 10, trigger)");

            var expected = new StringBuilder();

            expected.Append("1=1");
            for (int i = 0; i <= 10; i++)
            {
                expected.AppendFormat("S0x {0:x6}=10_d0x {0:x6}<10", i + 0x1000);
            }

            var builder = new AchievementBuilder(achievement);

            Assert.That(builder.SerializeRequirements(), Is.EqualTo(expected.ToString()));
        }
        public void TestInitialize()
        {
            var achievements = Initialize("0.099\nTitle\n0:0xH0000c5=0_0xH0000b9=1:I Need Your Help:Talk to the ghost to begin your quest: : : :Jamiras:5:0:0:0:0:53352\n", null);

            Assert.That(achievements.Title, Is.EqualTo("Title"));
            Assert.That(achievements.Achievements.Count(), Is.EqualTo(1));

            var achievement = achievements.Achievements.First();

            Assert.That(achievement.Id, Is.EqualTo(0));
            Assert.That(achievement.Title, Is.EqualTo("I Need Your Help"));
            Assert.That(achievement.Description, Is.EqualTo("Talk to the ghost to begin your quest"));
            Assert.That(achievement.Points, Is.EqualTo(5));
            Assert.That(achievement.BadgeName, Is.EqualTo("53352"));

            var builder = new AchievementBuilder(achievement);

            Assert.That(builder.RequirementsDebugString, Is.EqualTo("byte(0x0000C5) == 0 && byte(0x0000B9) == 1"));
        }
Beispiel #27
0
        public LeaderboardViewModel(GameViewModel owner, Leaderboard leaderboard)
        {
            _clipboard = ServiceRepository.Instance.FindService <IClipboardService>();

            _leaderboard = leaderboard;
            Title        = leaderboard.Title;
            Description  = leaderboard.Description;

            var groups = new List <LeaderboardGroupViewModel>();

            var achievement = new AchievementBuilder();

            achievement.ParseRequirements(Tokenizer.CreateTokenizer(_leaderboard.Start));
            groups.Add(new LeaderboardGroupViewModel("Start Conditions", achievement.ToAchievement().CoreRequirements, owner.Notes)
            {
                CopyToClipboardCommand = new DelegateCommand(() => _clipboard.SetData(_leaderboard.Start))
            });

            achievement = new AchievementBuilder();
            achievement.ParseRequirements(Tokenizer.CreateTokenizer(_leaderboard.Cancel));
            groups.Add(new LeaderboardGroupViewModel("Cancel Condition", achievement.ToAchievement().CoreRequirements, owner.Notes)
            {
                CopyToClipboardCommand = new DelegateCommand(() => _clipboard.SetData(_leaderboard.Cancel))
            });

            achievement = new AchievementBuilder();
            achievement.ParseRequirements(Tokenizer.CreateTokenizer(_leaderboard.Submit));
            groups.Add(new LeaderboardGroupViewModel("Submit Condition", achievement.ToAchievement().CoreRequirements, owner.Notes)
            {
                CopyToClipboardCommand = new DelegateCommand(() => _clipboard.SetData(_leaderboard.Submit))
            });

            groups.Add(new LeaderboardGroupViewModel("Value", _leaderboard.Value, owner.Notes)
            {
                CopyToClipboardCommand = new DelegateCommand(() => _clipboard.SetData(_leaderboard.Value))
            });

            Groups = groups;

            UpdateLocalCommand = null;
            CanUpdate          = false;
        }
        public void TestDefinitions(string leftSerialized, string rightSerialized,
                                    string expectedDefinition, string expectedOtherDefinition, bool expectedModified)
        {
            var notes = new Dictionary <int, string>();

            var builder = new AchievementBuilder();

            builder.ParseRequirements(Tokenizer.CreateTokenizer(leftSerialized));
            var requirement = builder.ToAchievement().CoreRequirements.First();

            builder = new AchievementBuilder();
            builder.ParseRequirements(Tokenizer.CreateTokenizer(rightSerialized));
            var compareRequirement = builder.ToAchievement().CoreRequirements.First();

            var vmRequirement = new RequirementComparisonViewModel(requirement, compareRequirement, NumberFormat.Decimal, notes);

            Assert.That(vmRequirement.Definition, Is.EqualTo(expectedDefinition));
            Assert.That(vmRequirement.OtherDefinition, Is.EqualTo(expectedOtherDefinition));
            Assert.That(vmRequirement.IsModified, Is.EqualTo(expectedModified));
        }
        public void TestReplace()
        {
            var achievements = Initialize("0.099\nTitle\n0:0xH001234=0:A:B: : : :U:5:0:0:D:R:B\n", null);

            Assert.That(achievements.Achievements.Count(), Is.EqualTo(1));

            var achievement = achievements.Achievements.First();

            var builder = new AchievementBuilder();

            builder.Title       = "A2";
            builder.Description = "D2";
            builder.Points      = 10;
            var achievement2 = builder.ToAchievement();

            var previous = achievements.Replace(achievement, achievement2);

            Assert.That(previous, Is.SameAs(achievement));

            Assert.That(achievements.Achievements.Count(), Is.EqualTo(1));
            Assert.That(achievements.Achievements.First(), Is.SameAs(achievement2));
        }
Beispiel #30
0
        public void TestCombine(string input, string expected)
        {
            var achievement = new AchievementBuilder();

            achievement.ParseRequirements(Tokenizer.CreateTokenizer(input));
            var groups = RequirementEx.Combine(achievement.CoreRequirements);

            var builder = new StringBuilder();

            foreach (var group in groups)
            {
                if (builder.Length > 0)
                {
                    builder.Append('|');
                }

                group.AppendString(builder, NumberFormat.Decimal);
            }

            Assert.That(builder.ToString(), Is.EqualTo(expected));

            // make sure we didn't modify the source requirements
            Assert.That(achievement.SerializeRequirements(), Is.EqualTo(input));
        }