public List<EntityInfo> NearestEntities(Entity sender, float distance) { var entities = (from entity in _worldManager.EntityList let d = Utils.GetDistance((Vector2) sender.GetCustomData()["faceposition"], sender.Body.Position) where d <= distance select entity).ToList(); return entities.Select(GetEntityInfo).ToList(); }
//Creating a child creature public Entity CreateCreature(Entity parent) { var generation = (int) parent.GetCustomData()["generation"]; var sprite = _spriteFactory.CreateCreatureSprite(); var attackSprite = _spriteFactory.CreateCreatureAttackSprite(); //Position and size is relative to parent's ones var position = ConvertUnits.ToDisplayUnits(parent.Body.Position); var size = Utils.Range(Utils.RandomSpread(parent.Size, 0.2f), GameSettings.CreatureSizeMin / 1.5f, GameSettings.CreatureSizeMax * 1.5f); var x = Utils.Random.Next(Math.Max((int) (position.X - sprite.ObjectSize*size), GameSettings.Borders.X), Math.Min((int) (position.X + sprite.ObjectSize*size), GameSettings.Borders.X + GameSettings.Borders.Width)); var y = Utils.Random.Next(Math.Max((int) (position.Y - sprite.ObjectSize*size), GameSettings.Borders.Y), Math.Min((int) (position.Y + sprite.ObjectSize*size), GameSettings.Borders.Y + GameSettings.Borders.Height)); var creature = new Creature(_worldProxy, sprite, attackSprite, ConvertUnits.ToSimUnits(new Vector2(x, y)), RandomRotation(), size, generation + 1); //We need to clone parent's neural network to child (with some interferences) var parentNetwork = (RecurrentNetwork) parent.GetCustomData()["neuralnetwork"]; var network = (RecurrentNetwork) creature.GetCustomData()["neuralnetwork"]; for (var i = 0; i < network.Layers.Count(); i++) { var layer = parentNetwork.Layers.ToList(); var newLayer = network.Layers.ToList(); var neuronsCount = layer[i].NeuronCount; if (i == 0) neuronsCount -= layer[2].NeuronCount; for (var j = 0; j < neuronsCount; j++) { var neurons = layer[i].Neurons.ToList(); var newNeurons = newLayer[i].Neurons.ToList(); for (var k = 0; k < neurons[j].SourceSynapses.Count; k++) newNeurons[j].SourceSynapses[k].Weight = Utils.RandomSpread( neurons[j].SourceSynapses[k].Weight, GameSettings.NetworkRandomSpread); for (var k = 0; k < neurons[j].DestinationSynapses.Count; k++) newNeurons[j].DestinationSynapses[k].Weight = Utils.RandomSpread(neurons[j].DestinationSynapses[k].Weight, GameSettings.NetworkRandomSpread); } } return creature; }
private void DrawHealthBar(Entity creature) { var health = (float) creature.GetCustomData()["health"]; var maxHealth = (float)creature.GetCustomData()["maxhealth"]; var position = Utils.TransformCoordinates(new Vector2(ConvertUnits.ToDisplayUnits(creature.Body.Position.X), ConvertUnits.ToDisplayUnits(creature.Body.Position.Y))); var centerX = position.X; var centerY = position.Y - creature.CurrentSprite.ObjectSize * 2 * creature.Size - 40 + GameSettings.HealthBarHeight - 20 / creature.Size; var rectangle = new Rectangle( (int)(centerX - (float)GameSettings.HealthBarWidth / 2), (int)(centerY - (float)GameSettings.HealthBarHeight / 2), (int)Math.Ceiling((health / maxHealth) * GameSettings.HealthBarWidth), GameSettings.HealthBarHeight ); var borderRectangle = new Rectangle( (int)(centerX - (float)GameSettings.HealthBarWidth / 2 - 2), (int)(centerY - (float)GameSettings.HealthBarHeight / 2 - 2), GameSettings.HealthBarWidth + 4, GameSettings.HealthBarHeight + 4 ); var color = new Color( (int)((maxHealth - health) * 2.55f), (int)(health / maxHealth * 255), 0 ); GraphicsManager.DrawBorder(borderRectangle, 2, Color.Black); GraphicsManager.DrawColoredRectangle(rectangle, color); }
private void DrawBreedingEnergyBar(Entity creature) { var breedingSatiety = (float) creature.GetCustomData()["breedingsatiety"]; var breedingTimer = (float) creature.GetCustomData()["breedingtimer"]; var breedingEnergy = (float)creature.GetCustomData()["breedingenergy"]; var energy = breedingSatiety + breedingTimer; var position = Utils.TransformCoordinates(new Vector2(ConvertUnits.ToDisplayUnits(creature.Body.Position.X), ConvertUnits.ToDisplayUnits(creature.Body.Position.Y))); var centerX = position.X; var centerY = position.Y - creature.CurrentSprite.ObjectSize * 2 * creature.Size - 80 + GameSettings.HealthBarHeight - 20 / creature.Size; var rectangle = new Rectangle( (int)(centerX - (float)GameSettings.HealthBarWidth / 2), (int)(centerY - (float)GameSettings.HealthBarHeight / 2), (int)Math.Ceiling((energy / breedingEnergy) * GameSettings.HealthBarWidth), GameSettings.HealthBarHeight ); var borderRectangle = new Rectangle( (int)(centerX - (float)GameSettings.HealthBarWidth / 2 - 2), (int)(centerY - (float)GameSettings.HealthBarHeight / 2 - 2), GameSettings.HealthBarWidth + 4, GameSettings.HealthBarHeight + 4 ); var color = new Color( 255, (int)(energy / breedingEnergy * 255), (int)((breedingEnergy - energy) * 2.55f) ); GraphicsManager.DrawBorder(borderRectangle, 2, Color.Black); GraphicsManager.DrawColoredRectangle(rectangle, color); }