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); }
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); // ----- 细菌扩散 ----- }
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); }
/// <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); }
/// <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; } } }
/// <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; }
/// <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); }
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产生影响 ----- }
private float GetConsumeLinearDelta(ref Strain parentStrain, ref CodingGene gene) => (parentStrain.Population * gene.ConsumeChemicalCoeffeicient) + gene.ConsumeChemicalIntercept;
private float GetImportChemicalDelta(ref Strain parentStrain, ref CodingGene gene) => (parentStrain.Population * gene.ImportChemicalCoeffeicient) + gene.ImportChemicalIntercept;
/// <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;
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); }