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 ();
	}
Beispiel #4
0
	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;
		}
	}
Beispiel #5
0
	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 ();
		}
	}