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