示例#1
0
        public IEngine CreateEngineWithCommonScripts(SpecificCharacter character)
        {
            if (character == null)
                throw new ArgumentNullException("character");

            var engine = ScriptHelper.CreateScriptEngine();
            var jsEngine = (engine as JSEngine).GetEngine();
            ScriptHelper.ExecuteScript(engine, "./Common.js");
            jsEngine.SetValue("_GetDefaultBonusObject", new Func<StatsModifierCollection>(() =>
            {
                return new StatsModifierCollection();
            }));
            jsEngine.SetValue("_GetDefaultMultiplyBonusObject", new Func<StatsModifierCollection>(() =>
            {
                StatsModifierCollection smo = 1d;
                return smo;
            }));
            jsEngine.SetValue("_HasPersonalitySet", new Func<string, bool>((personalityName) =>
            {
                return character.Personalities.CultureContains(personalityName);
            }));
            jsEngine.SetValue("_HasClassSet", new Func<string, bool>((className) =>
            {
                return character.Class == className;
            }));
            return engine;
        }
示例#2
0
        public void ApplyTo(SpecificCharacter character)
        {
            if(character == null)
            {
                throw new ArgumentNullException(nameof(character));
            }

            if (RoundsLeft > 0)
            {
                character.TransientStats.HitPointsDrained += Intensity;
            }
        }
示例#3
0
        public void GetAllScriptsOfTest()
        {
            SpecificCharacter sc = new SpecificCharacter();
            sc.Class = "Test;Archer";
            sc.Personalities = "DPS;King";

            JSPlugin plugin = new JSPlugin(null);
            var scripts = plugin.GetAllScriptsOf(sc);
            scripts.Count.Should().Be(4);
            scripts[0].Item1.Should().Be("class");
            scripts[0].Item2.Should().Be("Test");
            scripts[1].Item1.Should().Be("class");
            scripts[1].Item2.Should().Be("Archer");
            scripts[2].Item1.Should().Be("personality");
            scripts[2].Item2.Should().Be("DPS");
            scripts[3].Item1.Should().Be("personality");
            scripts[3].Item2.Should().Be("King");
        }
示例#4
0
        public IList<Tuple<string, string>> GetAllScriptsOf(SpecificCharacter character)
        {
            if (character == null)
                throw new ArgumentNullException("character");

            List<Tuple<string, string>> ret = new List<Tuple<string, string>>();

            foreach (string @class in character.Class.Split(';'))
            {
                ret.Add(new Tuple<string, string>("class", @class));
            }

            foreach (string personality in character.Personalities.Split(';'))
            {
                ret.Add(new Tuple<string, string>("personality", personality));
            }

            return ret;
        }
示例#5
0
        public void CalculateAllStats()
        {
            Battle battle = new Battle(new List<List<Character>>(), pluginInterop, scriptHelper, randomHelper);

            SpecificCharacter ch = new SpecificCharacter
            {
                Name = "test",
                Class = "Barbarian",
                Stats = new StatsObject
                {
                    Level = 1,
                    Strength = 10,
                    HitPoints = 10,
                    MagicPoints = 10
                }
            };

            StatsModifierCollection ret = battle.CalculateStats(ch);
            ret.HitPoints.Total.Should().Be(1400);
            ret.MagicPoints.Percent.Should().Be(180);
        }
示例#6
0
 public void Cleanup(SpecificCharacter character)
 {
     RoundsLeft--;
 }
示例#7
0
        public StatsModifierCollection InvokeFunctionWithHooks(IEngine engine, string function, IEnumerable<string> hookFunctions,
            SpecificCharacter character, StatsModifierCollection cumulativeStatsObject)
        {
            if (engine == null)
                throw new ArgumentNullException("engine");

            if (string.IsNullOrEmpty(function))
                throw new ArgumentNullException("function");

            if (hookFunctions == null)
                throw new ArgumentNullException("hookFunctions");

            if (character == null)
                throw new ArgumentNullException("character");

            if (engine.Name != "JavascriptEngine")
                throw new ArgumentException("Expected provided engine type to be JavascriptEngine but got " + engine.Name);

            Engine jsEngine = (engine as JSEngine).GetEngine();

            StatsModifierCollection summedMultiplierObject = 1d;

            foreach (string hookFunction in hookFunctions)
            {
                string filename = function.Substring(0, function.IndexOf('_'));
                StatsModifierCollection modifier = (StatsModifierCollection)jsEngine.Invoke(hookFunction, filename, character).ToObject();

                if (modifier == null)
                    continue;

                summedMultiplierObject *= modifier;
            }

            StatsModifierCollection originalStats = (StatsModifierCollection)jsEngine.Invoke(function, character, cumulativeStatsObject).ToObject();

            if (originalStats == null)
                throw new ArgumentException("Script did not return proper result.");

            originalStats *= summedMultiplierObject;

            return originalStats;
        }
示例#8
0
        public StatsModifierCollection InvokeFunction(IEngine engine, string function, SpecificCharacter character, StatsModifierCollection cumulativeStatsObject)
        {
            if (engine == null)
                throw new ArgumentNullException("engine");

            if (string.IsNullOrEmpty(function))
                throw new ArgumentNullException("function");

            if (character == null)
                throw new ArgumentNullException("character");

            if (engine.Name != "JavascriptEngine")
                throw new ArgumentException("Expected provided engine type to be JavascriptEngine but got " + engine.Name);

            Engine jsEngine = (engine as JSEngine).GetEngine();

            StatsModifierCollection originalStats = (StatsModifierCollection)jsEngine.Invoke(function, character, cumulativeStatsObject).ToObject();

            if (originalStats == null)
                throw new ArgumentException("Script did not return proper result.");

            return originalStats;
        }
示例#9
0
        public StatsModifierCollection CalculateStats(SpecificCharacter character)
        {
            StatsModifierCollection summedModifiers = new StatsModifierCollection();
            var engine = InteropPlugin.CreateEngineWithCommonScripts(character);
            List<string> allScripts = new List<string>();
            List<Tuple<string, string>> allStaticFunctions = new List<Tuple<string, string>>();
            List<Tuple<string, string>> allStaticHookFunctions = new List<Tuple<string, string>>();
            List<Tuple<string, string>> allDependentFunctions = new List<Tuple<string, string>>();
            List<Tuple<string, string>> allDependentHookFunctions = new List<Tuple<string, string>>();
            List<Tuple<string, string>> allOverrulingFunctions = new List<Tuple<string, string>>();

            //init
            string lastScript = string.Format("./Classes/{0}.js", character.Class);
            allScripts.Add(lastScript);
            allStaticFunctions.Add(new Tuple<string, string>(lastScript, OnStaticBonusString(character.Class)));
            allStaticHookFunctions.Add(new Tuple<string, string>(lastScript, OnShouldModifyStaticBonusScriptForString(character.Class)));
            allDependentFunctions.Add(new Tuple<string, string>(lastScript, OnDependentBonusString(character.Class)));
            allDependentHookFunctions.Add(new Tuple<string, string>(lastScript, OnShouldModifyDependentBonusScriptForString(character.Class)));
            allOverrulingFunctions.Add(new Tuple<string, string>(lastScript, OnOverrulingBonusString(character.Class)));

            if (!string.IsNullOrEmpty(character.Personalities))
            {
                foreach (string personality in character.Personalities.Split(';'))
                {
                    lastScript = string.Format("./Personalities/{0}.js", personality);
                    allScripts.Add(lastScript);
                    allStaticFunctions.Add(new Tuple<string, string>(lastScript, OnStaticBonusString(personality)));
                    allStaticHookFunctions.Add(new Tuple<string, string>(lastScript, OnShouldModifyStaticBonusScriptForString(personality)));
                    allDependentFunctions.Add(new Tuple<string, string>(lastScript, OnDependentBonusString(personality)));
                    allDependentHookFunctions.Add(new Tuple<string, string>(lastScript, OnShouldModifyDependentBonusScriptForString(personality)));
                    allOverrulingFunctions.Add(new Tuple<string, string>(lastScript, OnOverrulingBonusString(personality)));
                }
            }

            //load all scripts
            foreach (string function in allScripts)
            {
                ScriptHelper.ExecuteScript(engine, function);
            }

            //Execute static functions on scripts
            foreach (var script in allStaticFunctions)
            {
                var modifiers = InteropPlugin.InvokeFunctionWithHooks(engine, script.Item2,
                                    allStaticHookFunctions.Where(x => x.Item1 != script.Item1).Select(x => x.Item2), character, summedModifiers);

                summedModifiers = InteropPlugin.AddObjectToStatsModifierObject(summedModifiers, modifiers);
            }

            //dependent functions
            foreach (var script in allDependentFunctions)
            {
                var modifiers = InteropPlugin.InvokeFunctionWithHooks(engine, script.Item2,
                                    allDependentHookFunctions.Where(x => x.Item1 != script.Item1).Select(x => x.Item2), character, summedModifiers);

                summedModifiers = InteropPlugin.AddObjectToStatsModifierObject(summedModifiers, modifiers);
            }

            //overruling
            foreach (var script in allOverrulingFunctions)
            {
                var modifiers = InteropPlugin.InvokeFunction(engine, script.Item2, character, summedModifiers);

                summedModifiers = InteropPlugin.AddObjectToStatsModifierObject(summedModifiers, modifiers);
            }

            return summedModifiers;
        }
示例#10
0
        public ICollection<SpecificCharacter> GetValidTargetsFor(SpecificCharacter character)
        {
            if (character == null)
            {
                throw new ArgumentNullException(nameof(character));
            }

            var ret = new List<SpecificCharacter>();

            foreach (var team in AllCharactersInTeams)
            {
                if (team.Value.Contains(character))
                {
                    continue;
                }

                ret.AddRange(team.Value);
            }

            return ret;
        }
示例#11
0
        public void CalculateStaticStatsTest()
        {
            Battle battle = new Battle(new List<List<Character>>(), pluginInterop, scriptHelper, randomHelper);

            SpecificCharacter ch = new SpecificCharacter
            {
                Name = "test",
                Class = "Archer",
                Personalities = "Brave1",
                Stats = new StatsObject
                {
                    Level = 1,
                    Constitution = 2,
                    Intelligence = 3
                }
            };

            StatsModifierCollection ret = battle.CalculateStats(ch);
            ret.HitPoints.Total.Should().Be(142);
            ret.MagicPoints.Total.Should().Be(35);
            ret.Strength.Percent.Should().Be(5);
        }
示例#12
0
        public void MockedBattleCalculateStatsTest()
        {
            Mock<IPlugin> mockBattleInterop = new Mock<IPlugin>();
            Mock<IJSScriptHelper> mockScriptHelper = new Mock<IJSScriptHelper>();
            Mock<IRandomHelper> mockRandomHelper = new Mock<IRandomHelper>();
            Mock<Jint.Engine> mockJintEngine = new Mock<Jint.Engine>();
            Mock<JSEngine> mockEngine = new Mock<JSEngine>(mockJintEngine.Object);
            IEngine actualEngine = mockEngine.Object;

            mockBattleInterop.Setup(x => x.CreateEngineWithCommonScripts(It.IsAny<SpecificCharacter>())).Returns(mockEngine.Object);
            mockBattleInterop.Setup(x => x.InvokeFunctionWithHooks(mockEngine.Object, It.IsAny<string>(), It.IsAny<IEnumerable<string>>(),
                It.IsAny<SpecificCharacter>(), It.IsAny<StatsModifierCollection>())).Returns(new StatsModifierCollection { Agility = new StatsModifierObject { Percent = 5 } });
            mockBattleInterop.Setup(x => x.InvokeFunction(mockEngine.Object, It.IsAny<string>(),
                It.IsAny<SpecificCharacter>(), It.IsAny<StatsModifierCollection>())).Returns(new StatsModifierCollection { Agility = new StatsModifierObject { Percent = 0 } });
            mockBattleInterop.Setup(x => x.AddObjectToStatsModifierObject(It.IsAny<StatsModifierCollection>(), It.IsAny<StatsModifierCollection>()))
                .Returns((StatsModifierCollection a, StatsModifierCollection b) => a + b);

            mockScriptHelper.Setup(x => x.ExecuteScript(actualEngine, It.IsAny<string>(), It.IsAny<Dictionary<string, object>>()));

            Battle battle = new Battle(new List<List<Character>>(), mockBattleInterop.Object, mockScriptHelper.Object, mockRandomHelper.Object);

            SpecificCharacter ch = new SpecificCharacter
            {
                Name = "test",
                Class = "Archer1",
                Personalities = "Brave1;Haha;What",
                Stats = new StatsObject
                {
                    Level = 1,
                    Constitution = 2,
                    Intelligence = 3
                }
            };

            StatsModifierCollection ret = battle.CalculateStats(ch);

            ret.Agility.Percent.Should().Be(40);

            mockBattleInterop.Verify(x => x.CreateEngineWithCommonScripts(It.IsAny<SpecificCharacter>()), Times.Exactly(1));
            mockBattleInterop.Verify(x => x.InvokeFunctionWithHooks(mockEngine.Object, It.IsAny<string>(), It.IsAny<IEnumerable<string>>(),
                It.IsAny<SpecificCharacter>(), It.IsAny<StatsModifierCollection>()), Times.Exactly(8));
            mockBattleInterop.Verify(x => x.AddObjectToStatsModifierObject(It.IsAny<StatsModifierCollection>(), It.IsAny<StatsModifierCollection>()),
                Times.Exactly(12));

            mockScriptHelper.Verify(x => x.ExecuteScript(actualEngine, It.IsAny<string>(), It.IsAny<Dictionary<string, object>>()),
                Times.Exactly(4));
        }