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); }
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); }
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); }
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(); }
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); }
//-------------------------------------------------------------------------------- #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); }
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))); }
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); }
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)); }; }