Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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();
        }