/**
 * Copyright 2008 - 2011
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 * @project loonframework
 * @author chenpeng
 * @email：ceponline@yahoo.com.cn
 * @version 0.1
 */
package loon.srpg.effect;

import loon.canvas.LColor;
import loon.srpg.actor.SRPGActor;

public final class SRPGEffectFactory {

	// 斩击
	public final static int EFFECT_CHOP = 0;

	// 弓箭
	public final static int EFFECT_ARROW = 1;

	// 万箭
	public final static int EFFECT_ARROWS = 2;

	// 爆裂
	public final static int EFFECT_BURST = 3;

	// 退出效果
	public final static int EFFECT_OUT = 4;

	// 黑暗魔法
	public final static int EFFECT_DARK = 5;

	// 时间魔法
	public final static int EFFECT_CLOCK = 6;

	// 治疗
	public final static int EFFECT_CURE = 7;

	// 吸血1
	public final static int EFFECT_BLOOD_1 = 8;

	// 吸血2
	public final static int EFFECT_BLOOD_2 = 9;

	// 退去
	public final static int EFFECT_FADE = 10;

	// 抢夺1
	public final static int EFFECT_LOOT_1 = 11;

	// 抢夺2
	public final static int EFFECT_LOOT_2 = 12;

	// 内聚
	public final static int EFFECT_C = 13;

	// 反转内聚
	public final static int EFFECT_RC = 14;

	// 雪弹
	public final static int EFFECT_SNOW = 15;

	// 冰(水)弹
	public final static int EFFECT_ICE = 16;

	// 爆炸
	public final static int EFFECT_BLAST = 17;

	// 落雷
	public final static int EFFECT_T = 18;

	// 魔法弹
	public final static int EFFECT_S = 19;

	// 风
	public final static int EFFECT_WIND = 20;

	// 火
	public final static int EFFECT_FIRE = 21;

	// 太极
	public final static int EFFECT_TAICHI = 22;

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param x
	 * @param y
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, int x, int y) {
		return getAbilityEffect(i, null, x, y, null);
	}

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param actor
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, SRPGActor actor) {
		return getAbilityEffect(i, actor, actor.getPosX(), actor.getPosY(),
				null);
	}

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param x
	 * @param y
	 * @param c
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, int x, int y, LColor c) {
		return getAbilityEffect(i, null, x, y, c);
	}

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param actor
	 * @param c
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, SRPGActor actor,
			LColor c) {
		return getAbilityEffect(i, actor, actor.getPosX(), actor.getPosY(), c);
	}

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param actor
	 * @param x
	 * @param y
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, SRPGActor actor,
			int x, int y) {
		return getAbilityEffect(i, actor, x, y, null);
	}

	/**
	 * 使用指定索引的默认魔法特效
	 * 
	 * @param i
	 * @param actor
	 * @param x
	 * @param y
	 * @return
	 */
	public final static SRPGEffect getAbilityEffect(int i, SRPGActor actor,
			int x, int y, LColor c) {
		int tileWidth = 32;
		int tileHeight = 32;
		if (actor != null) {
			tileWidth = actor.getTileWidth();
			tileHeight = actor.getTileHeight();
		}
		int halfTileWidth = tileWidth / 2;
		int halfTileHeight = tileHeight / 2;
		SRPGEffect o = null;
		switch (i) {
		case EFFECT_CHOP:
			o = new SRPGChopEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_ARROW:
			if (c == null) {
				o = new SRPGArrowEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGArrowEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_ARROWS:
			if (c == null) {
				o = new SRPGArrowsEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileWidth
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGArrowsEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileWidth
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_BURST:
			if (c == null) {
				o = new SRPGBurstEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGBurstEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_OUT:
			if (c == null) {
				o = new SRPGOUTEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGOUTEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_DARK:
			o = new SRPGDarkEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_CLOCK:
			o = new SRPGClockEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_CURE:
			if (c == null) {
				o = new SRPGSparkEffect(x * tileWidth - halfTileWidth, y
						* tileHeight - halfTileHeight, tileWidth * 2,
						tileHeight * 2, 10, 3);
			} else {
				o = new SRPGSparkEffect(x * tileWidth - halfTileWidth, y
						* tileHeight - halfTileHeight, tileWidth * 2,
						tileHeight * 2, 10, 3, c);
			}
			break;
		case EFFECT_BLOOD_1:
			if (c == null) {
				o = new SRPGBloodEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGBloodEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_BLOOD_2:
			if (c == null) {
				o = new SRPGBloodEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, LColor.red);
			} else {
				o = new SRPGBloodEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_FADE:
			o = new SRPGFadeEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_LOOT_1:
			if (c == null) {
				o = new SRPGForceEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, actor.getPosX()
						* tileWidth + halfTileWidth, actor.getPosY()
						* tileHeight + halfTileHeight, 24, LColor.red);
			} else {
				o = new SRPGForceEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, actor.getPosX()
						* tileWidth + halfTileWidth, actor.getPosY()
						* tileHeight + halfTileHeight, 24, c);
			}
			break;
		case EFFECT_LOOT_2:
			if (c == null) {
				o = new SRPGForceEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, actor.getPosX()
						* tileWidth + halfTileWidth, actor.getPosY()
						* tileHeight + halfTileHeight, 24, LColor.black);
			} else {
				o = new SRPGForceEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, actor.getPosX()
						* tileWidth + halfTileWidth, actor.getPosY()
						* tileHeight + halfTileHeight, 24, c);
			}
			break;
		case EFFECT_C:
			if (c == null) {
				o = new SRPGCohesionEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGCohesionEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_RC:
			if (c == null) {
				o = new SRPGRCohesionEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGRCohesionEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_SNOW:
			o = new SRPGSnowEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_ICE:
			if (c == null) {
				o = new SRPGIceEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGIceEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_BLAST:
			if (c == null) {
				o = new SRPGBlastEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGBlastEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_T:
			o = new SRPGThunderEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight);
			break;
		case EFFECT_S:
			if (c == null) {
				o = new SRPGStrikeEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight);
			} else {
				o = new SRPGStrikeEffect(actor.getPosX() * tileWidth
						+ halfTileWidth, actor.getPosY() * tileHeight
						+ halfTileHeight, x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_WIND:
			o = new SRPGWindEffect();
			break;
		case EFFECT_FIRE:
			if (c == null) {
				o = new SRPGOUTEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, LColor.red);
			} else {
				o = new SRPGOUTEffect(x * tileWidth + halfTileWidth, y
						* tileHeight + halfTileHeight, c);
			}
			break;
		case EFFECT_TAICHI:
			o = new SRPGTaichiEffect(x * tileWidth + halfTileWidth, y
					* tileHeight + halfTileHeight, 90);
			break;
		}
		return o;
	}
}
