Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ PlaceOasis()

static bool Terraria.WorldGen.PlaceOasis ( int X,
int Y )
inlinestatic

Definition at line 6880 of file WorldGen.cs.

6881 {
6882 //IL_00a4: Unknown result type (might be due to invalid IL or missing references)
6883 //IL_00ad: Unknown result type (might be due to invalid IL or missing references)
6884 int i = Y;
6885 if (!Main.tile[X, i].active() && Main.tile[X, i].wall == 0)
6886 {
6887 for (; !Main.tile[X, i].active() && Main.tile[X, i].wall == 0 && (double)i <= Main.worldSurface; i++)
6888 {
6889 }
6890 if ((double)i > Main.worldSurface - 10.0)
6891 {
6892 return false;
6893 }
6894 if (Main.tile[X, i].type != 53)
6895 {
6896 return false;
6897 }
6898 int num = 350;
6899 for (int j = 0; j < GenVars.numOasis; j++)
6900 {
6901 if (Vector2D.Distance(GenVars.oasisPosition[j].ToVector2D(), new Vector2D((double)X, (double)i)) < (double)num)
6902 {
6903 return false;
6904 }
6905 }
6906 int num2 = genRand.Next(45, 61);
6907 int oasisHeight = GenVars.oasisHeight;
6908 int num3 = num2 + 50;
6909 int num4 = 4;
6910 for (int k = X - num3; k <= X + num3; k++)
6911 {
6912 for (int l = i - oasisHeight; l <= i + oasisHeight + num4; l++)
6913 {
6914 Tile tile = Main.tile[k, l];
6915 if (tile.active())
6916 {
6917 if (Main.tileSolid[tile.type])
6918 {
6919 if ((tile.type == 151 || tile.type == 397) && Math.Abs(k - X) < num2 && Math.Abs(l - i) < oasisHeight / 2)
6920 {
6921 return false;
6922 }
6923 if (tile.type != 53)
6924 {
6925 return false;
6926 }
6927 }
6928 }
6929 else if ((tile.liquid > 0 || tile.wall > 0) && Math.Abs(k - X) < num2 && Math.Abs(l - i) < oasisHeight / 2)
6930 {
6931 return false;
6932 }
6933 }
6934 if (k > X - num2 / 2 && k < X - num2 / 2)
6935 {
6936 if (Main.tile[k, i - 6].active())
6937 {
6938 return false;
6939 }
6940 if (!Main.tile[k, i + 1].active())
6941 {
6942 return false;
6943 }
6944 }
6945 }
6946 int num5 = 5;
6947 int num6 = i;
6948 while (!Main.tile[X - num2, i + num5].active() || Main.tile[X - num2, i + num5].wall != 0 || !Main.tile[X + num2, i + num5].active() || Main.tile[X + num2, i + num5].wall != 0)
6949 {
6950 i++;
6951 if (i - num6 > 20)
6952 {
6953 break;
6954 }
6955 }
6956 int num7 = num2 / 2;
6957 int num8 = X - num2 * 3;
6958 int num9 = X + num2 * 3;
6959 int num10 = i - oasisHeight * 4;
6960 int num11 = i + oasisHeight * 3;
6961 if (num8 < 0)
6962 {
6963 num8 = 0;
6964 }
6965 if (num9 > Main.maxTilesX)
6966 {
6967 num9 = Main.maxTilesX;
6968 }
6969 if (num10 < 0)
6970 {
6971 num10 = 0;
6972 }
6973 if (num11 > Main.maxTilesY)
6974 {
6975 num11 = Main.maxTilesY;
6976 }
6977 for (int m = num8; m < num9; m++)
6978 {
6979 for (int n = num10; n < num11; n++)
6980 {
6981 double num12 = (double)Math.Abs(m - X) * 0.7;
6982 double num13 = (double)Math.Abs(n - i) * 1.35;
6983 double num14 = Math.Sqrt(num12 * num12 + num13 * num13);
6984 double num15 = (double)num7 * (0.53 + genRand.NextDouble() * 0.04);
6985 double num16 = (double)Math.Abs(m - X) / (double)(num9 - X);
6986 num16 = 1.0 - num16;
6987 num16 *= 2.3;
6988 num16 *= num16;
6989 num16 *= num16;
6990 if (num14 < num15)
6991 {
6992 if (n == i + 1)
6993 {
6994 Main.tile[m, n].liquid = 127;
6995 }
6996 else if (n > i + 1)
6997 {
6998 Main.tile[m, n].liquid = byte.MaxValue;
6999 }
7000 Main.tile[m, n].lava(lava: false);
7001 Main.tile[m, n].active(active: false);
7002 }
7003 else if (n < i && num12 < num15 + (double)(Math.Abs(n - i) * 3) * num16)
7004 {
7005 if (Main.tile[m, n].type == 53)
7006 {
7007 Main.tile[m, n].active(active: false);
7008 }
7009 }
7010 else if (n >= i && num12 < num15 + (double)Math.Abs(n - i) * num16 && Main.tile[m, n].wall == 0)
7011 {
7012 if (Main.tile[m, n].active() && Main.tileSolid[Main.tile[m, n].type] && !Main.tileSolidTop[Main.tile[m, n].type])
7013 {
7014 Main.tile[m, n].slope(0);
7015 Main.tile[m, n].halfBrick(halfBrick: false);
7016 continue;
7017 }
7018 Main.tile[m, n].active(active: true);
7019 Main.tile[m, n].type = 53;
7020 Main.tile[m, n].slope(0);
7021 Main.tile[m, n].halfBrick(halfBrick: false);
7022 }
7023 }
7024 }
7025 int num17 = 50;
7026 num8 = X - num2 * 2;
7027 num9 = X + num2 * 2;
7028 num11 = i + oasisHeight * 2;
7029 for (int num18 = num8; num18 < num9; num18++)
7030 {
7031 for (int num19 = num11; num19 >= i; num19--)
7032 {
7033 double num20 = (double)Math.Abs(num18 - X) * 0.7;
7034 double num21 = (double)Math.Abs(num19 - i) * 1.35;
7035 double num22 = Math.Sqrt(num20 * num20 + num21 * num21);
7036 double num23 = (double)num7 * 0.5700000000000001;
7037 if (num22 > num23)
7038 {
7039 bool flag = false;
7040 if (!Main.tile[num18, num19].active() && Main.tile[num18, num19].wall == 0)
7041 {
7042 int num24 = -1;
7043 int num25 = -1;
7044 for (int num26 = num18; num26 <= num18 + num17 && Main.tile[num26, num19 + 1].active() && Main.tileSolid[Main.tile[num26, num19 + 1].type] && Main.tile[num26, num19].wall <= 0; num26++)
7045 {
7046 if (Main.tile[num26, num19].active() && Main.tileSolid[Main.tile[num26, num19].type])
7047 {
7048 if (Main.tile[num26, num19].type == 53)
7049 {
7050 flag = true;
7051 }
7052 num25 = num26;
7053 break;
7054 }
7055 if (Main.tile[num26, num19].active())
7056 {
7057 break;
7058 }
7059 }
7060 int num27 = num18;
7061 while (num27 >= num18 - num17 && Main.tile[num27, num19 + 1].active() && Main.tileSolid[Main.tile[num27, num19 + 1].type] && Main.tile[num27, num19].wall <= 0)
7062 {
7063 if (Main.tile[num27, num19].active() && Main.tileSolid[Main.tile[num27, num19].type])
7064 {
7065 if (Main.tile[num27, num19].type == 53)
7066 {
7067 flag = true;
7068 }
7069 num24 = num27;
7070 break;
7071 }
7072 if (Main.tile[num27, num19].active())
7073 {
7074 break;
7075 }
7076 num27--;
7077 }
7078 flag = true;
7079 if (num24 > -1 && num25 > -1 && flag)
7080 {
7081 int num28 = 0;
7082 for (int num29 = num24 + 1; num29 < num25; num29++)
7083 {
7084 if (num25 - num24 > 5 && genRand.Next(5) == 0)
7085 {
7086 num28 = genRand.Next(5, 10);
7087 }
7088 Main.tile[num29, num19].active(active: true);
7089 Main.tile[num29, num19].type = 53;
7090 if (num28 > 0)
7091 {
7092 num28--;
7093 Main.tile[num29, num19 - 1].active(active: true);
7094 Main.tile[num29, num19 - 1].type = 53;
7095 }
7096 }
7097 }
7098 }
7099 }
7100 }
7101 }
7103 {
7106 GenVars.numOasis++;
7107 }
7108 return true;
7109 }
7110 return false;
7111 }
static double Sqrt(double d)
static double Abs(double value)
static readonly int oasisHeight
Definition GenVars.cs:298
static Point[] oasisPosition
Definition GenVars.cs:294
static readonly int maxOasis
Definition GenVars.cs:290
static UnifiedRandom genRand
Definition WorldGen.cs:1215
static double Distance(Vector2D value1, Vector2D value2)
Definition Vector2D.cs:137

References System.Math.Abs(), Terraria.Tile.active(), ReLogic.Utilities.Vector2D.Distance(), Terraria.WorldGen.genRand, Terraria.Tile.liquid, Terraria.WorldBuilding.GenVars.maxOasis, Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.WorldBuilding.GenVars.numOasis, Terraria.WorldBuilding.GenVars.oasisHeight, Terraria.WorldBuilding.GenVars.oasisPosition, Terraria.WorldBuilding.GenVars.oasisWidth, System.Math.Sqrt(), Terraria.Main.tile, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.Tile.type, Terraria.Tile.wall, Terraria.Main.worldSurface, System.X, and System.Y.