Exemple #1
0
    public void RunScript(string sourceCode)
    {
        string extraSource = "ship.reset = function(); self.x=0; self.y=0; self.rot=0; end function\n";

        interpreter.Reset(extraSource + sourceCode);
        interpreter.Compile();
        ValMap data = ValMap.Create();

        data["x"]   = ValNumber.Create(transform.localPosition.x);
        data["y"]   = ValNumber.Create(transform.localPosition.y);
        data["rot"] = ValNumber.Create(transform.localRotation.z);
        interpreter.SetGlobalValue(globalVarName, data);
    }
Exemple #2
0
    public void UpdateScriptFromSelf()
    {
        if (positionMap == null)
        {
            positionMap = ValMap.Create();
        }
        positionMap.SetElem(xStr, ValNumber.Create(transform.position.x));
        positionMap.SetElem(yStr, ValNumber.Create(transform.position.y));
        interpreter.SetGlobalValue("position", positionMap);

        if (actualMap == null)
        {
            actualMap = ValMap.Create();
        }
        actualMap.SetElem(headingStr, ValNumber.Create(Mathf.Round(reindeer.curAngle)));
        actualMap.SetElem(speedStr, ValNumber.Create(Mathf.Round(reindeer.curSpeed / reindeer.maxSpeed * 100f)));
        interpreter.SetGlobalValue("actual", actualMap);

        interpreter.SetGlobalValue("energy", ValNumber.Create(Mathf.Round(reindeer.energy)));
        interpreter.SetGlobalValue("health", ValNumber.Create(reindeer.health));
        interpreter.SetGlobalValue("deerCount", GetDeerCount());
        interpreter.SetGlobalValue("heading", ValNumber.Create(Mathf.Round(reindeer.targetAngle)));
    }
Exemple #3
0
    static void AddIntrinsics()
    {
        if (intrinsicsAdded)
        {
            return;                                     // already done!
        }
        intrinsicsAdded = true;

        Intrinsic f;

        // look
        // finds the closest enemy within a narrow angle of our current heading,
        // and returns a map with: distance, direction, heading, speed, energy, health.
        f      = Intrinsic.Create("look");
        f.code = (context, partialResult) => {
            ReindeerScript rs         = context.interpreter.hostData as ReindeerScript;
            Vector2        here       = rs.transform.position;
            Vector2        forward    = rs.transform.right;
            Reindeer       reindeer   = rs.reindeer;
            ValMap         result     = null;
            float          resultDist = 0;
            foreach (Reindeer deer in rs.game.deer)
            {
                if (deer == reindeer)
                {
                    continue;
                }
                if (!deer.gameObject.activeSelf)
                {
                    continue;
                }
                Vector2 dvec = (Vector2)deer.transform.position - here;
                float   ang  = Vector2.Angle(dvec, forward);
                if (ang < 5)
                {
                    float dist = dvec.magnitude;
                    if (result == null || dist < resultDist)
                    {
                        float direction = Mathf.Atan2(dvec.y, dvec.x) * Mathf.Rad2Deg;
                        if (result == null)
                        {
                            result = ValMap.Create();
                        }
                        resultDist = dist;
                        // On second thought, not including direction, as this makes
                        // aiming *too* precise.
                        //result.SetElem(directionStr, new ValNumber(direction));
                        result.SetElem(distanceStr, ValNumber.Create(Mathf.Round(dist)));
                        result.SetElem(headingStr, ValNumber.Create(deer.curAngle));
                        result.SetElem(speedStr, ValNumber.Create(deer.curSpeed));
                        result.SetElem(energyStr, ValNumber.Create(Mathf.Round(deer.energy)));
                        result.SetElem(healthStr, ValNumber.Create(deer.health));
                    }
                }
            }
            return(new Intrinsic.Result(result));
        };

        // throw(energy=20)
        // fires a snowball in our current heading; returns 1 if success, 0 if failed.
        f = Intrinsic.Create("throw");
        f.AddParam("energy", ValNumber.Create(20));
        f.code = (context, partialResult) => {
            ReindeerScript rs       = context.interpreter.hostData as ReindeerScript;
            Reindeer       reindeer = rs.reindeer;
            float          eCost    = (float)context.GetVar("energy").DoubleValue();
            if (reindeer.ThrowSnowball(eCost))
            {
                return(new Intrinsic.Result(ValNumber.one));
            }
            return(new Intrinsic.Result(ValNumber.zero));
        };

        // drop(energy=20, delay=5)
        // drops a meadow mine; returns 1 if success, 0 if failed
        f = Intrinsic.Create("drop");
        f.AddParam("energy", ValNumber.Create(20));
        f.AddParam("delay", ValNumber.Create(5));
        f.code = (context, partialResult) => {
            ReindeerScript rs       = context.interpreter.hostData as ReindeerScript;
            Reindeer       reindeer = rs.reindeer;
            float          eCost    = (float)context.GetVar("energy").DoubleValue();
            float          delay    = (float)context.GetVar("delay").DoubleValue();
            if (reindeer.LayMine(eCost, delay))
            {
                return(new Intrinsic.Result(ValNumber.one));
            }
            return(new Intrinsic.Result(ValNumber.zero));
        };
    }