public StatsObject(StatsObject baseStats, StatsModifierCollection toApply) { if (baseStats == null) { throw new ArgumentNullException(nameof(baseStats)); } if (toApply == null) { throw new ArgumentNullException(nameof(toApply)); } StatsObject retStats = new StatsObject(); retStats.Strength = new RestrictedNumber( (int)(baseStats.HitPoints.Minimum * (1 + toApply.HitPoints.Percent) + toApply.HitPoints.Value), (int)(baseStats.HitPoints.Minimum * (1 + toApply.HitPoints.Percent) + toApply.HitPoints.Value), (int)(baseStats.HitPoints.Minimum * (1 + toApply.HitPoints.Percent) + toApply.HitPoints.Value)); }
public StatsModifierCollection AddObjectToStatsModifierObject(StatsModifierCollection stats, object obj) { if (stats == null) throw new ArgumentNullException("stats"); if (obj == null) throw new ArgumentNullException("obj"); StatsModifierCollection statsObject = obj as StatsModifierCollection; if (statsObject != null) { stats += statsObject; } else { throw new ArgumentException("Obj is not of a known type."); } return stats; }
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; }