TShock/Terraria/Gore.cs
2011-05-28 20:49:41 -06:00

173 lines
5.8 KiB
C#

namespace Terraria
{
using Microsoft.Xna.Framework;
using System;
public class Gore
{
public bool active;
public int alpha;
public static int goreTime = 600;
public float light;
public Vector2 position;
public float rotation;
public float scale;
public bool sticky = true;
public int timeLeft = goreTime;
public int type;
public Vector2 velocity;
public Color GetAlpha(Color newColor)
{
int num;
int num2;
int num3;
if ((this.type == 0x10) || (this.type == 0x11))
{
num = newColor.R - (this.alpha / 2);
num2 = newColor.G - (this.alpha / 2);
num3 = newColor.B - (this.alpha / 2);
}
else
{
num = newColor.R - this.alpha;
num2 = newColor.G - this.alpha;
num3 = newColor.B - this.alpha;
}
int a = newColor.A - this.alpha;
if (a < 0)
{
a = 0;
}
if (a > 0xff)
{
a = 0xff;
}
return new Color(num, num2, num3, a);
}
public static int NewGore(Vector2 Position, Vector2 Velocity, int Type)
{
if (Main.rand == null)
{
Main.rand = new Random();
}
if (Main.netMode == 2)
{
return 0;
}
int index = 200;
for (int i = 0; i < 200; i++)
{
if (!Main.gore[i].active)
{
index = i;
break;
}
}
if (index != 200)
{
Main.gore[index].light = 0f;
Main.gore[index].position = Position;
Main.gore[index].velocity = Velocity;
Main.gore[index].velocity.Y -= Main.rand.Next(10, 0x1f) * 0.1f;
Main.gore[index].velocity.X += Main.rand.Next(-20, 0x15) * 0.1f;
Main.gore[index].type = Type;
Main.gore[index].active = true;
Main.gore[index].alpha = 0;
Main.gore[index].rotation = 0f;
Main.gore[index].scale = 1f;
if ((((goreTime == 0) || (Type == 11)) || ((Type == 12) || (Type == 13))) || (((Type == 0x10) || (Type == 0x11)) || (((Type == 0x3d) || (Type == 0x3e)) || (Type == 0x3f))))
{
Main.gore[index].sticky = false;
}
else
{
Main.gore[index].sticky = true;
Main.gore[index].timeLeft = goreTime;
}
if ((Type == 0x10) || (Type == 0x11))
{
Main.gore[index].alpha = 100;
Main.gore[index].scale = 0.7f;
Main.gore[index].light = 1f;
}
}
return index;
}
public void Update()
{
if (this.active)
{
if ((((this.type == 11) || (this.type == 12)) || ((this.type == 13) || (this.type == 0x3d))) || ((this.type == 0x3e) || (this.type == 0x3f)))
{
this.velocity.Y *= 0.98f;
this.velocity.X *= 0.98f;
this.scale -= 0.007f;
if (this.scale < 0.1)
{
this.scale = 0.1f;
this.alpha = 0xff;
}
}
else if ((this.type == 0x10) || (this.type == 0x11))
{
this.velocity.Y *= 0.98f;
this.velocity.X *= 0.98f;
this.scale -= 0.01f;
if (this.scale < 0.1)
{
this.scale = 0.1f;
this.alpha = 0xff;
}
}
else
{
this.velocity.Y += 0.2f;
}
this.rotation += this.velocity.X * 0.1f;
if (this.sticky)
{
int width = Main.goreTexture[this.type].Width;
if (Main.goreTexture[this.type].Height < width)
{
width = Main.goreTexture[this.type].Height;
}
width = (int) (width * 0.9f);
this.velocity = Collision.TileCollision(this.position, this.velocity, (int) (width * this.scale), (int) (width * this.scale), false, false);
if (this.velocity.Y == 0f)
{
this.velocity.X *= 0.97f;
if ((this.velocity.X > -0.01) && (this.velocity.X < 0.01))
{
this.velocity.X = 0f;
}
}
if (this.timeLeft > 0)
{
this.timeLeft--;
}
else
{
this.alpha++;
}
}
else
{
this.alpha += 2;
}
this.position += this.velocity;
if (this.alpha >= 0xff)
{
this.active = false;
}
if (this.light > 0f)
{
Lighting.addLight((int) ((this.position.X + ((Main.goreTexture[this.type].Width * this.scale) / 2f)) / 16f), (int) ((this.position.Y + ((Main.goreTexture[this.type].Height * this.scale) / 2f)) / 16f), this.light);
}
}
}
}
}