public void DriverView(Thinker thinker) { ArrayList objects = new ArrayList(); Opponent self = (Opponent)thinker.Self; Camera eyes = self.Eyes; // get a local copy of the objects that the camera can see objects.Clear(); foreach (Object3D obj in eyes.VisibleObjects) { objects.Add(obj); } float range_to_nearest = 10000.0f; float bearing_to_nearest = 0.0f; Object3D nearest_object = null; // nearest red post foreach (Object3D obj in objects) { if (obj.Name.Substring(0, 3) == "red") { float range = eyes.GetDistance(obj); if (range < range_to_nearest) { range_to_nearest = range; nearest_object = obj; } } } if (nearest_object != null) { bearing_to_nearest = GetBearing(self, nearest_object); thinker.SetFact("red_post_in_sight", 1.0f); thinker.SetFact("red_post_range", range_to_nearest); thinker.SetFact("red_post_bearing", bearing_to_nearest); } else { thinker.SetFact("red_post_in_sight", 0.0f); } // nearest blue post range_to_nearest = 10000.0f; foreach (Object3D obj in objects) { if (obj.Name.Substring(0, 4) == "blue") { float range = eyes.GetDistance(obj); if (range < range_to_nearest) { range_to_nearest = range; nearest_object = obj; } } } if (nearest_object != null) { bearing_to_nearest = GetBearing(self, nearest_object); thinker.SetFact("blue_post_in_sight", 1.0f); thinker.SetFact("blue_post_range", range_to_nearest); thinker.SetFact("blue_post_bearing", bearing_to_nearest); } else { thinker.SetFact("blue_post_in_sight", 0.0f); } // nearest obstacle (vehicles and trees) range_to_nearest = 10000.0f; foreach (Object3D obj in objects) { if (obj.Name.Substring(0, 4) == "tree" || obj.Name.Substring(0, 3) == "car") { float bearing = GetBearing(self, nearest_object); float range = eyes.GetDistance(obj); // only accept nearest object within +/- 5 degrees if (Math.Abs(bearing) < 0.087266462599716478846184538424431 && range < range_to_nearest) { range_to_nearest = range; nearest_object = obj; bearing_to_nearest = bearing; } } } if (nearest_object != null) { thinker.SetFact("obstacle_in_sight", 1.0f); thinker.SetFact("obstacle_range", range_to_nearest); thinker.SetFact("obstacle_bearing", bearing_to_nearest); } else { thinker.SetFact("obstacle_in_sight", 0.0f); } }