static float GetTownChangeValue(float finalFTerType, IntVector2 worldXZ, float[] terTypeInc) { if (VArtifactUtil.HasTown()) { if (finalFTerType > TownFTerTypeTop(terTypeInc)) { VArtifactTown vat; float factorValue = 1; float nearTownDistance = VATownGenerator.Instance.GetAreaTownDistance(worldXZ.x, worldXZ.y, out vat); //float terTypeDistanceFactor = 1;//+(finalFTerType-TownFTerTypeTop)/(1-TownFTerTypeTop)*TownHillChangeFactor; float scaledX = worldXZ.x * s_detailScale; float scaledZ = worldXZ.y * s_detailScale; float changeNoise = Mathf.Abs((float)myNoise[TownChangeIndex].Noise(scaledX * TownChangeFrequency, scaledZ * TownChangeFrequency)); //1~0~1 // changeNoise = 1-changeNoise; //0~1~0; float changeFactor = 1 + changeNoise * TownChangeFactor; if (vat != null) { if (nearTownDistance < vat.SmallRadius * changeFactor) { factorValue = 0; } else if (nearTownDistance < (vat.SmallRadius + TownHillDistance) * changeFactor) { factorValue = (nearTownDistance - vat.SmallRadius * changeFactor) / (TownHillDistance * changeFactor); } } if (factorValue > 0) { // float nearConnectionDistance = VATownGenerator.Instance.GetConnectionLineDistance(worldXZ); // if(nearConnectionDistance <TownConnectionWidth*changeFactor){ // factorValue=0; // } // else if(nearConnectionDistance<(TownConnectionWidth+TownConnectionHillDistance)*changeFactor){ // float temp = (nearConnectionDistance-TownConnectionWidth*changeFactor)/(TownConnectionHillDistance*changeFactor); // if(factorValue >temp) // factorValue = temp; // } float temp = GetTownConnectionFactor(worldXZ.x, worldXZ.y, TownConnectionHillDistance, changeFactor); if (factorValue > temp) { factorValue = temp; } } finalFTerType = factorValue * (finalFTerType - TownFTerTypeTop(terTypeInc)) + TownFTerTypeTop(terTypeInc); } else if (finalFTerType < TownFTerTypeBottom(terTypeInc)) { VArtifactTown vat; float factorValue = 1; float nearTownDistance = VATownGenerator.Instance.GetAreaTownDistance(worldXZ.x, worldXZ.y, out vat); float scaledX = worldXZ.x * s_detailScale; float scaledZ = worldXZ.y * s_detailScale; float changeNoise = ((float)myNoise[TownChangeIndex].Noise(scaledX * TownChangeFrequency, scaledZ * TownChangeFrequency) + 1) / 2;//0~1 float changeFactor = 1 + changeNoise * TownChangeFactor; if (vat != null) { if (nearTownDistance < vat.MiddleRadius * changeFactor) { factorValue = 0; } else if (nearTownDistance < (vat.MiddleRadius + TownWaterDistance) * changeFactor) { factorValue = (nearTownDistance - vat.MiddleRadius * changeFactor) / (TownWaterDistance * changeFactor); } } if (factorValue > 0) { // float nearConnectionDistance = VATownGenerator.Instance.GetConnectionLineDistance(worldXZ); // if(nearConnectionDistance <TownConnectionWidth*changeFactor){ // factorValue=0; // } // else if(nearConnectionDistance<(TownConnectionWidth+TownConnectionWaterDistance)*changeFactor){ // float temp = (nearConnectionDistance-TownConnectionWidth*changeFactor)/(TownConnectionWaterDistance*changeFactor); // if(factorValue >temp) // factorValue = temp; // } float temp = GetTownConnectionFactor(worldXZ.x, worldXZ.y, TownConnectionWaterDistance, changeFactor); if (factorValue > temp) { factorValue = temp; } } finalFTerType = factorValue * (finalFTerType - TownFTerTypeBottom(terTypeInc)) + TownFTerTypeBottom(terTypeInc); } } else { int nearStartDistanceSqr = IntVector2.SqrMagnitude(worldXZ - noTownStartPos); if (nearStartDistanceSqr < (NoTownStartDistance * (TownChangeFactor + 1)) * (NoTownStartDistance * (TownChangeFactor + 1))) { float noTownStartFTerType; if (sceneClimate == ClimateType.CT_Wet) { noTownStartFTerType = terTypeInc[MountainStartIndex]; } else { noTownStartFTerType = terTypeInc[HillStartIndex]; } if (finalFTerType < noTownStartFTerType) { float nearStartDistance = Mathf.Sqrt(nearStartDistanceSqr); float scaledX = worldXZ.x * s_detailScale; float scaledZ = worldXZ.y * s_detailScale; float changeNoise = ((float)myNoise[TownChangeIndex].Noise(scaledX * TownChangeFrequency, scaledZ * TownChangeFrequency) + 1) / 2; //0~1 float changeFactor = 1 + changeNoise * TownChangeFactor; float factorValue = 1; if (nearStartDistance < NoTownStartDistance * changeFactor) { factorValue = nearStartDistance / (NoTownStartDistance * changeFactor); } finalFTerType = factorValue * (finalFTerType - noTownStartFTerType) + noTownStartFTerType; } } } return(finalFTerType); }