public static PregenPlanet GetDirection (PregenPlanet planet, PregenSeedizen seedizen) { var q = new Queue <PregenPlanet> (); var discovered = new HashSet <PregenPlanet> (); var pathTo = new Dictionary <PregenPlanet, PregenPlanet> (); q.Enqueue (planet); discovered.Add (planet); while (q.Count > 0) { var p = q.Dequeue (); if (p == null || p.planetType == null) continue; //check for victory if (PlanetIsDestination (p, seedizen)) { //success! construct and return the path PregenPlanet curPlanet = p; while (curPlanet != null && pathTo.ContainsKey (curPlanet)) { var prevPlanet = pathTo [curPlanet]; if (!pathTo.ContainsKey (prevPlanet)) return curPlanet; curPlanet = prevPlanet; } } var neighbors = new List <PregenPlanet> (p.connectedPlanets); var neighbors2 = new List <PregenPlanet> (); //randomize neighbors while (neighbors.Count > 0) { int at = Random.Range (0, neighbors.Count); neighbors2.Add (neighbors [at]); neighbors.RemoveAt (at); } foreach (var n in neighbors2) { if (discovered.Contains (n)) continue; discovered.Add (n); pathTo [n] = p; q.Enqueue (n); } } //welp, return a random one var options = new List <PregenPlanet> (planet.connectedPlanets); foreach (var p in planet.connectedPlanets) if (planet.vines [p].dispreferred) options.Remove (p); if (options.Count == 0) { return null; } return options [Random.Range (0, options.Count)]; }
private static bool PlanetIsDestination (PregenPlanet planet, PregenSeedizen seedizen) { if (seedizen.hasPollen) { return planet.hasDemands.NeedsPollen (seedizen); } else if (seedizen.hasWater) { return planet.hasDemands.NeedsWater (seedizen); } else if (seedizen.type == "marsh") { return planet.makesWater; } else { return planet.makesPollen; } }
public void seedizenClear(PregenSeedizen seed) { seed.seedizenOffMap (); }
public bool MeetDemandWithSeedizen (PregenSeedizen sc) { string d = sc.type; IsDemandBubble found = null; foreach (var db in myDemandBubbles) { if ((db.isGenericDemand || db.demanded == d) && db.isSeedizenDemand) { found = db; break; } } if (found) { myDemandBubbles.Remove (found); GameObject.Destroy (found.gameObject); if (myDemandBubbles.Count == 0) OnDemandsAllMet (); return true; } else { return false; } }
public bool NeedsPollenOf (PregenSeedizen sc) { string d = sc.type; foreach (var db in myDemandBubbles) { if (sc.hasPollen && (db.isGenericDemand || db.demanded == d) && !db.isSeedizenDemand) { return true; } } return false; }
public void ProcessSeedizen (PregenSeedizen seedizen) { if (planetType != null && makesPollen) { if (HasResources ()) seedizen.TurnOnPollen (); } if (planetType != null && seedizen.type == "marsh" && makesWater) { if (HasResources ()) seedizen.TurnOnWater (); } var hd = gameObject.GetComponent <PregenDemands> (); if (hd.MeetDemandWithSeedizen (seedizen)) { GameObject.Destroy (seedizen.gameObject); } if (hd.MeetDemandWithPollen (seedizen)) { seedizen.TurnOffPollen (); } if (hd.MeetDemandWithWater (seedizen)) { seedizen.TurnOffWater (); } }