Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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);
    }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
 public void RunScript(string miniscript)
 {
     interpreter.Reset(miniscript);
     try {
         interpreter.Compile();
         lastError = null;
     } catch (Miniscript.MiniscriptException err) {
         reindeer.health   = 0;
         reindeer.killedBy = err.Description();
         lastError         = err.Description();
         Debug.Log("RunScript error: " + lastError);
         return;
     }
     interpreter.SetGlobalValue("heading", ValNumber.Create(reindeer.targetAngle));
     interpreter.SetGlobalValue("speed", ValNumber.Create(reindeer.targetSpeed));
     UpdateScriptFromSelf();
 }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
0
    //--------------------------------------------------------------------------------
    #region Private Methods

    ValNumber GetDeerCount()
    {
        if (Time.frameCount == deerCountFrame && deerCount != null)
        {
            return(deerCount);
        }
        int count = 0;

        foreach (Reindeer rd in game.deer)
        {
            if (rd.gameObject.activeSelf)
            {
                count++;
            }
        }
        deerCountFrame = Time.frameCount;
        deerCount      = new ValNumber(count);
        return(deerCount);
    }
Ejemplo n.º 7
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)));
    }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
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));
        };
    }