/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * (c) Copyright 2002 by Tsukuba Bunko.
 *
 * $Id: Actor.java,v 1.1.2.1 2003/12/11 10:23:10 ppoi Exp $
 */
package tsukuba_bunko.peko.canvas.stage;

import	java.awt.Image;

import	java.io.Serializable;


/**
 * 舞台上の登場人物です。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class Actor	implements Serializable	{

	/**
	 * 立ち位置：中央
	 */
	public static final int	POSITION_CENTER = 0;

	/**
	 * 立ち位置：左
	 */
	public static final int	POSITION_LEFT = 1;

	/**
	 * 立ち位置：右
	 */
	public static final int	POSITION_RIGHT = 2;

	/**
	 * 立ち位置：絶対指定
	 */
	public static final int	POSITION_ABSOLUTE = 3;


	/**
	 * 人物名
	 */
	private String	_name = null;

	/**
	 * 描画イメージ名
	 */
	private String	_looks = null;

	/**
	 * 描画イメージ
	 */
	transient private Image	_looksImage = null;

	/**
	 * 立ち位置
	 */
	private int	_position = Actor.POSITION_CENTER;

	/**
	 * 立ち位置の絶対位置
	 */
	private float	_absolutePosition = 0.0f;


	/**
	 * <code>Actor</code> のインスタンスを作成します。
	 * @param	name	人物名
	 * @throws	IllegalArgumentException	<code>name</code> が <code>null</code> の場合
	 */
	public Actor( String name )
	{
		super();
		if( name == null )	{
			throw new IllegalArgumentException( "name is not specified." );
		}
		_name = name;
	}


	/**
	 * 人物名を取得します。
	 * @return	人物名
	 */
	public String getName()
	{
		return _name;
	}

	/**
	 * 表情(立ち絵)を設定します。
	 * @param	looks	表情(立ち絵)
	 */
	public void setLooks( String looks )
	{
		ImageManager	images = ImageManager.getInstance();
		if( (_looks != null) && _looks.equals(looks) )	{
			if( _looksImage == null )	{
				setLooksImage( images.getImage(looks, true) );
			}
		}
		else	{
			if( _looksImage != null )	{
				images.putImage( _looks, _looksImage );
			}
			setLooksImage( images.getImage(looks, true) );
		}
		_looks = looks;
	}

	/**
	 * 表情(立ち絵)を取得します。
	 * @return	表情(立ち絵)
	 */
	public String getLooks()
	{
		return _looks;
	}

	/**
	 * 表情(立ち絵)画像を設定します。
	 * @param	looks	表情(立ち絵)
	 */
	public void setLooksImage( Image looks )
	{
		_looksImage = looks;
	}

	/**
	 * 表情(立ち絵)画像を取得します。
	 * @return	表情(立ち絵)
	 */
	public Image getLooksImage()
	{
		return _looksImage;
	}

	/**
	 * 立ち位置を設定します。
	 * @param	position	立ち位置。{@link #POSITION_CENTER}, {@link #POSITION_LEFT}, {@link #POSITION_RIGHT} から選択します。
	 */
	public void setPosition( int position )
	{
		if( (position == Actor.POSITION_CENTER) || (position == Actor.POSITION_LEFT) || (position == Actor.POSITION_RIGHT) )	{
			_position = position;
		}
		else	{
			throw new IllegalArgumentException( "invalid position type is specified." );
		}
	}

	/**
	 * 立ち位置を絶対指定で設定します。
	 * @param	absolutePosition	絶対指定された立ち位置
	 */
	public void setPosition( float absolutePosition )
	{
		_position = Actor.POSITION_ABSOLUTE;
		_absolutePosition = absolutePosition;
	}

	/**
	 * 立ち位置を取得します。
	 * @return	立ち位置
	 */
	public int getPosition()
	{
		return _position;
	}

	/**
	 * 立ち位置の絶対位置を取得します。
	 * @return	絶対指定された立ち位置
	 */
	public float getAbsolutePosition()
	{
		return _absolutePosition;
	}

	/**
	 * この Actor を破棄します。
	 */
	void disposeLooks()
	{
		if( _looksImage != null )	{
			ImageManager	images = ImageManager.getInstance();
			images.putImage( _looks, _looksImage );
			_looksImage = null;
		}
	}

	/**
	 */
	void prepare()
	{
		setLooks( _looks );
	}


	/**
	 * 現在の状態を <code>actor</code> にコピーします。
	 * @param	actor	コピー先の Actor オブジェクト
	 */
	public void copyTo( Actor actor )
	{
		actor._name = _name;
		actor._looksImage = _looksImage;
		actor._looks = _looks;
		actor._position = _position;
		actor._absolutePosition = _absolutePosition;
	}
}