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; }
public void ApplyTo(SpecificCharacter character) { if(character == null) { throw new ArgumentNullException(nameof(character)); } if (RoundsLeft > 0) { character.TransientStats.HitPointsDrained += Intensity; } }
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"); }
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; }
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); }
public void Cleanup(SpecificCharacter character) { RoundsLeft--; }
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; }
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; }
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; }
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; }
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); }
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)); }