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); }
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); }