示例#1
0
		void Update()
		{
			if (World.Paused)
				return;

			if (dead)
				return;
			Energy -= world.CuberGlobal.EnergyConsistent * Time.deltaTime;
			if (Energy <= 0f)
			{
				BeginDeath();
				return;
			}

			// only do movment updates every Wait.
			timer += Time.deltaTime;
			if (timer > world.CuberGlobal.Wait)
				timer = 0f;
			else
				return;

			if (!animator.GetCurrentAnimatorStateInfo(0).IsName("Idle"))
				return;

			Life -= 1;
			if (Life <= 0)
			{
				BeginDeath();
				return;
			}
			Mesh.material = world.GetCuberMat(Infected, Life);

			if (targetFood)
			{
				Debug.LogWarning("Did not finish eating!");
				targetFood = null;
			}

			// Hack to fix not being on ground.
			{
				Vector3 position;
				if (World.FindGround(new Ray(transform.position + Vector3.up, Vector3.down), out position))
				{
					float error = 0.25f;
					if (transform.position.y + error < position.y || transform.position.y - error > position.y)
					{
						float diff = transform.position.y - position.y;
						transform.position = position;
						Debug.LogWarning("HACK: Fixed not being on ground. difference: " + diff);
					}
				}
			}

			// repruduce
			if (Fourths == 4)
			{
				Vector3 position;
				if (World.FindGround(new Ray(transform.position + Vector3.up, Vector3.down), out position))
				{
					Life -= 4;
					animator.SetTrigger("GiveBirth");
					//timer -= 5f;
					return;
				}
			}

			findMoveEat(false);
		}
示例#2
0
		public void FinishEating()
		{
			if (targetFood.Consumed)
			{
				targetFood = null;
				return;
			}

			if (targetFood is Fourth)
			{
				Fourths += 1;
				//Color color = ((Fourth)targetFood).Color.gamma;
				//FourthsColor.r += color.r / 4f;
				//FourthsColor.g += color.g / 4f;
				//FourthsColor.b += color.b / 4f;
			}
			else if (targetFood is Energy)
			{

				Energy += ((Energy)targetFood).TakePortion();
			}
			else
				Debug.LogWarning("Unknown edible: " + targetFood.GetType().Name);

			targetFood.Consume();
			targetFood = null;
		}
示例#3
0
		public void Init(Vector3 position, bool infected, float lifeMul)//, Color color)
		{
			lifeMul = Mathf.Clamp01(lifeMul);
			Infected = infected;
			Energy = world.CuberGlobal.InitialEnergy * lifeMul;
			Life = (int)((float)world.CuberGlobal.InitialLife * lifeMul);
			if (Infected)
			{
				//Mesh.material = world.CuberGlobal.InfectedBodyMat;
				Energy *= 2f;
				Life *= 2;
			}
			//else
			//{
			//	Mesh.material = world.CuberGlobal.BodyMat;
			//	if (color != Color.black)
			//		Mesh.material.color = color;
			//}
			Mesh.material = world.GetCuberMat(infected, Life);
			Fourths = 0;
			FourthsColor = Color.black.gamma;

			timer = (float)world.Random.NextDouble() * world.CuberGlobal.Wait;
			transform.position = position;
			transform.rotation = Quaternion.Euler(0, world.Random.Next(360), 0);
			//ToDo : Animations are not being reset...
			//animator.Play("Idle", 0, (float)world.Random.NextDouble());
			animator.SetTrigger("Idle");
			dead = false;
			targetFood = null;
		}
示例#4
0
		private void findMoveEat(bool debug)
		{
			Global g = World.Instance.CuberGlobal;
			// Find a target to go for.
			Edible target = null;
			float distance = float.MaxValue;
			float tmpDistance, tmpWeight;
			float weight = 0f;
			if (Fourths < 4)
			{
				var fourths = world.GetFourthsInView(transform.position);
				for (int i = 0; i < fourths.Count; ++i)
				{
					tmpDistance = Vector3.Distance(transform.position, fourths[i].transform.position);
					tmpWeight = ((Fourths + 1) * g.WeightFourth) / chkZ(fourths[i].Wanted * g.WeightWanted) / chkZ(tmpDistance * g.WeightDistance);
					if (debug)
					{
						Vector3 v = fourths[i].transform.position;
						v.y += 2f + tmpWeight * 0.5f;
						Gizmos.color = Color.blue;
						Gizmos.DrawCube(v, new Vector3(0.2f, tmpWeight, 0.2f));
					}

					if (tmpWeight > weight)
					{
						distance = tmpDistance;
						weight = tmpWeight;
						target = fourths[i];
					}
				}
			}
			// try for energy 
			var energy = world.GetEnergyInView(transform.position);
			for (int i = 0; i < energy.Count; ++i)
			{
				tmpDistance = Vector3.Distance(transform.position, energy[i].transform.position);
				tmpWeight = (energy[i].Amount * g.WeightEnergy) / chkZ(Energy * g.WeightCurrentEnergy) / chkZ(energy[i].Wanted * g.WeightWanted) / chkZ(tmpDistance * g.WeightDistance);
				if (debug)
				{
					Vector3 v = energy[i].transform.position;
					v.y += 2f + tmpWeight * 0.5f;
					Gizmos.color = Color.yellow;
					Gizmos.DrawCube(v, new Vector3(0.2f, tmpWeight, 0.2f));
				}

				if (tmpWeight > weight)
				{
					distance = tmpDistance;
					weight = tmpWeight;
					target = energy[i];
				}
			}

			// no target return
			if (!target || debug)
				return;

			transform.LookAt(new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z));

			target.Want();

			// if we are close, eat it.
			if (distance < 1.5f)
			{
				targetFood = target;
				animator.SetTrigger("Eat");

			} // else hop to it.
			else if (Energy > world.CuberGlobal.EnergyHop)
			{
				Energy -= world.CuberGlobal.EnergyHop;
				animator.SetTrigger("Hop");
			}

		}