Beispiel #1
0
        public static OrganismDesign Mutate(OrganismDesign design)
        {
            List <OrganismDesign.GrowPattern> copyPattern;

            switch (Game1.rnd.Next(80))
            {
            case 0:     // change block type
            {
                copyPattern = design.GrowPatterns.ToList();
                int index = Game1.rnd.Next(copyPattern.Count);
                OrganismDesign.GrowPattern p = copyPattern[index];
                p.blockType        = (BlockType)(Game1.rnd.Next(6) + 1);
                copyPattern[index] = p;
            }
            break;

            case 1:     // change direction
            {
                copyPattern = design.GrowPatterns.ToList();
                int index = Game1.rnd.Next(copyPattern.Count);
                OrganismDesign.GrowPattern p = copyPattern[index];
                p.direction        = (Direction)(Game1.rnd.Next(4));
                copyPattern[index] = p;
            }
            break;

            case 2:     // change blockNum
            {
                copyPattern = design.GrowPatterns.ToList();
                int index = Game1.rnd.Next(copyPattern.Count);
                OrganismDesign.GrowPattern p = copyPattern[index];
                p.blockNum         = Game1.rnd.Next(index);
                copyPattern[index] = p;
            }
            break;

            case 3:     // add a block
            {
                if (design.GrowPatterns.Count < 255)
                {
                    copyPattern = design.GrowPatterns.ToList();
                    OrganismDesign.GrowPattern p = new OrganismDesign.GrowPattern();
                    p.blockType = (BlockType)(Game1.rnd.Next(7) + 1);
                    p.direction = (Direction)(Game1.rnd.Next(4));
                    p.blockNum  = Game1.rnd.Next(copyPattern.Count);
                    copyPattern.Add(p);
                }
                else
                {
                    return(design);
                }
            }
            break;

            case 4:     // remove a block
            {
                copyPattern = design.GrowPatterns.ToList();
                int index = Game1.rnd.Next(copyPattern.Count);
                copyPattern.RemoveAt(index);
                for (int Idx = index; Idx < copyPattern.Count; ++Idx)
                {
                    OrganismDesign.GrowPattern p = copyPattern[Idx];
                    if (p.blockNum > index)
                    {
                        p.blockNum--;
                    }
                    copyPattern[Idx] = p;
                }
            }
            break;

            default:
                return(design);
            }

            OrganismDesign copyDesign = new OrganismDesign
            {
                GrowPatterns = copyPattern
            };

            return(copyDesign);
        }
Beispiel #2
0
        public Organism Update(Game1 game)
        {
            if (baby)
            {
                baby = false;
                return(this);
            }

            Move(-MovePressure * 0.5f, game);
            Age++;
            if (Age > 1000)
            {
                Die(game);
            }
            else if (!dead)
            {
                if (nextGrow > 0)
                {
                    OrganismDesign.GrowPattern pattern = Design.GrowPatterns[Design.GrowPatterns.Count - 1 - nextGrow];
                    if (pattern.blockType == BlockType.NextGrow)
                    {
                        nextGrow = (short)(pattern.blockNum % Design.GrowPatterns.Count);
                    }
                    else
                    {
                        int   pieceIdx = Math.Min(pattern.blockNum, Pieces.Count - 1);
                        Point pos      = Pieces.Count == 0 ? Point.Zero : Pieces[pieceIdx].Position + Game1.ToPoint(pattern.direction);
                        if (Grow(pos, pattern.blockType, game, pieceIdx: pieceIdx))
                        {
                            nextGrow--;
                        }
                    }
                }

                bool firstBone = true;
                foreach (var piece in Pieces)
                {
                    Point pos   = WorldPos(piece.Position);
                    Block block = game.Blocks[pos.X, pos.Y];
                    if (block.EnergyAmount > 0)
                    {
                        Energy++;
                        game.Blocks[pos.X, pos.Y].EnergyAmount--;
                    }
                    switch (piece.BlockType)
                    {
                    case BlockType.Leaf:
                        Energy += block.SunlightAmount / 1000f;
                        break;

                    case BlockType.Bone:
                        if (firstBone)
                        {
                            Energy   -= 0.05f;
                            firstBone = false;
                        }
                        break;

                    case BlockType.Buoyancy:
                        Energy -= 0.1f;
                        break;

                    case BlockType.Sinker:
                        Energy -= 0.1f;
                        break;

                    case BlockType.Engine:
                        Energy -= 0.4f;
                        break;

                    case BlockType.Heart:
                        Energy -= 0.1f;
                        break;
                    }

                    /* case BlockType.Grower:
                     *   RunGrower(piece.Position, game);
                     *   break;
                     */
                }

                if (Energy <= 0)
                {
                    Die(game);
                }
            }

            return(this);
        }