//-------------------------------------------------------------------------------- #region Public Methods public void Show(Reindeer deer) { this.deer = deer; background.color = new Color(deer.color.r, deer.color.g, deer.color.b, 0.5f); nameField.text = deer.name; codeField.source = deer.miniscript; checkResultText.text = "Enter MiniScript code above. Click Check Syntax to check for basic errors."; ReindeerScript scp = deer.GetComponent <ReindeerScript>(); if (!string.IsNullOrEmpty(scp.lastError)) { ShowError(scp.lastError); } Debug.Log("scp.lastError: " + scp.lastError); gameObject.SetActive(true); codeField.Select(); }
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)); }; }
//-------------------------------------------------------------------------------- #region MonoBehaviour Events void Awake() { rscript = GetComponent <ReindeerScript>(); }