public void test2(ValMap v)
    {
        int i1 = v["param1"].IntValue();
        int i2 = v["param2"].IntValue();

        Say(i1.ToString());
    }
Esempio n. 2
0
    public static Vector2 ToVector2(this Value item)
    {
        Vector2 pos = Vector2.Zero;

        if (item is ValList)
        {
            var itemVals = ((ValList)item).values;
            if (itemVals.Count > 0)
            {
                pos.X = itemVals[0].FloatValue();
            }
            if (itemVals.Count > 1)
            {
                pos.Y = itemVals[1].FloatValue();
            }
        }
        else if (item is ValMap)
        {
            ValMap map = (ValMap)item;
            pos.X = map.Lookup(str_x).FloatValue();
            pos.Y = map.Lookup(str_y).FloatValue();
        }
        else if (item != null)
        {
            pos.X = item.FloatValue();
        }
        return(pos);
    }
Esempio n. 3
0
        public static ValMap ToMap(StardewValley.Object obj)
        {
            var    result = new ValMap();
            string type   = obj.Type;

            if (type == "asdf")
            {
                type = obj.Name;                                // because, c'mon.
            }
            result.map[_type] = new ValString(type);
            // ToDo: limit the following to ones that really apply for this type.
            result.map[_name]     = new ValString(obj.Name);
            result["displayName"] = new ValString(obj.DisplayName);
            result["health"]      = new ValNumber(obj.getHealth());
            if (obj.isLamp.Get())
            {
                result["isOn"] = ValNumber.Truth(obj.IsOn);
            }
            result["quality"]          = new ValNumber(obj.Quality);
            result.map[_harvestable]   = ValNumber.Truth(obj.readyForHarvest.Get());
            result["minutesTillReady"] = new ValNumber(obj.MinutesUntilReady);
            result["value"]            = new ValNumber(obj.sellToStorePrice());
            result["description"]      = new ValString(obj.getDescription());
            return(result);
        }
Esempio n. 4
0
        static ValMap ToMap(ResourceClump clump)
        {
            if (clump == null)
            {
                return(null);
            }
            var result = new ValMap();

            result.map[_type] = new ValString("Clump");
            string name;

            switch (clump.parentSheetIndex.Value)
            {
            case ResourceClump.boulderIndex: name = "Boulder"; break;

            case ResourceClump.hollowLogIndex: name = "Hollow Log"; break;

            case ResourceClump.meteoriteIndex: name = "Meteorite"; break;

            case ResourceClump.mineRock1Index:
            case ResourceClump.mineRock2Index:
            case ResourceClump.mineRock3Index:
            case ResourceClump.mineRock4Index: name = "Mine Rock"; break;

            case ResourceClump.stumpIndex: name = "Stump"; break;

            default: name = "#" + clump.parentSheetIndex.Value; break;
            }
            result.map[_name]   = new ValString(name);
            result.map[_health] = new ValNumber(clump.health.Value);
            return(result);
        }
Esempio n. 5
0
        public static void SpriteClassSync(ValMap p_sprite)
        {
            Sprite sprite = (p_sprite["ref"] as ValWrapper <Sprite>).UnWrapp();

            sprite.texture  = (p_sprite["image"] as ValWrapper <Texture>).UnWrapp().texture;
            sprite.position = new Vector2(p_sprite["x"].FloatValue(), ReceiveY(p_sprite["y"].FloatValue()));
            sprite.rotation = p_sprite["rotation"].FloatValue();
            sprite.origin.X = sprite.texture.Width / 2;
            sprite.origin.Y = sprite.texture.Height / 2;
        }
Esempio n. 6
0
    public static Vector2 GetVector2(this ValMap map, string key, Vector2 defValue = default(Vector2))
    {
        Value val = null;

        if (!map.TryGetValue(key, out val))
        {
            return(defValue);
        }
        return(val.ToVector2());
    }
Esempio n. 7
0
    public static string GetString(this ValMap map, string key, string defaultValue = null)
    {
        Value val = null;

        if (!map.TryGetValue(key, out val) || val == null)
        {
            return(defaultValue);
        }
        return(val.ToString());
    }
Esempio n. 8
0
    public static bool GetBool(this ValMap map, string key, bool defaultValue = false)
    {
        Value val = null;

        if (!map.TryGetValue(key, out val) || val == null)
        {
            return(defaultValue);
        }
        return(val.BoolValue());
    }
Esempio n. 9
0
    public static int GetInt(this ValMap map, string key, int defaultValue)
    {
        Value val = null;

        if (!map.TryGetValue(key, out val) || val == null)
        {
            return(defaultValue);
        }
        return(val.IntValue());
    }
Esempio n. 10
0
    public static double GetDouble(this ValMap map, string key, float defaultValue)
    {
        Value val = null;

        if (!map.TryGetValue(key, out val) || val == null)
        {
            return(defaultValue);
        }
        return(val.DoubleValue());
    }
Esempio n. 11
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 = new ValMap();

        data["x"]   = new ValNumber(transform.localPosition.x);
        data["y"]   = new ValNumber(transform.localPosition.y);
        data["rot"] = new ValNumber(transform.localRotation.z);
        interpreter.SetGlobalValue(globalVarName, data);
    }
Esempio n. 12
0
        public void Break(bool silent = false)
        {
            if (!silent && !allowControlCBreak)
            {
                return;
            }

            // grab the full stack and tuck it away for future reference
            ValList stack = M1API.StackList(interpreter.vm);

            // also find the first non-null entry, to display right away
            SourceLoc loc = null;

            if (interpreter.vm != null)
            {
                foreach (var stackLoc in interpreter.vm.GetStack())
                {
                    loc = stackLoc;
                    if (loc != null)
                    {
                        break;
                    }
                }
            }
            interpreter.Stop();
            console.AbortInput();
            console.keyBuffer.Clear();
            if (!silent)
            {
                string msg = "BREAK";
                if (loc != null)
                {
                    msg += " at ";
                    if (loc.context != null)
                    {
                        msg += loc.context + " ";
                    }
                    msg += "line " + loc.lineNum;
                }
                textDisplay.Print(msg + "\n");
                //Debug.Log("printed: " + msg);
            }
            ValMap globals = interpreter.vm.globalContext.variables;

            interpreter.Reset();
            interpreter.REPL("");               // (forces creation of a VM)
            interpreter.vm.globalContext.variables = globals;
            globals.SetElem(M1API._stackAtBreak, stack);
            AddGlobals();
            //Debug.Log("Rebuilt VM and restored " + globals.Count + " globals");
        }
Esempio n. 13
0
    public static ValMap GetMap(this ValMap map, string key, bool createIfNotFound = false)
    {
        Value val = null;

        if (!map.TryGetValue(key, out val) || !(map is ValMap))
        {
            val = null;
            if (createIfNotFound)
            {
                val      = new ValMap();
                map[key] = val;
            }
        }
        return((ValMap)val);
    }
Esempio n. 14
0
        static ValMap ToMap(TerrainFeature feature)
        {
            if (feature == null)
            {
                return(null);
            }
            var result = new ValMap();

            result.map[_type] = result["name"] = new ValString(feature.GetType().Name);
            if (feature is Tree tree)
            {
                result.map[_treeType]    = new ValNumber(tree.treeType.Value);
                result.map[_growthStage] = new ValNumber(tree.growthStage.Value);
                result.map[_health]      = new ValNumber(tree.health.Value);
                result.map[_stump]       = ValNumber.Truth(tree.stump.Value);
                result.map[_tapped]      = ValNumber.Truth(tree.tapped.Value);
                result.map[_hasSeed]     = ValNumber.Truth(tree.hasSeed.Value);
            }
            else if (feature is HoeDirt hoeDirt)
            {
                result.map[_dry] = ValNumber.Truth(hoeDirt.state.Value != 1);
                var crop = hoeDirt.crop;
                if (crop == null)
                {
                    result.map[_crop] = null;
                }
                else
                {
                    ValMap cropInfo = new ValMap();
                    cropInfo.map[_phase]         = new ValNumber(crop.currentPhase.Value);
                    cropInfo.map[_maxPhase]      = new ValNumber(crop.phaseDays.Count - 1);
                    cropInfo.map[_mature]        = ValNumber.Truth(crop.fullyGrown.Value);
                    cropInfo.map[_dead]          = ValNumber.Truth(crop.dead.Value);
                    cropInfo.map[_harvestMethod] = ValNumber.Truth(crop.harvestMethod.Value);
                    bool harvestable = (int)crop.currentPhase.Value >= crop.phaseDays.Count - 1 &&
                                       (!crop.fullyGrown.Value || (int)crop.dayOfCurrentPhase.Value <= 0);
                    cropInfo.map[_harvestable] = ValNumber.Truth(harvestable);

                    //Note: we might be able to get the name of the crop
                    // using crop.indexOfHarvest or crop.netSeedIndex
                    var product = new StardewValley.Object(crop.indexOfHarvest.Value, 0);
                    cropInfo.map[_name] = new ValString(product.DisplayName);

                    result.map[_crop] = cropInfo;
                }
            }
            return(result);
        }
Esempio n. 15
0
        void BeginRun(string source)
        {
            //Debug.Log("BeginRun; Program source: " + source);
            System.GC.Collect();
            runningInstance = this;

            if (interpreter.vm == null)
            {
                interpreter.REPL("", 0);                                        // (forces creation of a VM)
            }
            else
            {
                interpreter.vm.Reset();
            }
            if (string.IsNullOrEmpty(source))
            {
                return;
            }

            ValMap globals = interpreter.vm.globalContext.variables;

            if (globals != null)
            {
                globals.map.Remove(M1API._stackAtBreak);
            }
            AddGlobals();

            interpreter.Reset(source);
            try {
                interpreter.Compile();
            } catch (MiniscriptException me) {
                Debug.Log("Caught MiniScript exception: " + me);
            }
            if (interpreter.vm == null)
            {
                interpreter.REPL("", 0);
            }
            interpreter.vm.globalContext.variables = globals;
            interpreter.RunUntilDone(0.03f);
            //lastNonidleTime = Time.time;
            if (interpreter.NeedMoreInput())
            {
                // If the interpreter wants more input at this point, it's because the program
                // has an unterminated if/while/for/function block.  Let's just cancel the run.
                Debug.Log("Canceling run in BeginRun");
                Break(true);
            }
        }
Esempio n. 16
0
        static ValMap ToMap(Character character)
        {
            if (character == null)
            {
                return(null);
            }
            var result = new ValMap();

            result.map[_type]     = new ValString("Character");
            result.map[_name]     = new ValString(character.Name);
            result["displayName"] = new ValString(character.displayName);
            result["facing"]      = new ValNumber(character.FacingDirection);
            result["isEmoting"]   = ValNumber.Truth(character.isEmoting);
            result["emote"]       = new ValNumber(character.CurrentEmote);
            result["isMonster"]   = ValNumber.Truth(character.IsMonster);

            return(result);
        }
Esempio n. 17
0
        public static ValMap SpriteClass()
        {
            if (spriteClass != null)
            {
                return(spriteClass);
            }

            spriteClass = new ValMap();

            //spriteClass.assignOverride = (key, value) =>
            //{
            //    switch (key.ToString())
            //    {
            //        case "image":
            //            Sprite sprite = (spriteClass["ref"] as ValWrapper<Sprite>).UnWrapp();
            //            sprite.texture = (value as ValWrapper<Texture>).UnWrapp().texture;
            //            sprite.origin.X = sprite.texture.Width / 2;
            //            sprite.origin.Y = sprite.texture.Height / 2;
            //            return false;
            //        case "x":
            //            (spriteClass["ref"] as ValWrapper<Sprite>).UnWrapp().position.X = value.FloatValue();
            //            return false;
            //        case "y":
            //            (spriteClass["ref"] as ValWrapper<Sprite>).UnWrapp().position.Y =  ReceiveY(value.FloatValue());
            //            return false;
            //        case "rotation":
            //            (spriteClass["ref"] as ValWrapper<Sprite>).UnWrapp().rotation = value.FloatValue();
            //            return false;
            //    }
            //    return false;
            //};

            //spriteClass["x"] = ValNumber.zero;
            //spriteClass["y"] = ValNumber.zero;
            //spriteClass["rotation"] = ValNumber.zero;
            //spriteClass["image"] = null;
            //spriteClass["ref"] = null;
            //spriteClass["display"] = null;

            return(spriteClass);
        }
Esempio n. 18
0
    //--------------------------------------------------------------------------------
    #region Public Methods

    public void UpdateFromScript()
    {
        ValMap data = null;

        try {
            data = interpreter.GetGlobalValue(globalVarName) as ValMap;
        } catch (UndefinedIdentifierException) {
            Debug.LogWarning(globalVarName + " not found in global context.");
        }
        if (data == null)
        {
            return;
        }

        Transform t   = transform;
        Vector3   pos = t.localPosition;

        Value xval = data["x"];

        if (xval != null)
        {
            pos.x = xval.FloatValue();
        }
        Value yval = data["y"];

        if (yval != null)
        {
            pos.y = yval.FloatValue();
        }
        t.localPosition = pos;

        Value rotVal = data["rot"];

        if (rotVal != null)
        {
            t.localRotation = Quaternion.Euler(0, 0, (float)rotVal.FloatValue());
        }
    }
Esempio n. 19
0
    public void UpdateScriptFromSelf()
    {
        if (positionMap == null)
        {
            positionMap = new ValMap();
        }
        positionMap.SetElem(xStr, new ValNumber(transform.position.x));
        positionMap.SetElem(yStr, new ValNumber(transform.position.y));
        interpreter.SetGlobalValue("position", positionMap);

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

        interpreter.SetGlobalValue("energy", new ValNumber(Mathf.Round(reindeer.energy)));
        interpreter.SetGlobalValue("health", new ValNumber(reindeer.health));
        interpreter.SetGlobalValue("deerCount", GetDeerCount());
        interpreter.SetGlobalValue("heading", new ValNumber(Mathf.Round(reindeer.targetAngle)));
    }
Esempio n. 20
0
        public static ValMap ToMap(StardewValley.Item item)
        {
            if (item == null)
            {
                return(null);
            }
            var result = new ValMap();

            result.map[_type] = new ValString(item.GetType().Name);
            // ToDo: limit the following to ones that really apply for this type.
            result.map[_name]     = new ValString(item.Name);
            result["displayName"] = new ValString(item.DisplayName);
            result["stack"]       = new ValNumber(item.Stack);
            result["maxStack"]    = new ValNumber(item.maximumStackSize());
            result["category"]    = new ValString(item.getCategoryName());
            result["value"]       = new ValNumber(item.salePrice());
            result["description"] = new ValString(item.getDescription().Trim());
            if (item is StardewValley.Tools.WateringCan can)
            {
                result["waterLeft"] = new ValNumber(can.WaterLeft);
                result["waterMax"]  = new ValNumber(can.waterCanMax);
            }
            return(result);
        }
Esempio n. 21
0
        public void Init(Bot botContext = null)
        {
            this.bot = botContext;
            M1API.Init(this);

            var display = console.display;

            display.backColor = new Color(0.31f, 0.11f, 0.86f);
            display.Clear();

            var colors = new Color[] { Color.Red, Color.Yellow, Color.Green, Color.Purple };

            display.SetCursor(19, 3);
            for (int i = 0; i < 4; i++)
            {
                display.textColor = colors[i]; display.Print("*");
            }
            display.textColor = Color.Azure; display.Print(" Farmtronics " + (botContext == null ? "Home" : "Bot") + " Computer ");
            for (int i = 0; i < 4; i++)
            {
                display.textColor = colors[3 - i]; display.Print("*");
            }
            display.textColor = Color.White;
            display.NextLine();

            if (interpreter.vm == null)
            {
                interpreter.REPL("", 0);                        // (forces creation of a VM)
                AddGlobals();
            }

            {
                var d = new RealFileDisk();
                d.readOnly = true;
                d.Open(Path.Combine(ModEntry.helper.DirectoryPath, "assets", "sysdisk"));
                sysDisk = d;
                FileUtils.disks["sys"] = sysDisk;
            }
            if (!string.IsNullOrEmpty(Constants.CurrentSavePath))
            {
                var d = new RealFileDisk();
                d.readOnly = false;
                d.Open(Path.Combine(Constants.CurrentSavePath, "usrdisk"));
                FileUtils.disks["usr"] = d;
            }

            // Prepare the env map
            env = new ValMap();
            if (FileUtils.disks.ContainsKey("usr") && FileUtils.disks["usr"] != null)
            {
                env["curdir"] = new ValString("/usr/");
            }
            else
            {
                env["curdir"] = new ValString("/sys/demo");
            }
            env["home"]       = new ValString("/usr/");
            env["prompt"]     = new ValString("]");
            env["morePrompt"] = new ValString("...]");

            // NOTE: importPaths is also in the reset function in startup.ms.
            // If you change this in either place, change it in both!
            var importPaths = new List <string> {
                ".", "/usr/lib", "/sys/lib"
            };

            env["importPaths"] = importPaths.ToValue();

            RunStartupScripts();
        }
Esempio n. 22
0
        public static ValMap GetInfo(GameLocation loc, Vector2 xy)
        {
            // check farmers
            if (Game1.player.currentLocation == loc && Game1.player.getTileLocation() == xy)
            {
                return(ToMap(Game1.player));
            }
            foreach (var farmer in Game1.otherFarmers.Values)
            {
                if (farmer.currentLocation == loc && farmer.getTileLocation() == xy)
                {
                    return(ToMap(farmer));
                }
            }

            // check NPCs
            foreach (var character in loc.characters)
            {
                if (character.getTileLocation() == xy)
                {
                    return(ToMap(character));
                }
            }

            // check objects
            StardewValley.Object obj = null;
            loc.objects.TryGetValue(xy, out obj);
            if (obj != null)
            {
                return(ToMap(obj));
            }

            // check terrain features
            TerrainFeature feature = null;

            loc.terrainFeatures.TryGetValue(xy, out feature);
            if (feature != null)
            {
                return(ToMap(feature));
            }

            // check LARGE terrain features
            // (not 100% certain we need to check these separately, but maybe)
            var xyBounds = new Rectangle((int)(xy.X * 64), (int)(xy.Y * 64), 64, 64);

            foreach (LargeTerrainFeature ltf in loc.largeTerrainFeatures)
            {
                if (ltf.getBoundingBox().Intersects(xyBounds))
                {
                    return(ToMap(ltf));
                }
            }

            // check resource clumps (these span multiple tiles)
            var bbox = new Rectangle((int)xy.X * 64, (int)xy.Y * 64, 64, 64);

            foreach (var clump in loc.resourceClumps)
            {
                if (clump.getBoundingBox(clump.tile.Value).Intersects(bbox))
                {
                    return(ToMap(clump));
                }
            }

            // check water and other such terrain properties
            int    x       = (int)xy.X;
            int    y       = (int)xy.Y;
            string hasProp = null;

            if (loc.doesTileHaveProperty(x, y, "Water", "Back") != null)
            {
                hasProp = "Water";
            }
            if (loc.doesTileHaveProperty(x, y, "Trough", "Back") != null)
            {
                hasProp = "Trough";
            }
            if (loc.doesTileHaveProperty(x, y, "Bed", "Back") != null)
            {
                hasProp = "Bed";
            }
            if (!string.IsNullOrEmpty(hasProp))
            {
                var result = new ValMap();
                result.map[_type] = new ValString("Property");
                result.map[_name] = new ValString(hasProp);
                return(result);
            }

            // check buildings
            var buildings_layer = loc.map.GetLayer("Buildings");
            var tmp             = buildings_layer.PickTile(new xTile.Dimensions.Location(x * 64, y * 64), Game1.viewport.Size);

            if (tmp != null)
            {
                var result = new ValMap();
                result.map[_type] = new ValString("Building");
                result.map[_name] = result.map[_type];
                return(result);
            }

            return(null);
        }
Esempio n. 23
0
 public int Add(ValMap sprite)
 {
     sprites.Add(sprite);
     counter++;
     return(counter - 1);
 }
Esempio n. 24
0
        public ValMap NewClass()
        {
            ValMap spriteDisplayClass = new ValMap();

            spriteDisplayClass.assignOverride = (key, value) =>
            {
                switch (key.ToString())
                {
                case "scrollX":
                    (spriteDisplayClass["ref"] as ValWrapper <SpriteDisplay>).UnWrapp().scrollX = value.FloatValue();
                    return(false);

                case "scrollY":
                    (spriteDisplayClass["ref"] as ValWrapper <SpriteDisplay>).UnWrapp().scrollY = value.FloatValue();
                    return(false);
                }
                return(true);
            };

            Intrinsic f = Intrinsic.Create("");

            f.code = (context, partialResult) =>
            {
                var self          = context.GetVar("self") as ValMap;
                var spriteDisplay = (self["ref"] as ValWrapper <SpriteDisplay>).UnWrapp();
                spriteDisplay.Clear();

                return(Intrinsic.Result.Null);
            };
            spriteDisplayClass["clear"] = f.GetFunc();

            f = Intrinsic.Create("");
            f.AddParam("sprite");
            f.code = (context, partialResult) =>
            {
                var spriteVal = context.GetVar("sprite") as ValMap;
                spriteVal.assignOverride = (key, value) =>
                {
                    switch (key.ToString())
                    {
                    case "image":
                        Sprite sprite = (spriteVal["ref"] as ValWrapper <Sprite>).UnWrapp();
                        sprite.texture  = (value as ValWrapper <Texture>).UnWrapp().texture;
                        sprite.origin.X = sprite.texture.Width / 2;
                        sprite.origin.Y = sprite.texture.Height / 2;
                        return(false);

                    case "x":
                        (spriteVal["ref"] as ValWrapper <Sprite>).UnWrapp().position.X = value.FloatValue();
                        return(false);

                    case "y":
                        (spriteVal["ref"] as ValWrapper <Sprite>).UnWrapp().position.Y = Sprite.ReceiveY(value.FloatValue());
                        return(false);

                    case "rotation":
                        (spriteVal["ref"] as ValWrapper <Sprite>).UnWrapp().rotation = value.FloatValue();
                        return(false);
                    }
                    return(false);
                };

                if (spriteVal["x"] == null)
                {
                    spriteVal["x"] = ValNumber.zero;
                }
                if (spriteVal["y"] == null)
                {
                    spriteVal["y"] = ValNumber.zero;
                }
                if (spriteVal["rotation"] == null)
                {
                    spriteVal["rotation"] = ValNumber.zero;
                }
                if (spriteVal["image"] == null)
                {
                    spriteVal["image"] = ValNumber.zero;
                }

                spriteVal["ref"] = new ValWrapper <Sprite>(new Sprite());

                //Sync monomicro_Sprite with Mono_Sprite
                Sprite.SpriteClassSync(spriteVal);

                var self = context.GetVar("self") as ValMap;

                var spriteDisplay = (self["ref"] as ValWrapper <SpriteDisplay>).UnWrapp();
                spriteVal["display"] = new ValWrapper <SpriteDisplay>(spriteDisplay);
                spriteDisplay.Add(spriteVal);

                foreach (ValMap sp in spriteDisplay.sprites)
                {
                    Debug.Print(sp.ToString());
                }

                return(Intrinsic.Result.Null);
            };
            spriteDisplayClass["push"] = f.GetFunc();

            spriteDisplayClass["ref"]     = new ValWrapper <SpriteDisplay>(this);
            spriteDisplayClass["scrollX"] = ValNumber.zero;
            spriteDisplayClass["scrollY"] = ValNumber.zero;

            return(spriteDisplayClass);
        }
Esempio n. 25
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 = new ValMap();
                        }
                        resultDist = dist;
                        // On second thought, not including direction, as this makes
                        // aiming *too* precise.
                        //result.SetElem(directionStr, new ValNumber(direction));
                        result.SetElem(distanceStr, new ValNumber(Mathf.Round(dist)));
                        result.SetElem(headingStr, new ValNumber(deer.curAngle));
                        result.SetElem(speedStr, new ValNumber(deer.curSpeed));
                        result.SetElem(energyStr, new ValNumber(Mathf.Round(deer.energy)));
                        result.SetElem(healthStr, new ValNumber(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", new ValNumber(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", new ValNumber(20));
        f.AddParam("delay", new ValNumber(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));
        };
    }
Esempio n. 26
0
        void Prelude()
        {
            // Create Displays
            int display_counter = 0;

            SpriteDisplay new_display = new SpriteDisplay(spriteBatch);

            new_display.Cartesian = Cartesian;
            displays.Add(new_display);
            var new_display_val = new_display.NewClass();

            displays[display_counter].DisplayRef = new_display_val as ValMap;
            display_counter++;

            new_display           = new SpriteDisplay(spriteBatch);
            new_display.Cartesian = Cartesian;
            displays.Add(new_display);
            new_display_val = new_display.NewClass();
            displays[display_counter].DisplayRef = new_display_val as ValMap;
            display_counter++;

            // std print functions
            interpreter.standardOutput = (string s) => Debug.Print(s);
            interpreter.implicitOutput = (string s) => Debug.Print(s);
            interpreter.errorOutput    = (string s) => { Debug.Print(s); interpreter.Stop(); };

            // globals
            interpreter.SetGlobalValue("dt", ValNumber.zero);
            interpreter.SetGlobalValue("width", new ValNumber(graphicsDeviceManager.PreferredBackBufferWidth));
            interpreter.SetGlobalValue("height", new ValNumber(graphicsDeviceManager.PreferredBackBufferHeight));

            // intrinsics
            Intrinsic f = Intrinsic.Create("display");

            f.AddParam("n");
            f.code = (context, partialResult) => {
                int n = (int)context.GetVar("n").FloatValue();
                if (n >= 0 && n < displays.Count)
                {
                    return(new Intrinsic.Result(displays[n].DisplayRef));
                }
                else
                {
                    Debug.Print("Invalid Display: " + n.ToString());
                    return(Intrinsic.Result.Null);
                }
            };

            f      = Intrinsic.Create("Sprite");
            f.code = (context, partialResult) => {
                var new_sprite = Sprite.SpriteClass();
                //new_sprite.assignOverride = Sprite.SpriteClass().assignOverride;
                //new_sprite["ref"] = new ValWrapper<Sprite>(new Sprite());
                return(new Intrinsic.Result(new_sprite));
            };
            Intrinsic.shortNames[Sprite.SpriteClass()] = "Sprite";

            f = Intrinsic.Create("");
            f.AddParam("path");
            f.code = (context, partialResult) =>
            {
                string  path    = context.GetVar("path").ToString();
                Texture texture = new Texture(graphicsDeviceManager, path);
                return(new Intrinsic.Result(new ValWrapper <Texture>(texture)));
            };
            ValMap file = new ValMap();

            file["loadImage"] = f.GetFunc();
            interpreter.SetGlobalValue("file", file);
        }