public void Initialize() { Genome = new Genome(new float[68], new float[68]); var caj = Entity.FindComponent <ComponentAutoJump>(); if (caj != null) { Genome[Trait.JumpStrength] = caj.m_jumpStrength; } var cafb = Entity.FindComponent <ComponentAvoidFireBehavior>(); if (cafb != null) { Genome[Trait.AvoidFire_DayRange] = cafb.m_dayRange; Genome[Trait.AvoidFire_NightRange] = cafb.m_nightRange; } var capb = Entity.FindComponent <ComponentAvoidPlayerBehavior>(); if (capb != null) { Genome[Trait.AvoidPlayer_DayRange] = capb.m_dayRange; Genome[Trait.AvoidPlayer_NightRange] = capb.m_nightRange; } var cb = Entity.FindComponent <ComponentBody>(); if (cb != null) { var boxSize = cb.BoxSize; Genome[Trait.BoxSizeX] = boxSize.X; Genome[Trait.BoxSizeY] = boxSize.Y; Genome[Trait.BoxSizeZ] = boxSize.Z; Genome[Trait.Mass] = cb.Mass; Genome[Trait.Density] = cb.Density; var vec2 = cb.AirDrag; Genome[Trait.AirDragX] = vec2.X; Genome[Trait.AirDragY] = vec2.Y; vec2 = cb.WaterDrag; Genome[Trait.WaterDragX] = vec2.X; Genome[Trait.WaterDragY] = vec2.Y; Genome[Trait.WaterSwayAngle] = cb.WaterSwayAngle; Genome[Trait.WaterTurnSpeed] = cb.WaterTurnSpeed; Genome[Trait.MaxSmoothRiseHeight] = cb.MaxSmoothRiseHeight; } var ccb = Entity.FindComponent <ComponentChaseBehavior>(); if (ccb != null) { Genome[Trait.DayChaseRange] = ccb.m_dayChaseRange; Genome[Trait.NightChaseRange] = ccb.m_nightChaseRange; Genome[Trait.DayChaseTime] = ccb.m_dayChaseTime; Genome[Trait.NightChaseTime] = ccb.m_nightChaseTime; Genome[Trait.AutoChaseMask] = (int)ccb.m_autoChaseMask; Genome[Trait.ChaseNonPlayerProbability] = ccb.m_chaseNonPlayerProbability; Genome[Trait.ChaseWhenAttackedProbability] = ccb.m_chaseWhenAttackedProbability; Genome[Trait.ChaseOnTouchProbability] = ccb.m_chaseOnTouchProbability; } var cdb = Entity.FindComponent <ComponentDigInMudBehavior>(); if (cdb != null) { Genome[Trait.MaxDigInDepth] = cdb.m_maxDigInDepth; } var ceb = Entity.FindComponent <ComponentEatPickableBehavior>(); if (ceb != null) { Genome[Trait.MeatFoodFactor] = ceb.m_foodFactors[(int)FoodType.Meat]; Genome[Trait.FishFoodFactor] = ceb.m_foodFactors[(int)FoodType.Fish]; Genome[Trait.FruitFoodFactor] = ceb.m_foodFactors[(int)FoodType.Fruit]; Genome[Trait.GrassFoodFactor] = ceb.m_foodFactors[(int)FoodType.Grass]; Genome[Trait.BreadFoodFactor] = ceb.m_foodFactors[(int)FoodType.Bread]; } var cfb = Entity.FindComponent <ComponentFindPlayerBehavior>(); if (cfb != null) { Genome[Trait.FindPlayer_DayRange] = cfb.m_dayRange; Genome[Trait.FindPlayer_NightRange] = cfb.m_nightRange; } var cge = Entity.FindComponent <ComponentGlowingEyes>(); if (cge != null) { Genome[Trait.GlowingEyesColor] = cge.GlowingEyesColor.PackedValue & 16777215u; } var ch = Entity.FindComponent <ComponentHealth>(); if (ch != null) { Genome[Trait.AttackResilience] = ch.AttackResilience; Genome[Trait.FallResilience] = ch.FallResilience; Genome[Trait.FireResilience] = ch.FireResilience; Genome[Trait.CanStrand] = ch.CanStrand ? 1 : -1; Genome[Trait.AirCapacity] = ch.AirCapacity; } var chb = Entity.FindComponent <ComponentHerdBehavior>(); if (chb != null) { float v = chb.m_herdingRange; if (chb.m_autoNearbyCreaturesHelp) { v = -v; } Genome[Trait.HerdingRange] = v; } var cl = Entity.FindComponent <ComponentLocomotion>(); if (cl != null) { Genome[Trait.AccelerationFactor] = cl.AccelerationFactor; Genome[Trait.WalkSpeed] = cl.WalkSpeed; Genome[Trait.WalkSpeedWhenTurning] = cl.m_walkSpeedWhenTurning; Genome[Trait.LadderSpeed] = cl.LadderSpeed; Genome[Trait.JumpSpeed] = cl.JumpSpeed; Genome[Trait.CreativeFlySpeed] = cl.CreativeFlySpeed; Genome[Trait.FlySpeed] = cl.FlySpeed; Genome[Trait.SwimSpeed] = cl.SwimSpeed; Genome[Trait.TurnSpeed] = cl.TurnSpeed; Genome[Trait.LookSpeed] = cl.LookSpeed; Genome[Trait.InAirWalkFactor] = cl.InAirWalkFactor; int v = cl.m_lookAutoLevelX ? 1 : 0; if (cl.m_lookAutoLevelY) { v |= 2; } Genome[Trait.LookAutoLevel] = v; } var cloot = Entity.FindComponent <ComponentLoot>(); if (cloot != null) { ComponentLoot.Loot item; if (cloot.m_lootList.Count > 0) { item = cloot.m_lootList[0]; Genome[Trait.LootMinCount] = item.MinCount; Genome[Trait.LootMaxCount] = item.MaxCount; Genome[Trait.LootProbability] = item.Probability; } if (cloot.m_lootOnFireList.Count > 0) { item = cloot.m_lootOnFireList[0]; Genome[Trait.LootOnFireMinCount] = item.MinCount; Genome[Trait.LootOnFireMaxCount] = item.MaxCount; Genome[Trait.LootOnFireProbability] = item.Probability; } } var cmr = Entity.FindComponent <ComponentMiner>(); if (cmr != null) { Genome[Trait.AttackPower] = cmr.AttackPower; } var cm = Entity.FindComponent <ComponentModel>(); if (cm != null) { Genome[Trait.DiffuseColor] = new Color(cm.DiffuseColor ?? Vector3.One).PackedValue & 16777215u; Genome[Trait.Opacity] = cm.Opacity ?? 1; } var cleb = Entity.FindComponent <ComponentLayEggBehavior>(); if (cleb != null) { Genome[Trait.LayFrequency] = cleb.m_layFrequency; } var cs = Entity.FindComponent <ComponentShapeshifter>(); if (cs != null) { Genome[Trait.ShapeshifterProbability] = cs.ValuesDictionary.GetValue <float>("Probability"); } var cssb = Entity.FindComponent <ComponentStubbornSteedBehavior>(); if (cssb != null) { Genome[Trait.StubbornProbability] = cssb.m_stubbornProbability; } var cu = Entity.FindComponent <ComponentUdder>(); if (cu != null) { Genome[Trait.MilkRegenerationTime] = cu.m_milkRegenerationTime; } }
public void Mutate() { Genome genome; Trait t; if (Period > 900) { genome = new Genome(OGenome, new float[OGenome.Length]); float f = (float)LastTime / 6000; if (f > 2.5f) { goto a; } f = 1.5f - MathUtils.Cos(f * f / 2) / 2; for (t = Trait.DayChaseRange; t <= Trait.NightChaseTime; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, f); } } for (t = Trait.WalkSpeed; t < Trait.TurnSpeed; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, f); } } for (t = Trait.AttackResilience; t <= Trait.FireResilience; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, f); } } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.AttackPower] *= Utils.Random.UniformFloat(1f, f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.FindPlayer_DayRange] *= Utils.Random.UniformFloat(1f, f); } else { genome[Trait.FindPlayer_NightRange] *= Utils.Random.UniformFloat(1f, f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.DigSpeed] *= Utils.Random.UniformFloat(1f, f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.AirCapacity] *= Utils.Random.UniformFloat(1f, f); } goto a; } genome = Genome; for (t = Trait.DayChaseRange; t <= Trait.NightChaseTime; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, 1.1f); } } for (t = Trait.WalkSpeed; t < Trait.TurnSpeed; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, 1.1f); } } for (t = Trait.AttackResilience; t <= Trait.FireResilience; t++) { if ((Utils.Random.Int() & 1) != 0) { genome[t] *= Utils.Random.UniformFloat(1f, 1.08f); } } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.AttackPower] *= Utils.Random.UniformFloat(1f, 1.1f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.FindPlayer_DayRange] *= Utils.Random.UniformFloat(1f, 1.08f); } else { genome[Trait.FindPlayer_NightRange] *= Utils.Random.UniformFloat(1f, 1.08f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.DigSpeed] *= Utils.Random.UniformFloat(1f, 1.04f); } if ((Utils.Random.Int() & 1) != 0) { genome[Trait.AirCapacity] *= Utils.Random.UniformFloat(1f, 1.04f); } a: Genome = genome; OnEntityAdded(); }