public class AnimateEffect : Effect2
{
	private const sbyte RAIN = 0;

	private const sbyte FALLING_LEAVES = 1;

	private const sbyte SNOW = 3;

	private static FrameImage img;

	private static FrameImage imgSnow;

	private static Image imgTuyet;

	private static Image imgCoBay;

	private sbyte type;

	private int number;

	private MyVector list = new MyVector();

	private bool isStop;

	public AnimateEffect(sbyte type, bool isStart, int number, int timeLimit)
	{
		this.type = type;
		this.number = number;
		switch (type)
		{
		case 1:
			number = 10;
			if (img == null)
			{
				img = new FrameImage(imgCoBay, 16, 10);
			}
			break;
		case 3:
			if (imgSnow == null)
			{
				imgSnow = new FrameImage(imgTuyet, 5, 5);
			}
			break;
		}
		isStart = false;
		for (int i = 0; i < number; i++)
		{
			Position position = null;
			position = new Position((Camera.x - 20 + CRes.random((CCanvas.w + 40) / 5) * 5) * 10, (Camera.y - 20 + CRes.random(CCanvas.h / 5) * 5) * 10);
			if (type == 3)
			{
				if (this == GameScr.aniFront)
				{
					position.h = 0;
				}
				else
				{
					position.h = CRes.random(2) + 1;
				}
			}
			else
			{
				position.h = CRes.random(4);
			}
			position.limitY = 16 + CRes.random(3) * 4;
			position.v = CRes.random(-1, 1);
			position.color = CRes.random(position.limitY);
			list.addElement(position);
		}
	}

	public static void loadImage()
	{
		imgTuyet = CCanvas.loadImage("/tuyet.png");
		imgCoBay = CCanvas.loadImage("/cobay.png");
	}

	public void stop()
	{
		isStop = true;
	}

	public override void paint(mGraphics g)
	{
		g.translate(-g.getTranslateX(), -g.getTranslateY());
		g.setClip(0, -200, CCanvas.w, 200 + CCanvas.h);
		switch (type)
		{
		case 1:
			paintFallingLeaves(g);
			break;
		case 3:
		{
			for (int i = 0; i < number; i++)
			{
				Position position = (Position)list.elementAt(i);
				if (position.h > 0)
				{
					int num = Camera.x * ((2 - position.h) * 20) / 120 - Camera.x;
					imgSnow.drawFrame(position.h, num + position.x / 10, position.y / 10 - Camera.y, 2, 0, g, false);
				}
			}
			break;
		}
		case 2:
			break;
		}
	}

	public override void update()
	{
		switch (type)
		{
		case 1:
			updateFallingLeaves();
			break;
		case 3:
			updateSnow();
			break;
		case 2:
			break;
		}
	}

	private void paintFallingLeaves(mGraphics g)
	{
		for (int i = 0; i < number; i++)
		{
			Position position = (Position)list.elementAt(i);
			img.drawFrame(position.color / (position.limitY / 4), position.x / 10 - Camera.x, position.y / 10 - Camera.y, 0, 3, g, false);
		}
	}

	private void setLeaveFall(int x0, int y0)
	{
		Position po = new Position(x0, y0);
		po.limitY = 200;
		po.g = CRes.random(4);
		po.layer = new Layer();
		po.layer.iPaint = delegate(mGraphics g, int num, int num2)
		{
			img.drawFrame(po.g, x0, y0, 0, 3, g, false);
		};
		po.layer.iUpdate = delegate
		{
			po.limitY--;
			if (po.limitY > 0)
			{
			}
		};
	}

	private void rndPos(Position pos)
	{
		if (isStop)
		{
			list.removeElement(pos);
			number = list.size();
			return;
		}
		pos.x = (Camera.x - 20 + CRes.random((CCanvas.w + 40) / 5) * 5) * 10;
		pos.y = (Camera.y - CCanvas.hh + CRes.random(CCanvas.h / 5) * 5) * 10;
		if (type == 3)
		{
			pos.h = CRes.random(3);
		}
		else
		{
			pos.h = CRes.random(4);
		}
	}

	private void setLimitX(Position pos)
	{
		int num = Camera.x * ((2 - pos.h) * 20) / 120;
		if (pos.x / 10 + num < Camera.x - 10)
		{
			pos.x += (CCanvas.w + 20) * 10;
		}
		if (pos.x / 10 + num > Camera.x + CCanvas.w + 10)
		{
			pos.x -= (CCanvas.w + 20) * 10;
		}
	}

	private void updateFallingLeaves()
	{
		bool flag = GameScr.windAngle > 90 && GameScr.windAngle < 270;
		int num = GameScr.windPower >> 3;
		for (int i = 0; i < number; i++)
		{
			Position position = (Position)list.elementAt(i);
			position.y += 10 + num;
			position.x += position.v * 10 + ((!flag) ? 15 : (-15));
			position.color++;
			if (position.color >= position.limitY)
			{
				position.color = 0;
			}
			if (position.y / 10 > Camera.y + CCanvas.h - (3 - position.h) * 40 || position.y / 10 < Camera.y - 200 || position.x / 10 < Camera.x - CCanvas.hw || position.x / 10 > Camera.x + CCanvas.w + CCanvas.hw)
			{
				if (position.y / 10 > 24)
				{
					setLeaveFall(position.x / 10 + Camera.x, position.y / 10 + Camera.y);
				}
				rndPos(position);
			}
		}
	}

	private void updateSnow()
	{
		bool flag = GameScr.windAngle > 90 && GameScr.windAngle < 270;
		int num = GameScr.windPower >> 3;
		if (this == GameScr.aniBack)
		{
			num = 0;
		}
		for (int i = 0; i < number; i++)
		{
			Position position = (Position)list.elementAt(i);
			position.y += (position.h + 1) * 5 + num;
			position.x += (position.h + 1) * 2 + ((!flag) ? 15 : (-15));
			if (position.y / 10 > Camera.y + CCanvas.h - (3 - position.h) * 30)
			{
				rndPos(position);
			}
			if (position.y / 10 < Camera.y - 200)
			{
				rndPos(position);
			}
			setLimitX(position);
		}
	}
}
