Inheritance: UnityEngine.ScriptableObject
Beispiel #1
0
        public void RandomFunction3dTest()
        {
            var    f      = Formulae.RandomTerrainGenFormula();
            double answer = f(77, -14);

            Assert.AreNotEqual(0.0001, answer); //I mean, statistically...
        }
Beispiel #2
0
        public void RandomFunction4dTest()
        {
            var    f      = Formulae.RandomWindPattern();
            double answer = f(63, 35, TimeSpan.FromMilliseconds(100));

            Assert.AreNotEqual(0.0001, answer); //I mean, statistically...
        }
Beispiel #3
0
    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);
    }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public virtual void OnEnable()
 {
     um = new HOEditorUndoManager(target, "Inspector");
     if(useFormulae) {
         if(fdb == null) { fdb = Formulae.DefaultFormulae; }
         UpdateFormulae();
     }
 }
Beispiel #6
0
 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);
     }
 }
Beispiel #7
0
        public FormulaeEngine(Dependencies dependencies, Formulae formulae)
        {
            _reverseDependencyDependencyGraph = dependencies.ReverseDependencyGraph;
            DependencyGraph = dependencies.DependencyGraph;

            Formulae = formulae;
            State    = new Dictionary <string, object>();
            InitializeState();
        }
Beispiel #8
0
    public static Formulae CreateFormulae()
    {
        Formulae fdb = ScriptableObjectUtility.CreateAsset <Formulae>(
            "Formulae",
            "Assets/Resources/",
            true
            );

        return(fdb);
    }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #15
0
        public void CheckMultiply()
        {
            Formulae      fo  = new Formulae();
            List <double> arr = new List <double>()
            {
                2, 5
            };
            double result = fo.Multiply(arr);

            Assert.AreEqual(10, result);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
 public virtual void OnEnable()
 {
     um = new HOEditorUndoManager(target, "Inspector");
     if (useFormulae)
     {
         if (fdb == null)
         {
             fdb = Formulae.DefaultFormulae;
         }
         UpdateFormulae();
     }
 }
Beispiel #18
0
        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();
        }
Beispiel #19
0
        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);
        }
Beispiel #22
0
        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();
        }
Beispiel #23
0
 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));
     }
 }
Beispiel #24
0
    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);
        }
    }
Beispiel #25
0
 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);
 }
Beispiel #26
0
 public string Apply(string value) => Formulae.Substring(value, _start, _length);
Beispiel #27
0
 public void GivenTheGermanLocale_ToStringFormatsADateWithTheSpecifiedDateFormatString()
 {
     Assert.Equal("2000-Dez-31", Formulae.DateToString(new DateTime(2000, 12, 31), "yyyy-MMM-dd", new CultureInfo("de-DE")));
 }
Beispiel #28
0
 public void GivenTheInvariantLocale_ToDateParsesADateWithTheSpecifiedDateFormatString()
 {
     Assert.Equal(new DateTime(2000, 12, 31), Formulae.StringToDate("2000-12-31", "yyyy-MM-dd", CultureInfo.InvariantCulture));
 }
Beispiel #29
0
    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);
    }
Beispiel #30
0
    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;
    }
Beispiel #31
0
 public float GetCharacterValue(Formulae fdb, Character ccontext)
 {
     return(GetValue(fdb, null, ccontext));
 }
Beispiel #32
0
    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;
        }
    }
Beispiel #33
0
    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);
        }
    }
Beispiel #34
0
 public float GetCharacterValue(Formulae fdb, Character ccontext)
 {
     return GetValue(fdb, null, ccontext);
 }