Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Sandstorm.cs
Go to the documentation of this file.
1using System;
5
7
8public class Sandstorm
9{
10 private const int SANDSTORM_DURATION_MINIMUM = 28800;
11
12 private const int SANDSTORM_DURATION_MAXIMUM = 86400;
13
14 public static bool Happening;
15
16 public static int TimeLeft;
17
18 public static float Severity;
19
20 public static float IntendedSeverity;
21
22 private static bool _effectsUp;
23
24 private static bool HasSufficientWind()
25 {
26 return Math.Abs(Main.windSpeedCurrent) >= 0.6f;
27 }
28
29 public static void WorldClear()
30 {
31 Happening = false;
32 }
33
34 public static void UpdateTime()
35 {
36 if (Main.netMode != 1)
37 {
38 if (Happening)
39 {
40 if (TimeLeft > 86400)
41 {
42 TimeLeft = 0;
43 }
45 if (!HasSufficientWind())
46 {
47 TimeLeft -= 15 * Main.dayRate;
48 }
49 if (Main.windSpeedCurrent == 0f)
50 {
51 TimeLeft = 0;
52 }
53 if (TimeLeft <= 0)
54 {
56 }
57 }
58 else
59 {
60 int num = 21600;
61 num = ((!Main.hardMode) ? (num * 3) : (num * 2));
63 {
64 for (int i = 0; i < Main.dayRate; i++)
65 {
66 if (Main.rand.Next(num) == 0)
67 {
69 }
70 }
71 }
72 }
73 if (Main.rand.Next(18000) == 0)
74 {
76 }
77 }
79 }
80
81 private static void ChangeSeverityIntentions()
82 {
83 if (Happening)
84 {
85 IntendedSeverity = 0.4f + Main.rand.NextFloat();
86 }
87 else if (Main.rand.Next(3) == 0)
88 {
90 }
91 else
92 {
93 IntendedSeverity = Main.rand.NextFloat() * 0.3f;
94 }
95 if (Main.netMode != 1)
96 {
98 }
99 }
100
101 private static void UpdateSeverity()
102 {
103 if (float.IsNaN(Severity))
104 {
105 Severity = 0f;
106 }
107 if (float.IsNaN(IntendedSeverity))
108 {
109 IntendedSeverity = 0f;
110 }
111 int num = Math.Sign(IntendedSeverity - Severity);
112 Severity = MathHelper.Clamp(Severity + 0.003f * (float)num, 0f, 1f);
113 int num2 = Math.Sign(IntendedSeverity - Severity);
114 if (num != num2)
115 {
117 }
118 }
119
120 private static void StartSandstorm()
121 {
122 Happening = true;
123 TimeLeft = Main.rand.Next(28800, 86401);
125 }
126
127 private static void StopSandstorm()
128 {
129 Happening = false;
130 TimeLeft = 0;
132 }
133
134 public static void HandleEffectAndSky(bool toState)
135 {
136 if (toState != _effectsUp)
137 {
138 _effectsUp = toState;
139 Vector2 center = Main.player[Main.myPlayer].Center;
140 if (_effectsUp)
141 {
142 SkyManager.Instance.Activate("Sandstorm", center);
143 Filters.Scene.Activate("Sandstorm", center);
144 Overlays.Scene.Activate("Sandstorm", center);
145 }
146 else
147 {
148 SkyManager.Instance.Deactivate("Sandstorm");
149 Filters.Scene.Deactivate("Sandstorm");
150 Overlays.Scene.Deactivate("Sandstorm");
151 }
152 }
153 }
154
155 public static bool ShouldSandstormDustPersist()
156 {
157 if (Happening && Main.player[Main.myPlayer].ZoneSandstorm && (Main.bgStyle == 2 || Main.bgStyle == 5))
158 {
159 return Main.bgDelay < 50;
160 }
161 return false;
162 }
163
164 public static void EmitDust()
165 {
166 if (Main.gamePaused)
167 {
168 return;
169 }
170 int sandTileCount = Main.SceneMetrics.SandTileCount;
171 Player player = Main.player[Main.myPlayer];
172 bool flag = ShouldSandstormDustPersist();
174 if (sandTileCount < 100 || (double)player.position.Y > Main.worldSurface * 16.0 || player.ZoneBeach)
175 {
176 return;
177 }
178 int maxValue = 1;
179 if (!flag || Main.rand.Next(maxValue) != 0)
180 {
181 return;
182 }
183 int num = Math.Sign(Main.windSpeedCurrent);
184 float num2 = Math.Abs(Main.windSpeedCurrent);
185 if (num2 < 0.01f)
186 {
187 return;
188 }
189 float num3 = (float)num * MathHelper.Lerp(0.9f, 1f, num2);
190 float num4 = 2000f / (float)sandTileCount;
191 float value = 3f / num4;
192 value = MathHelper.Clamp(value, 0.77f, 1f);
193 int num5 = (int)num4;
194 float num6 = (float)Main.screenWidth / (float)Main.maxScreenW;
195 int num7 = (int)(1000f * num6);
196 float num8 = 20f * Severity;
197 float num9 = (float)num7 * (Main.gfxQuality * 0.5f + 0.5f) + (float)num7 * 0.1f - (float)Dust.SandStormCount;
198 if (num9 <= 0f)
199 {
200 return;
201 }
202 float num10 = (float)Main.screenWidth + 1000f;
203 float num11 = Main.screenHeight;
204 Vector2 vector = Main.screenPosition + player.velocity;
205 WeightedRandom<Color> weightedRandom = new WeightedRandom<Color>();
206 weightedRandom.Add(new Color(200, 160, 20, 180), Main.SceneMetrics.GetTileCount(53) + Main.SceneMetrics.GetTileCount(396) + Main.SceneMetrics.GetTileCount(397));
207 weightedRandom.Add(new Color(103, 98, 122, 180), Main.SceneMetrics.GetTileCount(112) + Main.SceneMetrics.GetTileCount(400) + Main.SceneMetrics.GetTileCount(398));
208 weightedRandom.Add(new Color(135, 43, 34, 180), Main.SceneMetrics.GetTileCount(234) + Main.SceneMetrics.GetTileCount(401) + Main.SceneMetrics.GetTileCount(399));
209 weightedRandom.Add(new Color(213, 196, 197, 180), Main.SceneMetrics.GetTileCount(116) + Main.SceneMetrics.GetTileCount(403) + Main.SceneMetrics.GetTileCount(402));
210 float num12 = MathHelper.Lerp(0.2f, 0.35f, Severity);
211 float num13 = MathHelper.Lerp(0.5f, 0.7f, Severity);
212 float amount = (value - 0.77f) / 0.23000002f;
213 int maxValue2 = (int)MathHelper.Lerp(1f, 10f, amount);
214 for (int i = 0; (float)i < num8; i++)
215 {
216 if (Main.rand.Next(num5 / 4) != 0)
217 {
218 continue;
219 }
220 Vector2 position = new Vector2(Main.rand.NextFloat() * num10 - 500f, Main.rand.NextFloat() * -50f);
221 if (Main.rand.Next(3) == 0 && num == 1)
222 {
223 position.X = Main.rand.Next(500) - 500;
224 }
225 else if (Main.rand.Next(3) == 0 && num == -1)
226 {
227 position.X = Main.rand.Next(500) + Main.screenWidth;
228 }
229 if (position.X < 0f || position.X > (float)Main.screenWidth)
230 {
231 position.Y += Main.rand.NextFloat() * num11 * 0.9f;
232 }
233 position += vector;
234 int num14 = (int)position.X / 16;
235 int num15 = (int)position.Y / 16;
236 if (!WorldGen.InWorld(num14, num15, 10) || Main.tile[num14, num15] == null || Main.tile[num14, num15].wall != 0)
237 {
238 continue;
239 }
240 for (int j = 0; j < 1; j++)
241 {
242 Dust dust = Main.dust[Dust.NewDust(position, 10, 10, 268)];
243 dust.velocity.Y = 2f + Main.rand.NextFloat() * 0.2f;
244 dust.velocity.Y *= dust.scale;
245 dust.velocity.Y *= 0.35f;
246 dust.velocity.X = num3 * 5f + Main.rand.NextFloat() * 1f;
247 dust.velocity.X += num3 * num13 * 20f;
248 dust.fadeIn += num13 * 0.2f;
249 dust.velocity *= 1f + num12 * 0.5f;
250 dust.color = weightedRandom;
251 dust.velocity *= 1f + num12;
252 dust.velocity *= value;
253 dust.scale = 0.9f;
254 num9 -= 1f;
255 if (num9 <= 0f)
256 {
257 break;
258 }
259 if (Main.rand.Next(maxValue2) != 0)
260 {
261 j--;
262 position += Utils.RandomVector2(Main.rand, -10f, 10f) + dust.velocity * -1.1f;
263 num14 = (int)position.X / 16;
264 num15 = (int)position.Y / 16;
265 if (WorldGen.InWorld(num14, num15, 10) && Main.tile[num14, num15] != null)
266 {
267 _ = Main.tile[num14, num15].wall;
268 }
269 }
270 }
271 if (num9 <= 0f)
272 {
273 break;
274 }
275 }
276 }
277}
static float Lerp(float value1, float value2, float amount)
Definition MathHelper.cs:53
static float Clamp(float value, float min, float max)
Definition MathHelper.cs:46
static double Abs(double value)
static int Sign(decimal value)
Definition Math.cs:1202
static int SandStormCount
Definition Dust.cs:16
static int NewDust(Vector2 Position, int Width, int Height, int Type, float SpeedX=0f, float SpeedY=0f, int Alpha=0, Color newColor=default(Color), float Scale=1f)
Definition Dust.cs:73
float scale
Definition Dust.cs:28
Vector2 velocity
Definition Entity.cs:16
Vector2 position
Definition Entity.cs:14
static void HandleEffectAndSky(bool toState)
Definition Sandstorm.cs:134
static FilterManager Scene
Definition Filters.cs:5
static OverlayManager Scene
Definition Overlays.cs:5
static SceneMetrics SceneMetrics
Definition Main.cs:1344
static float windSpeedCurrent
Definition Main.cs:1360
static double worldSurface
Definition Main.cs:1272
static int myPlayer
Definition Main.cs:1801
static int netMode
Definition Main.cs:2095
static float gfxQuality
Definition Main.cs:1056
static bool UseStormEffects
Definition Main.cs:427
static int screenHeight
Definition Main.cs:1721
static int maxScreenW
Definition Main.cs:750
static Tile[,] tile
Definition Main.cs:1675
static UnifiedRandom rand
Definition Main.cs:1387
static int dayRate
Definition Main.cs:746
static int screenWidth
Definition Main.cs:1719
static bool hardMode
Definition Main.cs:1022
static bool gamePaused
Definition Main.cs:1072
static Player[] player
Definition Main.cs:1803
static int bgStyle
Definition Main.cs:808
static Dust[] dust
Definition Main.cs:1677
static void SendData(int msgType, int remoteClient=-1, int ignoreClient=-1, NetworkText text=null, int number=0, float number2=0f, float number3=0f, float number4=0f, int number5=0, int number6=0, int number7=0)
Definition NetMessage.cs:88
void Add(T element, double weight=1.0)
static Vector2 RandomVector2(UnifiedRandom random, float min, float max)
Definition Utils.cs:1823
static bool InWorld(int x, int y, int fluff=0)
Definition WorldGen.cs:5816