Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Cloud.cs
Go to the documentation of this file.
5
6namespace Terraria;
7
8public class Cloud
9{
11
12 public float scale;
13
14 public float rotation;
15
16 public float rSpeed;
17
18 public float sSpeed;
19
20 public bool active;
21
23
24 public int type;
25
26 public int width;
27
28 public int height;
29
30 public float Alpha;
31
32 public bool kill;
33
34 private static UnifiedRandom rand = new UnifiedRandom();
35
36 public static void resetClouds()
37 {
38 if (!Main.dedServ)
39 {
40 Main.windSpeedCurrent = Main.windSpeedTarget;
41 for (int i = 0; i < 200; i++)
42 {
43 Main.cloud[i].active = false;
44 }
45 for (int j = 0; j < Main.numClouds; j++)
46 {
47 addCloud();
48 Main.cloud[j].Alpha = 1f;
49 }
50 for (int k = 0; k < 200; k++)
51 {
52 Main.cloud[k].Alpha = 1f;
53 }
54 }
55 }
56
57 public static void addCloud()
58 {
59 if (Main.netMode == 2)
60 {
61 return;
62 }
63 int num = -1;
64 for (int i = 0; i < 200; i++)
65 {
66 if (!Main.cloud[i].active)
67 {
68 num = i;
69 break;
70 }
71 }
72 if (num < 0)
73 {
74 return;
75 }
76 Main.cloud[num].kill = false;
77 Main.cloud[num].rSpeed = 0f;
78 Main.cloud[num].sSpeed = 0f;
79 Main.cloud[num].scale = (float)rand.Next(70, 131) * 0.01f;
80 Main.cloud[num].rotation = (float)rand.Next(-10, 11) * 0.01f;
81 Main.cloud[num].width = (int)((float)TextureAssets.Cloud[Main.cloud[num].type].Width() * Main.cloud[num].scale);
82 Main.cloud[num].height = (int)((float)TextureAssets.Cloud[Main.cloud[num].type].Height() * Main.cloud[num].scale);
83 Main.cloud[num].Alpha = 0f;
84 Main.cloud[num].spriteDir = SpriteEffects.None;
85 if (rand.Next(2) == 0)
86 {
87 Main.cloud[num].spriteDir = SpriteEffects.FlipHorizontally;
88 }
89 float num2 = Main.windSpeedCurrent;
90 if (!Main.gameMenu)
91 {
92 num2 = Main.windSpeedCurrent - Main.player[Main.myPlayer].velocity.X * 0.1f;
93 }
94 int num3 = 0;
95 int num4 = 0;
96 if (num2 > 0f)
97 {
98 num3 -= 200;
99 }
100 if (num2 < 0f)
101 {
102 num4 += 200;
103 }
104 int num5 = 300;
105 float x = rand.Next(num3 - num5, Main.screenWidth + num4 + num5);
106 Main.cloud[num].Alpha = 0f;
107 Main.cloud[num].position.Y = rand.Next((int)((float)(-Main.screenHeight) * 0.25f), (int)((float)Main.screenHeight * 0.15f));
108 if (rand.Next(3) == 0)
109 {
110 Main.cloud[num].position.Y -= rand.Next((int)((float)Main.screenHeight * 0.1f));
111 }
112 Main.cloud[num].type = rand.Next(4);
113 if ((Main.cloudAlpha > 0f && rand.Next(4) != 0) || (Main.cloudBGActive >= 1f && rand.Next(2) == 0))
114 {
115 Main.cloud[num].type = rand.Next(18, 22);
116 if ((double)Main.cloud[num].scale >= 1.15)
117 {
118 Main.cloud[num].position.Y -= 150f;
119 }
120 if (Main.cloud[num].scale >= 1f)
121 {
122 Main.cloud[num].position.Y -= 150f;
123 }
124 }
125 else if (Main.cloudBGActive <= 0f && Main.cloudAlpha == 0f && Main.cloud[num].scale < 1f && Main.cloud[num].position.Y < (float)(-Main.screenHeight) * 0.15f && (double)Main.numClouds <= 80.0)
126 {
127 Main.cloud[num].type = rand.Next(9, 14);
128 }
129 else if ((((double)Main.cloud[num].scale < 1.15 && Main.cloud[num].position.Y < (float)(-Main.screenHeight) * 0.3f) || ((double)Main.cloud[num].scale < 0.85 && Main.cloud[num].position.Y < (float)Main.screenHeight * 0.15f)) && ((double)Main.numClouds > 70.0 || Main.cloudBGActive >= 1f))
130 {
131 Main.cloud[num].type = rand.Next(4, 9);
132 }
133 else if (Main.cloud[num].position.Y > (float)(-Main.screenHeight) * 0.15f && rand.Next(2) == 0 && (double)Main.numClouds > 20.0)
134 {
135 Main.cloud[num].type = rand.Next(14, 18);
136 }
137 if (rand.Next((Main.dontStarveWorld || Main.tenthAnniversaryWorld) ? 25 : 150) == 0)
138 {
139 Main.cloud[num].type = RollRareCloud();
140 }
141 else if (Main.tenthAnniversaryWorld && rand.Next(3) == 0)
142 {
143 Main.cloud[num].type = RollRareCloud();
144 }
145 if ((double)Main.cloud[num].scale > 1.2)
146 {
147 Main.cloud[num].position.Y += 100f;
148 }
149 if ((double)Main.cloud[num].scale > 1.3)
150 {
151 Main.cloud[num].scale = 1.3f;
152 }
153 if ((double)Main.cloud[num].scale < 0.7)
154 {
155 Main.cloud[num].scale = 0.7f;
156 }
157 Main.cloud[num].active = true;
158 Main.cloud[num].position.X = x;
159 if (Main.cloud[num].position.X > (float)(Main.screenWidth + 400))
160 {
161 Main.cloud[num].Alpha = 1f;
162 }
163 if (Main.cloud[num].position.X + (float)TextureAssets.Cloud[Main.cloud[num].type].Width() * Main.cloud[num].scale < -400f)
164 {
165 Main.cloud[num].Alpha = 1f;
166 }
167 Rectangle rectangle = new Rectangle((int)Main.cloud[num].position.X, (int)Main.cloud[num].position.Y, Main.cloud[num].width, Main.cloud[num].height);
168 for (int j = 0; j < 200; j++)
169 {
170 if (num != j && Main.cloud[j].active)
171 {
172 Rectangle value = new Rectangle((int)Main.cloud[j].position.X, (int)Main.cloud[j].position.Y, Main.cloud[j].width, Main.cloud[j].height);
173 if (rectangle.Intersects(value))
174 {
175 Main.cloud[num].active = false;
176 }
177 }
178 }
179 }
180
181 private static int RollRareCloud()
182 {
183 int num = -1;
184 bool flag = false;
185 while (!flag)
186 {
187 num = ((!Main.tenthAnniversaryWorld) ? rand.Next(22, 41) : rand.Next(22, 37));
188 switch (num)
189 {
190 default:
191 flag = true;
192 break;
193 case 31:
194 flag = NPC.downedBoss3;
195 break;
196 case 36:
197 flag = NPC.downedBoss2 && WorldGen.crimson;
198 break;
199 case 25:
200 case 26:
201 flag = NPC.downedBoss1;
202 break;
203 case 30:
204 case 35:
205 flag = Main.hardMode;
206 break;
207 case 28:
208 if (rand.Next(10) == 0)
209 {
210 flag = true;
211 }
212 break;
213 case 37:
214 case 38:
215 case 39:
216 case 40:
217 if (Main.dontStarveWorld || rand.Next(10) == 0)
218 {
219 flag = true;
220 }
221 break;
222 }
223 }
224 return num;
225 }
226
227 public Color cloudColor(Color bgColor)
228 {
229 float num = scale * Alpha;
230 if (num > 1f)
231 {
232 num = 1f;
233 }
234 float num2 = (int)((float)(int)bgColor.R * num);
235 float num3 = (int)((float)(int)bgColor.G * num);
236 float num4 = (int)((float)(int)bgColor.B * num);
237 float num5 = (int)((float)(int)bgColor.A * num);
238 return new Color((byte)num2, (byte)num3, (byte)num4, (byte)num5);
239 }
240
241 public object Clone()
242 {
243 return MemberwiseClone();
244 }
245
246 public static void UpdateClouds()
247 {
248 if (Main.netMode == 2)
249 {
250 return;
251 }
252 int num = 0;
253 for (int i = 0; i < 200; i++)
254 {
255 if (Main.cloud[i].active)
256 {
257 Main.cloud[i].Update();
258 if (!Main.cloud[i].kill)
259 {
260 num++;
261 }
262 }
263 }
264 for (int j = 0; j < 200; j++)
265 {
266 if (Main.cloud[j].active)
267 {
268 if (j > 1 && (!Main.cloud[j - 1].active || (double)Main.cloud[j - 1].scale > (double)Main.cloud[j].scale + 0.02))
269 {
270 Cloud cloud = (Cloud)Main.cloud[j - 1].Clone();
271 Main.cloud[j - 1] = (Cloud)Main.cloud[j].Clone();
272 Main.cloud[j] = cloud;
273 }
274 if (j < 199 && (!Main.cloud[j].active || (double)Main.cloud[j + 1].scale < (double)Main.cloud[j].scale - 0.02))
275 {
276 Cloud cloud2 = (Cloud)Main.cloud[j + 1].Clone();
277 Main.cloud[j + 1] = (Cloud)Main.cloud[j].Clone();
278 Main.cloud[j] = cloud2;
279 }
280 }
281 }
282 if (num < Main.numClouds)
283 {
284 addCloud();
285 }
286 else if (num > Main.numClouds)
287 {
288 int num2 = rand.Next(num);
289 int num3 = 0;
290 while (Main.cloud[num2].kill && num3 < 100)
291 {
292 num3++;
293 num2 = rand.Next(num);
294 }
295 Main.cloud[num2].kill = true;
296 }
297 }
298
299 public void Update()
300 {
302 {
303 type = 28;
304 }
305 if (scale == 1f)
306 {
307 scale -= 0.0001f;
308 }
309 if ((double)scale == 1.15)
310 {
311 scale -= 0.0001f;
312 }
313 float num = 0.13f;
314 if (scale < 1f)
315 {
316 num = 0.07f;
317 float num2 = scale + 0.15f;
318 num2 = (num2 + 1f) / 2f;
319 num2 *= num2;
320 num *= num2;
321 }
322 else if ((double)scale <= 1.15)
323 {
324 num = 0.19f;
325 float num3 = scale - 0.075f;
326 num3 *= num3;
327 num *= num3;
328 }
329 else
330 {
331 num = 0.23f;
332 float num4 = scale - 0.15f - 0.075f;
333 num4 *= num4;
334 num *= num4;
335 }
336 position.X += Main.windSpeedCurrent * 9f * num * (float)Main.dayRate;
337 float num5 = Main.screenPosition.X - Main.screenLastPosition.X;
338 position.X -= num5 * num;
339 float num6 = 600f;
340 if (Main.bgAlphaFrontLayer[4] == 1f && position.Y > 200f)
341 {
342 kill = true;
343 Alpha -= 0.005f * (float)Main.dayRate;
344 }
345 if (!kill)
346 {
347 if (Alpha < 1f)
348 {
349 Alpha += 0.001f * (float)Main.dayRate;
350 if (Alpha > 1f)
351 {
352 Alpha = 1f;
353 }
354 }
355 }
356 else
357 {
358 Alpha -= 0.001f * (float)Main.dayRate;
359 if (Alpha <= 0f)
360 {
361 active = false;
362 }
363 }
364 if (position.X + (float)TextureAssets.Cloud[type].Width() * scale < 0f - num6 || position.X > (float)Main.screenWidth + num6)
365 {
366 active = false;
367 }
368 rSpeed += (float)rand.Next(-10, 11) * 2E-05f;
369 if ((double)rSpeed > 0.0002)
370 {
371 rSpeed = 0.0002f;
372 }
373 if ((double)rSpeed < -0.0002)
374 {
375 rSpeed = -0.0002f;
376 }
377 if ((double)rotation > 0.02)
378 {
379 rotation = 0.02f;
380 }
381 if ((double)rotation < -0.02)
382 {
383 rotation = -0.02f;
384 }
385 rotation += rSpeed;
386 width = (int)((float)TextureAssets.Cloud[type].Width() * scale);
387 height = (int)((float)TextureAssets.Cloud[type].Height() * scale);
388 if (type >= 9 && type <= 13 && (Main.cloudAlpha > 0f || Main.cloudBGActive >= 1f))
389 {
390 kill = true;
391 }
392 }
393}
bool active
Definition Cloud.cs:20
SpriteEffects spriteDir
Definition Cloud.cs:22
static void resetClouds()
Definition Cloud.cs:36
float scale
Definition Cloud.cs:12
object Clone()
Definition Cloud.cs:241
static void addCloud()
Definition Cloud.cs:57
float rotation
Definition Cloud.cs:14
void Update()
Definition Cloud.cs:299
static UnifiedRandom rand
Definition Cloud.cs:34
float Alpha
Definition Cloud.cs:30
Vector2 position
Definition Cloud.cs:10
static void UpdateClouds()
Definition Cloud.cs:246
float sSpeed
Definition Cloud.cs:18
float rSpeed
Definition Cloud.cs:16
Color cloudColor(Color bgColor)
Definition Cloud.cs:227
bool kill
Definition Cloud.cs:32
static int RollRareCloud()
Definition Cloud.cs:181
static Asset< Texture2D >[] Cloud
static Cloud[] cloud
Definition Main.cs:1374
static float windSpeedCurrent
Definition Main.cs:1360
static float cloudAlpha
Definition Main.cs:1302
static float windSpeedTarget
Definition Main.cs:1362
static int numClouds
Definition Main.cs:1356
static int myPlayer
Definition Main.cs:1801
static int netMode
Definition Main.cs:2095
static bool dedServ
Definition Main.cs:1226
static Vector2 screenLastPosition
Definition Main.cs:1717
static int screenHeight
Definition Main.cs:1721
static float[] bgAlphaFrontLayer
Definition Main.cs:812
static bool dontStarveWorld
Definition Main.cs:345
static bool tenthAnniversaryWorld
Definition Main.cs:343
static int dayRate
Definition Main.cs:746
static int screenWidth
Definition Main.cs:1719
static float cloudBGActive
Definition Main.cs:628
static bool gameMenu
Definition Main.cs:1926
static bool hardMode
Definition Main.cs:1022
static Player[] player
Definition Main.cs:1803
static bool downedBoss1
Definition NPC.cs:345
static bool downedBoss3
Definition NPC.cs:349
static bool crimson
Definition WorldGen.cs:932
static bool drunkWorldGenText
Definition WorldGen.cs:1166
bool Intersects(Rectangle value)
Definition Rectangle.cs:129