public void RandomFunction3dTest() { var f = Formulae.RandomTerrainGenFormula(); double answer = f(77, -14); Assert.AreNotEqual(0.0001, answer); //I mean, statistically... }
public void RandomFunction4dTest() { var f = Formulae.RandomWindPattern(); double answer = f(63, 35, TimeSpan.FromMilliseconds(100)); Assert.AreNotEqual(0.0001, answer); //I mean, statistically... }
public float ModifyStat( float stat, SkillDef scontext, Character ccontext, Character tcontext, Equipment econtext, ref float modValue ) { Formulae fdb = scontext != null ? scontext.fdb : (ccontext != null ? ccontext.fdb : (econtext != null ? econtext.fdb : Formulae.DefaultFormulae)); // Debug.Log("V:"+value); modValue = value.GetValue(fdb, scontext, ccontext, tcontext, econtext); float modifiedValue = stat; switch (effectType) { case StatEffectType.Augment: modifiedValue = stat + modValue; break; case StatEffectType.Multiply: modifiedValue = stat * modValue; break; case StatEffectType.Replace: modifiedValue = modValue; break; default: Debug.LogError("improper stat effect type " + effectType); break; } return(modifiedValue); }
public void TestValuationCoordinator() { Date exerciseDate = new Date(2017, 08, 28); string shareCode = "AAA"; double strike = 100.0; Product p = new EuropeanOption(new Share(shareCode, Currency.ZAR), strike, exerciseDate); Share[] shares = new Share[] { new Share(shareCode, Currency.ZAR) };// One needs to know the index that will be required by the product to simulate it. Date valueDate = new Date(2016, 08, 28); double[] divYield = new double[] { 0.02 }; double[] vol = new double[] { 0.22 }; double[] spotPrice = new double[] { 100.0 }; double[,] correlations = new double[, ] { { 1.0 } }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, new Date[] { valueDate, valueDate.AddMonths(120) }, new double[] { 0.07, 0.07 }); IFloatingRateSource[] rateForecastCurves = new IFloatingRateSource[0]; EquitySimulator sim = new EquitySimulator(shares, spotPrice, vol, divYield, correlations, discountCurve, rateForecastCurves); Coordinator coordinator = new Coordinator(sim, new List <Simulator>(), 10000); double value = coordinator.Value(new Product[] { p }, valueDate); double refValue = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - valueDate) / 365.0, spotPrice[0], vol[0], 0.07, divYield[0]); Assert.AreEqual(refValue, value, refValue * 0.05); }
public virtual void OnEnable() { um = new HOEditorUndoManager(target, "Inspector"); if(useFormulae) { if(fdb == null) { fdb = Formulae.DefaultFormulae; } UpdateFormulae(); } }
public void BoundedTanTest() { for (int i = 0; i < 100; i++) { double fx = Formulae.BoundedTan(i); Assert.Greater(1.01, fx); Assert.Less(-1.01, fx); } }
public FormulaeEngine(Dependencies dependencies, Formulae formulae) { _reverseDependencyDependencyGraph = dependencies.ReverseDependencyGraph; DependencyGraph = dependencies.DependencyGraph; Formulae = formulae; State = new Dictionary <string, object>(); InitializeState(); }
public static Formulae CreateFormulae() { Formulae fdb = ScriptableObjectUtility.CreateAsset <Formulae>( "Formulae", "Assets/Resources/", true ); return(fdb); }
public bool Build(Formulae formulae) { var xxx = formulae.Formulas.ToDictionary(x => x.Variable, y => y.Expression.GetVariables()); foreach (var vardeps in xxx) { Dependency dep = null; if (!DependenciesDictionary.ContainsKey(vardeps.Key.Name)) { dep = new Dependency(vardeps.Key); DependenciesDictionary[vardeps.Key.Name] = dep; } dep = DependenciesDictionary[vardeps.Key.Name]; if (vardeps.Value.Any()) { foreach (var variable in vardeps.Value) { Dependency vardep = null; if (!DependenciesDictionary.ContainsKey(variable.Name)) { vardep = new Dependency(variable); DependenciesDictionary[variable.Name] = vardep; } dep.AddDependency(DependenciesDictionary[variable.Name]); } } } DependencyGraph = new DependencyGraph(); foreach (var dep in DependenciesDictionary) { DependencyGraph.AddVertex(dep.Key); } foreach (var dep in DependenciesDictionary) { var vertex = DependencyGraph.GetVertex(dep.Key); foreach (var x in dep.Value.Dependencies) { vertex.AddVertice(DependencyGraph.GetVertex(x.Variable.Name)); } } var cyclic = DependencyGraph.CheckCycle(); if (!cyclic) { buildReverseGraph(); } return(cyclic); }
public void checksum() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 5, 5, 9 }; double result = fo.Sum(arr); Assert.AreEqual(19, result); }
public void CheckAverage() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 40, 50, 60 }; double result = fo.Average(arr); Assert.AreEqual(50, result); }
public void CheckMedian() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 1, 2, 3, 4, 5 }; double result = fo.Median(arr); Assert.AreEqual(3, result); }
public void CheckMode() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 2, 4, 4, 1, 2, 4 }; double result = fo.Mode(arr); Assert.AreEqual(4, result); }
public void TestDynamicCallFromFile() { Stopwatch watch; // Make a product at runtime Product runtimeProduct = RuntimeProduct.CreateFromSourceFile(@"ScriptEuropeanOption.txt"); // Setup an approriate simulation Share[] shares = new Share[] { new Share("AAA", Currency.ZAR) };// One needs to know the index that will be required by the product to simulate it. Date valueDate = new Date(2016, 08, 28); double[] divYield = new double[] { 0.02 }; double[] vol = new double[] { 0.22 }; double[] spotPrice = new double[] { 100.0 }; double[,] correlations = new double[, ] { { 1.0 } }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, new Date[] { valueDate, valueDate.AddMonths(120) }, new double[] { 0.07, 0.07 }); IFloatingRateSource[] rateForecastCurves = new IFloatingRateSource[0]; EquitySimulator sim = new EquitySimulator(shares, spotPrice, vol, divYield, correlations, discountCurve, rateForecastCurves); // Value the runtime product Coordinator coordinator; coordinator = new Coordinator(sim, new List <Simulator>(), 100000); watch = Stopwatch.StartNew(); double valueRuntime = coordinator.Value(new Product[] { runtimeProduct }, valueDate); watch.Stop(); long timeRuntime = watch.ElapsedMilliseconds; // Setup the same product statically Date exerciseDate = new Date(2017, 08, 28); double strike = 100.0; Product staticProduct = new EuropeanOption(new Share("AAA", Currency.ZAR), strike, exerciseDate); // Value the static product coordinator = new Coordinator(sim, new List <Simulator> (), 100000); watch = Stopwatch.StartNew(); double valueStatic = coordinator.Value(new Product[] { staticProduct }, valueDate); watch.Stop(); long timeStatic = watch.ElapsedMilliseconds; double refValue = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - valueDate) / 365, spotPrice[0], vol[0], 0.07, divYield[0]); Assert.AreEqual(refValue, valueRuntime, refValue * 0.03); Assert.AreEqual(refValue, valueStatic, refValue * 0.03); }
public void CheckMultiply() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 2, 5 }; double result = fo.Multiply(arr); Assert.AreEqual(10, result); }
public void CheckMean() { Formulae fo = new Formulae(); List <double> arr = new List <double>() { 30, 40, 20 }; double result = fo.Mean(arr); Assert.AreEqual(30, result); }
public virtual void OnEnable() { um = new HOEditorUndoManager(target, "Inspector"); if (useFormulae) { if (fdb == null) { fdb = Formulae.DefaultFormulae; } UpdateFormulae(); } }
public void AddExperience(uint exp) { Experience += exp; var level = Formulae.Level(Level, Experience); // should probably cache exp to next level instead if (level > Level) { AddLevel((byte)(level - Level)); } Packets.Message.Animated(Position, Colors.White, exp.ToString()); Packets.Stats(); }
private void button1_Click(object sender, EventArgs e) { FormulaDialog fmDialog = new FormulaDialog(); DialogResult result = fmDialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { Formulae.Add(fmDialog.DialogDatum); } dgvFormulae.DataSource = null; dgvFormulae.DataSource = Formulae; fmDialog.Dispose(); }
public void TestEquitySimulatorMultiAssetCall() { // The model EquitySimulator sim = new EquitySimulator(shares, prices, vols, divYields, correlations, discountCurve, new IFloatingRateSource[0]); Coordinator coordinator = new Coordinator(sim, new List <Simulator> { }, 10000); // Products Date exerciseDate = new Date(2017, 08, 28); int p; double strike; // ALSI p = 0; strike = prices[p] * 1.05; Product call0 = new EuropeanOption(shares[p], strike, exerciseDate); double value0 = coordinator.Value(new Product[] { call0 }, anchorDate); double refValue0 = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - anchorDate) / 365.0, prices[p], vols[p], 0.07, divYields[p]); Assert.AreEqual(refValue0, value0, refValue0 * 0.05); // AAA p = 1; strike = prices[p] * 1.05; Product call1 = new EuropeanOption(shares[p], strike, exerciseDate); double value1 = coordinator.Value(new Product[] { call1 }, anchorDate); double refValue1 = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - anchorDate) / 365.0, prices[p], vols[p], 0.07, divYields[p]); Assert.AreEqual(refValue1, value1, refValue1 * 0.05); // BBB p = 2; strike = prices[p] * 1.05; Product call2 = new EuropeanOption(shares[p], strike, exerciseDate); double value2 = coordinator.Value(new Product[] { call2 }, anchorDate); double refValue2 = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - anchorDate) / 365.0, prices[p], vols[p], 0.07, divYields[p]); Assert.AreEqual(refValue1, value1, refValue1 * 0.05); // All at once double valueAll = coordinator.Value(new Product[] { call0, call1, call2 }, anchorDate); double refTotal = refValue0 + refValue1 + refValue2; Assert.AreEqual(refTotal, valueAll, refTotal * 0.05); }
public void TestDynamicCallFromString() { string source = @"Date exerciseDate = new Date(2017, 08, 28); Share share = new Share(""AAA"", Currency.ZAR); double strike = 100.0; public override List<Cashflow> GetCFs() { double amount = Math.Max(0, Get(share, exerciseDate) - strike); return new List<Cashflow>() { new Cashflow(exerciseDate, amount, share.currency) }; }"; // Make a product at runtime Product runtimeProduct = RuntimeProduct.CreateFromString("MyEuropeanOption", source); // Setup an approriate simulation Share[] shares = new Share[] { new Share("AAA", Currency.ZAR) };// One needs to know the index that will be required by the product to simulate it. Date valueDate = new Date(2016, 08, 28); double[] divYield = new double[] { 0.02 }; double[] vol = new double[] { 0.22 }; double[] spotPrice = new double[] { 100.0 }; double[,] correlations = new double[, ] { { 1.0 } }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, new Date[] { valueDate, valueDate.AddMonths(120) }, new double[] { 0.07, 0.07 }); IFloatingRateSource[] rateForecastCurves = new IFloatingRateSource[0]; EquitySimulator sim = new EquitySimulator(shares, spotPrice, vol, divYield, correlations, discountCurve, rateForecastCurves); // Value the runtime product Coordinator coordinator; coordinator = new Coordinator(sim, new List <Simulator>(), 100000); double valueRuntime = coordinator.Value(new Product[] { runtimeProduct }, valueDate); Date exerciseDate = new Date(2017, 08, 28); double strike = 100.0; double refValue = Formulae.BlackScholes(PutOrCall.Call, strike, (exerciseDate - valueDate) / 365, spotPrice[0], vol[0], 0.07, divYield[0]); Assert.AreEqual(refValue, valueRuntime, refValue * 0.03); }
public MainWindow() { InitializeComponent(); Formulae.AppendText("AVERAGE\n"); Formulae.AppendText("STDEVPA\n"); Formulae.AppendText("MIN\n"); Formulae.AppendText("MAX\n"); userInput = new UserInput(); SelectWorksheet.IsEnabled = false; SelectRange.IsEnabled = false; WindowHelper.Setup(this, LogBox, Run, Cancel); Flow.Init(); }
public static object FormulaBlackScholes([ExcelArgument(Description = "Strike")] object[,] strike, [ExcelArgument(Description = "The value date as and Excel date.")] object[,] valueDate, [ExcelArgument(Description = "The exercise date of the option. Must be greater than the value date.")] object[,] exerciseDate, [ExcelArgument(Description = "The spot proce of the underlying at the value date.")] object[,] spotPrice, [ExcelArgument(Description = "Annualized volatility.")] object[,] vol, [ExcelArgument(Description = "Continuously compounded risk free rate.")] object[,] riskfreeRate, [ExcelArgument(Description = "Continuously compounded dividend yield.")] object[,] divYield) { try { return(Formulae.BlackScholes(PutOrCall.Call, XU.GetDouble0D(strike, "strike"), (XU.GetDate0D(exerciseDate, "exerciseDate") - XU.GetDate0D(valueDate, "valueDate")) / 365.0, XU.GetDouble0D(spotPrice, "spotPrice"), XU.GetDouble0D(vol, "vol"), XU.GetDouble0D(riskfreeRate, "riskfreeRate"), XU.GetDouble0D(divYield, "divYield"))); } catch (Exception e) { return(XU.Error0D(e)); } }
public float SetCharacterValue(Formulae fdb, Character c, float amt, bool constrain = true) { Formula f = this.Formula; if (f.formulaType == FormulaType.Constant) { // float givenAmt = amt; float nowAmt = f.constantValue; amt = constrain ? ConstrainCharacterValue(fdb, c, amt, nowAmt) : amt; f.constantValue = amt; // if(Name != "ct" && Name != "facing") { Debug.Log("set "+Name+" to "+amt+" given "+givenAmt+" prev "+nowAmt); } return(f.constantValue); } else { Debug.LogError("Can't set value of non-constant base stat " + Name); return(float.NaN); } }
public float ConstrainCharacterValue(Formulae fdb, Character c, float amt, float prevAmt) { if (limitMinimum && amt <= prevAmt) { float limit = minF.GetCharacterValue(fdb, c); // if(Name != "ct" && Name != "facing") { Debug.Log("minlimit: "+amt+" from "+prevAmt+" to > "+limit+":"+minF.lookupReference+" from "+minF.lookupType); } if (amt < limit) { amt = Mathf.Min(prevAmt, limit); } } if (limitMaximum && amt >= prevAmt) { float limit = maxF.GetCharacterValue(fdb, c); // if(Name != "ct" && Name != "facing") { Debug.Log("maxlimit: "+amt+" from "+prevAmt+" to < "+limit+":"+maxF.lookupReference+" from "+maxF.lookupType); } if (amt > limit) { amt = Mathf.Max(prevAmt, limit); } } return(amt); }
public string Apply(string value) => Formulae.Substring(value, _start, _length);
public void GivenTheGermanLocale_ToStringFormatsADateWithTheSpecifiedDateFormatString() { Assert.Equal("2000-Dez-31", Formulae.DateToString(new DateTime(2000, 12, 31), "yyyy-MMM-dd", new CultureInfo("de-DE"))); }
public void GivenTheInvariantLocale_ToDateParsesADateWithTheSpecifiedDateFormatString() { Assert.Equal(new DateTime(2000, 12, 31), Formulae.StringToDate("2000-12-31", "yyyy-MM-dd", CultureInfo.InvariantCulture)); }
public float GetValue( Formulae fdb, SkillDef scontext = null, Character ccontext = null, Character tcontext = null, Equipment econtext = null, Item icontext = null ) { if (firstTime) { lookupReference = lookupReference == null ? "" : lookupReference.NormalizeName(); firstTime = false; } // if(scontext != null && scontext.currentTargetCharacter != null) { // Debug.Log("get value from "+this); // } float result = float.NaN; switch (formulaType) { case FormulaType.Constant: result = constantValue; break; case FormulaType.Lookup: result = fdb.Lookup(lookupReference, lookupType, scontext, ccontext, tcontext, econtext, icontext, this); break; case FormulaType.ReactedEffectValue: if (scontext == null) { Debug.LogError("No skill context."); return(float.NaN); } if (scontext.currentReactedEffect == null) { Debug.LogError("Skill context is reacting to no particular effect."); return(float.NaN); } result = scontext.currentReactedEffect.value; break; case FormulaType.SkillEffectValue: if (scontext == null) { Debug.LogError("No skill context."); return(float.NaN); } if (scontext.lastEffects == null || scontext.lastEffects.Count == 0) { Debug.LogError("Skill context has no prior effects."); return(float.NaN); } result = scontext.lastEffects[scontext.lastEffects.Count - 1].value; break; case FormulaType.Add: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result += arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Subtract: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result -= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Multiply: if (arguments == null) { Debug.LogError("no args at all! " + name + ":" + text); } if (arguments[0] == null) { if (arguments[1] != null) { Debug.Log("a1 was ok, it's " + arguments[1].name + ":" + arguments[1].text + " " + arguments[1].formulaType + "." + arguments[1].lookupType + " => " + arguments[1].lookupReference); } Debug.LogError("nm " + name + " txt " + text + " args " + arguments.Count); } result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result *= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } // Debug.Log("multiplied to "+result); break; case FormulaType.Divide: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result /= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } // Debug.Log("divided to "+result); break; case FormulaType.IntDivide: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result = (float)((int)(result / arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext))); } result = (float)((int)result); // Debug.Log("int divided to "+result); break; case FormulaType.Trunc: result = (float)((int)arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.And: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result = ((result != 0) && (arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0)) ? 1 : 0; } break; case FormulaType.Or: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result = ((result != 0) || (arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0)) ? 1 : 0; } break; case FormulaType.Not: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0 ? 0 : 1; break; case FormulaType.Remainder: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for (int i = 1; i < arguments.Count; i++) { result = result % arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Exponent: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); if (arguments.Count == 1) { result = result * result; } else { for (int i = 1; i < arguments.Count; i++) { result = Mathf.Pow(result, arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } } break; case FormulaType.Root: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); if (arguments.Count == 1) { result = Mathf.Sqrt(result); } else { for (int i = 1; i < arguments.Count; i++) { result = Mathf.Pow(result, 1.0f / arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } } break; case FormulaType.Mean: result = arguments.Sum(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)) / arguments.Count(); break; case FormulaType.Min: result = arguments.Min(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Max: result = arguments.Max(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.RandomRange: { float low = 0, high = 1; if (arguments.Count >= 2) { low = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); high = arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if (arguments.Count == 1) { high = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } result = Random.Range(low, high); break; } case FormulaType.ClampRange: { float r = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); float low = 0, high = 1; if (arguments.Count >= 2) { low = arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } if (arguments.Count >= 3) { high = arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } result = Mathf.Clamp(r, low, high); break; } case FormulaType.RoundDown: result = Mathf.Floor(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.RoundUp: result = Mathf.Ceil(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Round: result = Mathf.Round(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.AbsoluteValue: result = Mathf.Abs(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Negate: result = -1 * arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); // Debug.Log("negated to "+result); break; case FormulaType.Equal: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) == arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.NotEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.GreaterThan: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) > arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.GreaterThanOrEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) >= arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.LessThan: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) < arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.LessThanOrEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) <= arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.Any: result = arguments[Random.Range(0, arguments.Count)].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.LookupSuccessful: result = fdb.CanLookup(lookupReference, lookupType, scontext, ccontext, null, econtext, icontext, this) ? 1 : 0; break; case FormulaType.LookupOrElse: if (fdb.CanLookup(lookupReference, lookupType, scontext, ccontext, null, econtext, icontext, this)) { result = fdb.Lookup(lookupReference, lookupType, scontext, ccontext, tcontext, econtext, icontext, this); } else { result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.BranchIfNotZero: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0 ? arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) : arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchApplierSide: result = FacingSwitch(fdb, StatEffectTarget.Applier, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchAppliedSide: result = FacingSwitch(fdb, StatEffectTarget.Applied, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchPDF: { result = float.NaN; float rval = Random.value; float val = 0; int halfLen = arguments.Count / 2; for (int i = 0; i < halfLen; i++) { val += arguments[i].GetValue( fdb, scontext, ccontext, tcontext, econtext, icontext ); // Debug.Log("branch cond check "+val+" against "+rval); if (val >= rval) { result = arguments[i + halfLen].GetValue( fdb, scontext, ccontext, tcontext, econtext, icontext ); // Debug.Log("got "+result); break; } } if (float.IsNaN(result)) { Debug.LogError("PDF adds up to less than 1"); } break; } case FormulaType.BranchCond: { result = float.NaN; int halfLen = arguments.Count / 2; for (int i = 0; i < halfLen; i++) { if (arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0) { result = arguments[i + halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } if (float.IsNaN(result)) { Debug.LogError("No cond branch applied"); } break; } case FormulaType.BranchSwitch: { result = float.NaN; float val = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); int halfLen = (arguments.Count - 1) / 2; for (int i = 1; (i - 1) < halfLen; i++) { if (!NullFormula(arguments[i]) && arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) == val) { result = arguments[i + halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } if (float.IsNaN(result)) { for (int i = 1; (i - 1) < halfLen; i++) { if (NullFormula(arguments[i]) && !NullFormula(arguments[i + halfLen])) { result = arguments[i + halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } } if (float.IsNaN(result)) { Debug.LogError("No cond branch applied"); } break; } case FormulaType.TargetIsNull: result = (scontext != null ? scontext.currentTargetCharacter == null : tcontext == null) ? 1 : 0; break; case FormulaType.TargetIsNotNull: result = (scontext != null ? scontext.currentTargetCharacter != null : tcontext != null) ? 1 : 0; break; } lastValue = result; return(result); }
public float GetValue( Formulae fdb, SkillDef scontext=null, Character ccontext=null, Character tcontext=null, Equipment econtext=null, Item icontext=null ) { if(firstTime) { lookupReference = lookupReference == null ? "" : lookupReference.NormalizeName(); firstTime = false; } // if(scontext != null && scontext.currentTargetCharacter != null) { // Debug.Log("get value from "+this); // } float result=float.NaN; switch(formulaType) { case FormulaType.Constant: result = constantValue; break; case FormulaType.Lookup: result = fdb.Lookup(lookupReference, lookupType, scontext, ccontext, tcontext, econtext, icontext, this); break; case FormulaType.ReactedEffectValue: if(scontext == null) { Debug.LogError("No skill context."); return float.NaN; } if(scontext.currentReactedEffect == null) { Debug.LogError("Skill context is reacting to no particular effect."); return float.NaN; } result = scontext.currentReactedEffect.value; break; case FormulaType.SkillEffectValue: if(scontext == null) { Debug.LogError("No skill context."); return float.NaN; } if(scontext.lastEffects == null || scontext.lastEffects.Count == 0) { Debug.LogError("Skill context has no prior effects."); return float.NaN; } result = scontext.lastEffects[scontext.lastEffects.Count-1].value; break; case FormulaType.Add: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result += arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Subtract: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result -= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Multiply: if(arguments == null) { Debug.LogError("no args at all! "+name+":"+text); } if(arguments[0] == null) { if(arguments[1] != null) { Debug.Log("a1 was ok, it's "+arguments[1].name+":"+arguments[1].text+" "+arguments[1].formulaType+"."+arguments[1].lookupType+" => "+arguments[1].lookupReference); } Debug.LogError("nm "+name+" txt "+text+" args "+arguments.Count); } result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result *= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } // Debug.Log("multiplied to "+result); break; case FormulaType.Divide: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result /= arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } // Debug.Log("divided to "+result); break; case FormulaType.IntDivide: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result = (float)((int)(result/arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext))); } result = (float)((int)result); // Debug.Log("int divided to "+result); break; case FormulaType.Trunc: result = (float)((int)arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.And: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result = ((result != 0) && (arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0)) ? 1 : 0; } break; case FormulaType.Or: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result = ((result != 0) || (arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0)) ? 1 : 0; } break; case FormulaType.Not: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0 ? 0 : 1; break; case FormulaType.Remainder: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); for(int i = 1; i < arguments.Count; i++) { result = result % arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.Exponent: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); if(arguments.Count == 1) { result = result * result; } else { for(int i = 1; i < arguments.Count; i++) { result = Mathf.Pow(result, arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } } break; case FormulaType.Root: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); if(arguments.Count == 1) { result = Mathf.Sqrt(result); } else { for(int i = 1; i < arguments.Count; i++) { result = Mathf.Pow(result, 1.0f/arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } } break; case FormulaType.Mean: result = arguments.Sum(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)) / arguments.Count(); break; case FormulaType.Min: result = arguments.Min(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Max: result = arguments.Max(a => a.GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.RandomRange: { float low=0, high=1; if(arguments.Count >= 2) { low = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); high = arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(arguments.Count == 1) { high = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } result = Random.Range(low, high); break; } case FormulaType.ClampRange: { float r = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); float low=0, high=1; if(arguments.Count >= 2) { low = arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } if(arguments.Count >= 3) { high = arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } result = Mathf.Clamp(r, low, high); break; } case FormulaType.RoundDown: result = Mathf.Floor(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.RoundUp: result = Mathf.Ceil(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Round: result = Mathf.Round(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.AbsoluteValue: result = Mathf.Abs(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); break; case FormulaType.Negate: result = -1 * arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); // Debug.Log("negated to "+result); break; case FormulaType.Equal: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) == arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.NotEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.GreaterThan: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) > arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.GreaterThanOrEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) >= arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.LessThan: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) < arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.LessThanOrEqual: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) <= arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) ? 1 : 0; break; case FormulaType.Any: result = arguments[Random.Range(0, arguments.Count)].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.LookupSuccessful: result = fdb.CanLookup(lookupReference, lookupType, scontext, ccontext, null, econtext, icontext, this) ? 1 : 0; break; case FormulaType.LookupOrElse: if(fdb.CanLookup(lookupReference, lookupType, scontext, ccontext, null, econtext, icontext, this)) { result = fdb.Lookup(lookupReference, lookupType, scontext, ccontext, tcontext, econtext, icontext, this); } else { result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } break; case FormulaType.BranchIfNotZero: result = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0 ? arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) : arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchApplierSide: result = FacingSwitch(fdb, StatEffectTarget.Applier, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchAppliedSide: result = FacingSwitch(fdb, StatEffectTarget.Applied, scontext, ccontext, tcontext, econtext, icontext); break; case FormulaType.BranchPDF: { result = float.NaN; float rval = Random.value; float val = 0; int halfLen = arguments.Count/2; for(int i = 0; i < halfLen; i++) { val += arguments[i].GetValue( fdb, scontext, ccontext, tcontext, econtext, icontext ); // Debug.Log("branch cond check "+val+" against "+rval); if(val >= rval) { result = arguments[i+halfLen].GetValue( fdb, scontext, ccontext, tcontext, econtext, icontext ); // Debug.Log("got "+result); break; } } if(float.IsNaN(result)) { Debug.LogError("PDF adds up to less than 1"); } break; } case FormulaType.BranchCond: { result = float.NaN; int halfLen = arguments.Count/2; for(int i = 0; i < halfLen; i++) { if(arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) != 0) { result = arguments[i+halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } if(float.IsNaN(result)) { Debug.LogError("No cond branch applied"); } break; } case FormulaType.BranchSwitch: { result = float.NaN; float val = arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); int halfLen = (arguments.Count-1)/2; for(int i = 1; (i-1) < halfLen; i++) { if(!NullFormula(arguments[i]) && arguments[i].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext) == val) { result = arguments[i+halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } if(float.IsNaN(result)) { for(int i = 1; (i-1) < halfLen; i++) { if(NullFormula(arguments[i]) && !NullFormula(arguments[i+halfLen])) { result = arguments[i+halfLen].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); break; } } } if(float.IsNaN(result)) { Debug.LogError("No cond branch applied"); } break; } case FormulaType.TargetIsNull: result = (scontext != null ? scontext.currentTargetCharacter == null : tcontext == null) ? 1 : 0; break; case FormulaType.TargetIsNotNull: result = (scontext != null ? scontext.currentTargetCharacter != null : tcontext != null) ? 1 : 0; break; } lastValue = result; return result; }
public float GetCharacterValue(Formulae fdb, Character ccontext) { return(GetValue(fdb, null, ccontext)); }
protected float FacingSwitch( Formulae fdb, StatEffectTarget target, SkillDef scontext, Character ccontext, Character tcontext, Equipment econtext, Item icontext ) { if(scontext == null) { Debug.LogError("Relative facing not available for non-attack/reaction skill effects."); return float.NaN; } Character applier = scontext != null ? scontext.character : ccontext; Character applied = scontext != null ? scontext.currentTargetCharacter : tcontext; CharacterPointing pointing = CharacterPointing.Front; Character x = null, y = null; if(target == StatEffectTarget.Applied) { x = applier; y = applied; } else if(target == StatEffectTarget.Applier) { x = applied; y = applier; } Vector3 xp = x.TilePosition; Vector3 yp = y.TilePosition; //see if y is facing towards x at all float xAngle = SRPGUtil.WrapAngle(x.Facing); float yAngle = SRPGUtil.WrapAngle(y.Facing); float interAngle = Mathf.Atan2(yp.y-xp.y, yp.x-xp.x)*Mathf.Rad2Deg; float relativeYAngle = SRPGUtil.WrapAngle(yAngle - xAngle); bool towards = Mathf.Abs(Mathf.DeltaAngle(interAngle, xAngle)) < 45; //is theta(y,x) within 45 of yAngle? // Debug.Log("xang "+xAngle); // Debug.Log("yang "+yAngle); // Debug.Log("interang "+interAngle); // Debug.Log("towardsang "+Mathf.Abs(Mathf.DeltaAngle(xAngle, interAngle))); // Debug.Log("relY "+relativeYAngle); if(towards) { //next, get the quadrant //quadrant ~~ theta (target -> other) if(relativeYAngle >= 45 && relativeYAngle < 135) { pointing = CharacterPointing.Left; } else if(relativeYAngle >= 135 && relativeYAngle < 225) { pointing = CharacterPointing.Front; } else if(relativeYAngle >= 225 && relativeYAngle < 315) { pointing = CharacterPointing.Right; } else { pointing = CharacterPointing.Back; } } else { pointing = CharacterPointing.Away; } // Debug.Log("pt "+pointing); //order: //front, left, right, back, away, sides, towards, default //must have null entries if(arguments.Count != 8) { Debug.Log("Bad facing switch in skill "+(scontext != null ? scontext.skillName : "none")); } if(pointing == CharacterPointing.Front && NotNullFormula(arguments[0])) { //front //Debug.Log("ft"); return arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(pointing == CharacterPointing.Left && NotNullFormula(arguments[1])) { //left //Debug.Log("lt"); return arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(pointing == CharacterPointing.Right && NotNullFormula(arguments[2])) { //right //Debug.Log("rt"); return arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(pointing == CharacterPointing.Back && NotNullFormula(arguments[3])) { //back //Debug.Log("bk"); return arguments[3].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(pointing == CharacterPointing.Away && NotNullFormula(arguments[4])) { //away //Debug.Log("away"); return arguments[4].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if((pointing == CharacterPointing.Left || pointing == CharacterPointing.Right) && NotNullFormula(arguments[5])) { //sides // Debug.Log("sides"); return arguments[5].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if((pointing != CharacterPointing.Away) && NotNullFormula(arguments[6])) { //towards // Debug.Log("twds"); return arguments[6].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else if(NotNullFormula(arguments[7])) { //default // Debug.Log("default"); return arguments[7].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext); } else { Debug.LogError("No valid branch for pointing "+pointing+" in skill "+(scontext != null ? scontext.skillName : "none")); return float.NaN; } }
protected float FacingSwitch( Formulae fdb, StatEffectTarget target, SkillDef scontext, Character ccontext, Character tcontext, Equipment econtext, Item icontext ) { if (scontext == null) { Debug.LogError("Relative facing not available for non-attack/reaction skill effects."); return(float.NaN); } Character applier = scontext != null ? scontext.character : ccontext; Character applied = scontext != null ? scontext.currentTargetCharacter : tcontext; CharacterPointing pointing = CharacterPointing.Front; Character x = null, y = null; if (target == StatEffectTarget.Applied) { x = applier; y = applied; } else if (target == StatEffectTarget.Applier) { x = applied; y = applier; } Vector3 xp = x.TilePosition; Vector3 yp = y.TilePosition; //see if y is facing towards x at all float xAngle = SRPGUtil.WrapAngle(x.Facing); float yAngle = SRPGUtil.WrapAngle(y.Facing); float interAngle = Mathf.Atan2(yp.y - xp.y, yp.x - xp.x) * Mathf.Rad2Deg; float relativeYAngle = SRPGUtil.WrapAngle(yAngle - xAngle); bool towards = Mathf.Abs(Mathf.DeltaAngle(interAngle, xAngle)) < 45; //is theta(y,x) within 45 of yAngle? // Debug.Log("xang "+xAngle); // Debug.Log("yang "+yAngle); // Debug.Log("interang "+interAngle); // Debug.Log("towardsang "+Mathf.Abs(Mathf.DeltaAngle(xAngle, interAngle))); // Debug.Log("relY "+relativeYAngle); if (towards) { //next, get the quadrant //quadrant ~~ theta (target -> other) if (relativeYAngle >= 45 && relativeYAngle < 135) { pointing = CharacterPointing.Left; } else if (relativeYAngle >= 135 && relativeYAngle < 225) { pointing = CharacterPointing.Front; } else if (relativeYAngle >= 225 && relativeYAngle < 315) { pointing = CharacterPointing.Right; } else { pointing = CharacterPointing.Back; } } else { pointing = CharacterPointing.Away; } // Debug.Log("pt "+pointing); //order: //front, left, right, back, away, sides, towards, default //must have null entries if (arguments.Count != 8) { Debug.Log("Bad facing switch in skill " + (scontext != null ? scontext.skillName : "none")); } if (pointing == CharacterPointing.Front && NotNullFormula(arguments[0])) { //front //Debug.Log("ft"); return(arguments[0].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if (pointing == CharacterPointing.Left && NotNullFormula(arguments[1])) { //left //Debug.Log("lt"); return(arguments[1].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if (pointing == CharacterPointing.Right && NotNullFormula(arguments[2])) { //right //Debug.Log("rt"); return(arguments[2].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if (pointing == CharacterPointing.Back && NotNullFormula(arguments[3])) { //back //Debug.Log("bk"); return(arguments[3].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if (pointing == CharacterPointing.Away && NotNullFormula(arguments[4])) { //away //Debug.Log("away"); return(arguments[4].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if ((pointing == CharacterPointing.Left || pointing == CharacterPointing.Right) && NotNullFormula(arguments[5])) { //sides // Debug.Log("sides"); return(arguments[5].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if ((pointing != CharacterPointing.Away) && NotNullFormula(arguments[6])) { //towards // Debug.Log("twds"); return(arguments[6].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else if (NotNullFormula(arguments[7])) { //default // Debug.Log("default"); return(arguments[7].GetValue(fdb, scontext, ccontext, tcontext, econtext, icontext)); } else { Debug.LogError("No valid branch for pointing " + pointing + " in skill " + (scontext != null ? scontext.skillName : "none")); return(float.NaN); } }
public float GetCharacterValue(Formulae fdb, Character ccontext) { return GetValue(fdb, null, ccontext); }