예제 #1
0
        public bool Consume(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            if (string.IsNullOrEmpty(gene.ConsumeChemicalName))
            {
                return(true);
            }
            string ConsumeChemicalName = gene.ConsumeChemicalName.Clone() as string;
            // 若消耗物质不存在,gene罢工
            var chemicalToConsume = (gene.IsConsumePublic ? currentBlock.PublicChemicals : parentStrain.PrivateChemicals).Find(chem => { return(chem.Name == ConsumeChemicalName); });

            if (chemicalToConsume == null)
            {
                if (gene.ConsumeChemicalName == "")
                {
                    return(true); // 不消耗
                }
                return(false);    // 根本不存在该物质,不工作
            }
            int count = (int)GetConsumeLinearDelta(ref parentStrain, ref gene);

            if (chemicalToConsume.Count >= count)
            {
                chemicalToConsume.Count -= count;
            }
            else
            {
                return(false);
            }
            return(true);
        }
예제 #2
0
        public bool StrainSpread(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            var SpreadConditionRate = gene.SpreadConditionRate;

            // ----- 细菌扩散 -----
            // 是否满足扩散条件

            // 避免人口为0时的幽灵扩散
            if (parentStrain.Population == 0 || gene.FirstSpreadMountRate.Equals(0))
            {
                return(true);
            }
            if (parentStrain.Population >= currentBlock.Capacity * SpreadConditionRate)
            {
                string strainName = parentStrain.Name.Clone() as string;
                // 为周围的格子添加该细菌
                foreach (var neighborBlock in currentBlock.NeighborBlocks)
                {
                    // 只要隔壁有存在相同的strain,就不传递
                    if (neighborBlock.Strains.Exists(m => { return(m.Name == strainName); }))
                    {
                        continue;
                    }
                    var cloneStrain = ( Strain )parentStrain.Clone();
                    // 设定初始人口数
                    cloneStrain.Population = ( int )(parentStrain.Population * gene.FirstSpreadMountRate);
                    neighborBlock.Strains.Add(cloneStrain);
                }
            }
            return(true);
            // ----- 细菌扩散 -----
        }
예제 #3
0
        public bool ProductChemical(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            if (string.IsNullOrEmpty(gene.ProductionChemicalName))
            {
                return(true);
            }
            var ProductionChemicalName = gene.ProductionChemicalName;
            var productionChemical     = Local.FindChemicalByName(ProductionChemicalName);
            // ----- 对化学物质产生影响 -----
            // 查找是否存在这个物质
            var productChem = currentBlock.PublicChemicals.Find(che => { return(che.Name == ProductionChemicalName); });

            if (productChem == null)
            {
                productChem = new Chemical {
                    Name       = ProductionChemicalName,
                    Count      = 0,
                    SpreadRate = productionChemical.SpreadRate
                };
                // 向block物质集中添加改变的chemical
                currentBlock.PublicChemicals.Add(productChem);
            }
            productChem.Count += ( int )GetProductionChemicalDelta(ref parentStrain, ref gene);
            // ----- 对化学 物质产生影响 -----
            return(true);
        }
예제 #4
0
        /// <summary>
        /// 分解的量的公式需要再修改
        /// </summary>
        /// <param name="parentStrain"></param>
        /// <param name="currentBlock"></param>
        /// <param name="gene"></param>
        /// <returns></returns>
        public bool Decomposite(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            if (string.IsNullOrEmpty(gene.DecompositionChemicalName))
            {
                return(true);
            }
            string DeposChemicalName = gene.DecompositionChemicalName.Clone() as string;
            // 若分解物质不存在,gene罢工
            var decompositeChemical   = currentBlock.PublicChemicals.Find(chem => { return(chem.Name == DeposChemicalName); });
            var chemicalToDecomposite = (gene.IsDecompositionPublic ? currentBlock.PublicChemicals : parentStrain.PrivateChemicals).Find(chem => { return(chem.Name == DeposChemicalName); });

            if (chemicalToDecomposite == null)
            {
                return(false); // 根本不存在该物质,不工作
            }
            else
            {
                if (chemicalToDecomposite.Count >= gene.DecompositionChemicalCount)
                {
                    chemicalToDecomposite.Count -= gene.DecompositionChemicalCount;
                }
                else
                {
                    return(false); // 需要消耗的量不足,不工作
                }
            }
            return(true);
        }
예제 #5
0
 /// <summary>
 /// 游戏核心函数
 /// </summary>
 /// <param name="parentStrain">该基因的父细菌</param>
 /// <param name="currentBlock">父细菌所在的block</param>
 public void Effect(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
 {
     foreach (var eve in EffectEvents)
     {
         if (!eve(ref parentStrain, ref currentBlock, ref gene))
         {
             //Debug.Log("Stop at" + EffectEvents.FindIndex( m => m == eve ) + "\n Name: " + eve.Method.Name );
             return;
         }
     }
 }
예제 #6
0
        /// <summary>
        /// 游戏性问题 #22
        /// https://github.com/bennycui99/Cellwar.Game/issues/22
        /// </summary>
        public static void TestDeathGeneImportChemical_Usable()
        {
            CodingGene g = new CodingGene
            {
                Name = "g",
                ImportChemicalName         = "c",
                ImportChemicalIntercept    = 1,
                ImportChemicalCoeffeicient = 0.01f,
            };

            Chemical c = new Chemical
            {
                Name  = "c",
                Count = 10
            };

            Strain s = new Strain();

            s.PrivateChemicals.Add(ObjectHelper.Clone(c));

            Block b = new Block();

            GameData.Local.AllChemicals = new List <Chemical>();
            GameData.Local.AllChemicals.Add(ObjectHelper.Clone(c));
            c.Count = 100;
            b.PublicChemicals.Add(ObjectHelper.Clone(c));

            CodingGeneController ctor = new CodingGeneController();

            ctor.ImportChemical(ref s, ref b, ref g);

            //
            Debug.Log(b.PublicChemicals.Find(cc => cc.Name == "c").Count);
            Debug.Log(s.PrivateChemicals.Find(cc => cc.Name == "c").Count);
            Debug.Assert(b.PublicChemicals.Find(cc => cc.Name == "c").Count < 100);

            //
            s.PrivateChemicals.Clear();
            ctor.ImportChemical(ref s, ref b, ref g);
            Debug.Log(b.PublicChemicals.Find(cc => cc.Name == "c").Count);
            Debug.Log(s.PrivateChemicals.Find(cc => cc.Name == "c").Count);
            Debug.Assert(b.PublicChemicals.Find(cc => cc.Name == "c").Count < 100);


            GameData.Local.AllChemicals = null;
        }
예제 #7
0
        /// <summary>
        /// 游戏性问题 #22
        /// https://github.com/bennycui99/Cellwar.Game/issues/22
        /// </summary>
        public static void TestPrivateChemical_Usable()
        {
            CodingGene g = new CodingGene
            {
                Name = "g",
                ConsumeChemicalName         = "c",
                ConsumeChemicalIntercept    = 1,
                ConsumeChemicalCoeffeicient = 0.1f,
                IsConsumePublic             = false
            };

            Chemical c = new Chemical
            {
                Name  = "c",
                Count = 100
            };

            Strain s = new Strain();

            s.PrivateChemicals.Add(c);

            Block b = new Block();

            CodingGeneController ctor = new CodingGeneController();

            ctor.Consume(ref s, ref b, ref g);
            Debug.Log(s.PrivateChemicals.Find(ss => ss.Name == "c").Count);
            Debug.Assert(s.PrivateChemicals.Find(ss => ss.Name == "c").Count < 100);
            ctor.Consume(ref s, ref b, ref g);
            Debug.Log(s.PrivateChemicals.Find(ss => ss.Name == "c").Count);

            Debug.Assert(s.PrivateChemicals.Find(ss => ss.Name == "c").Count < 100);

            Debug.Log(s.PrivateChemicals.Find(ss => ss.Name == "c").Count);
            ctor.Consume(ref s, ref b, ref g);
            Debug.Assert(s.PrivateChemicals.Find(ss => ss.Name == "c").Count < 100);

            Debug.Log(s.PrivateChemicals.Find(ss => ss.Name == "c").Count);
            ctor.Consume(ref s, ref b, ref g);
            Debug.Assert(s.PrivateChemicals.Find(ss => ss.Name == "c").Count < 100);
        }
예제 #8
0
        public bool ImportChemical(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            if (string.IsNullOrEmpty(gene.ImportChemicalName))
            {
                return(true);
            }
            var ImportChemicalName = gene.ImportChemicalName;
            // --- 添加私有化学库的量 ---
            // 先寻找block内是否存在该种化学物质
            var importChemical = Local.FindChemicalByName(ImportChemicalName);
            var publicChemical = currentBlock.PublicChemicals.Find(chem => { return(chem.Name == ImportChemicalName); });

            if (publicChemical != null)
            {
                var privateChemical = parentStrain.PrivateChemicals.Find(chem => { return(chem.Name == publicChemical.Name); });
                if (privateChemical == null)
                {
                    parentStrain.PrivateChemicals.Add(privateChemical = new Chemical {
                        Count      = 0,
                        Name       = ImportChemicalName,
                        SpreadRate = importChemical.SpreadRate
                    });  // 如果没有,先添加
                }
                var importCount = ( int )GetImportChemicalDelta(ref parentStrain, ref gene);
                // 只要还能导入
                if (publicChemical.Count >= importCount)
                {
                    privateChemical.Count += importCount;
                    publicChemical.Count  -= importCount;
                    //Debug.Log("imported by " + gene.Name);
                    //Debug.Log("privateChemical " + privateChemical.Count );
                    //Debug.Log("publicChemical " + publicChemical.Count );
                }
            }
            return(true);
            // ----- 对父strain产生影响 -----
        }
예제 #9
0
 private float GetConsumeLinearDelta(ref Strain parentStrain, ref CodingGene gene) => (parentStrain.Population * gene.ConsumeChemicalCoeffeicient) + gene.ConsumeChemicalIntercept;
예제 #10
0
 private float GetImportChemicalDelta(ref Strain parentStrain, ref CodingGene gene) => (parentStrain.Population * gene.ImportChemicalCoeffeicient) + gene.ImportChemicalIntercept;
예제 #11
0
 /// <summary>
 /// 人口*系数 的值影响物质改变量的大小
 /// 7.18 改动?
 /// </summary>
 /// <param name="parentStrain"></param>
 /// <returns></returns>
 private float GetPopulationDelta(ref Strain parentStrain, ref CodingGene gene) => (parentStrain.Population * gene.PopulationCoefficient) + gene.PopulationIntercept;
예제 #12
0
        public bool ModifyPopulation(ref Strain parentStrain, ref Block currentBlock, ref CodingGene gene)
        {
            var delta = ( int )GetPopulationDelta(ref parentStrain, ref gene);

            if (delta == 0)
            {
                return(false);
            }
            if (currentBlock.IsPopulationBeingFull(delta) && !currentBlock.IsPopulationFull())      // 最后一次人口增加,即将变满
            {
                parentStrain.Population += currentBlock.Capacity - currentBlock.TotalPopulation;
            }
            else if (currentBlock.IsPopulationFull() && delta > 0)      // 人口已满,无法增加,且任然增加人口
            {
                return(false);
            }
            else
            {
                parentStrain.Population += delta;
            }
            return(true);
        }