/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: StageCoordinator.java,v 1.1.2.1 2003/12/11 10:15:10 ppoi Exp $
 */
package tsukuba_bunko.peko.scenario.stage;

import	tsukuba_bunko.peko.ActionControler;

import	tsukuba_bunko.peko.canvas.stage.Actor;
import	tsukuba_bunko.peko.canvas.stage.Stage;

import tsukuba_bunko.peko.scenario.Coordinator;
import	tsukuba_bunko.peko.scenario.SceneContext;


/**
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class StageCoordinator	extends Coordinator	{

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

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

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


	/**
	 * ネストレベル
	 */
	protected int	_level = 0;


	/**
	 * <code>StageCoordinator</code> のインスタンスを生成します。
	 */
	public StageCoordinator()
	{
		super();
	}


	/**
	 * <code>name</code> で識別される役者の情報を取得します。
	 * @param	name	役者名
	 * @return	Actor オブジェクト。該当する役者がいない場合 <code>null</code>
	 */
	public Actor getActor( String name )
	{
		Actor	actor = getStage().getActor( name );
		if( actor == null )	{
			return null;
		}
		else	{
			Actor	copy = new Actor( actor.getName() );
			actor.copyTo( copy );
			return copy;
		}
	}


	/**
	 * 役者を舞台に登場させます。
	 * @param	actor	登場する役者
	 */
	public void enter( Actor actor )
	{
		if( isActiveThread() )	{
			getStage().enter( actor );
		}
	}

	/**
	 * 役者を動かします。
	 * @param	actor	動かす役者
	 */
	public void action( Actor actor )
	{
		if( isActiveThread() )	{
			Stage	stage = getStage();
			Actor	current = stage.getActor( actor.getName() );
			if( current != null )	{
				if( current.getLooksImage() != actor.getLooksImage() )	{
					stage.exit( actor.getName() );
					stage.enter( actor );
				}
				else	{
					stage.enter( actor );
				}
			}
		}
	}

	/**
	 * 役者を退場させます。
	 * @param	name	退場させる役者名
	 * @return	退場した役者
	 */
	public Actor exit( String name )
	{
		if( isActiveThread() )	{
			return getStage().exit( name );
		}
		else	{
			return null;
		}
	}

	/**
	 * 背景を指定した色に設定します。
	 * @param	color	色名
	 */
	public void setBackgroundColor( String color )
	{
		if( isActiveThread() )	{
			getStage().setBackgroundColor( color );
		}
	}

	/**
	 * 背景を指定された画像に設定します。
	 * @param	image	画像名
	 */
	public void setBackgroundImage( String image )
	{
		if( isActiveThread() )	{
			getStage().setBackgroundImage( image );
		}
	}

	/**
	 * スライドを表示します。
	 * @param	slide	スライド名
	 */
	public void showSlide( String slide )
	{
		if( isActiveThread() )	{
			getStage().showSlide( slide );
		}
	}

	/**
	 * スライドを隠します。
	 */
	public void hideSlide()
	{
		if( isActiveThread() )	{
			getStage().hideSlide();
		}
	}

	/**
	 * BGM を再生します。
	 * @param	id	BGM ID
	 * @param	clipName	クリップ名
	 * @param	loop	ループする場合 <code>true</code>、それ以外の場合 <code>false</code>
	 */
	public void playBGM( String id, String clipName, boolean loop )
	{
		if( isActiveThread() )	{
			getStage().playBGM( id, clipName, loop );
		}
	}

	/**
	 * BGM を停止します。
	 * @param	id	BGM ID
	 */
	public void stopBGM( String id )
	{
		if( isActiveThread() )	{
			getStage().stopBGM( id );
		}
	}

	/**
	 * SE を再生します。
	 * @param	id	SE ID
	 * @param	clipName	クリップ名
	 * @param	loop	ループする場合 <code>true</code>、それ以外の場合 <code>false</code>
	 */
	public void playSE( String id, String clipName, boolean loop )
	{
		if( isActiveThread() )	{
			getStage().playSE( id, clipName, loop );
		}
	}

	/**
	 * SE を停止します。
	 * @param	id	SE ID
	 */
	public void stopSE( String id )
	{
		if( isActiveThread() )	{
			getStage().stopSE( id );
		}
	}

	/**
	 * ステージを指定されたエフェクトを使用して更新します。
	 * @param	effect	エフェクト名
	 */
	public void updateStage( String effect )
	{
		if( _level > 1 )	{
			return;
		}

		Stage	stage = getStage();
		stage.updateCanvas( effect );
	}

	/**
	 * エフェクトを使用せずにステージを更新します。
	 */
	public void updateStage()
	{
		if( isActiveThread() )	{
			updateStage( null );
		}
	}

	/**
	 * テキストキャンバスを隠します。
	 */
	public void hideTextCanvas()
	{
		if( isActiveThread() )	{
			getCanvasManager().hideTextCanvas();
		}
	}

	/**
	 * ステージを取得します。
	 * @return	ステージ
	 */
	protected Stage getStage()
	{
		return getCanvasManager().getStage();
	}


//
//	Coordinator の実装
//
	public void prepare( SceneContext context, Thread activeThread )
	{
		super.prepare( context, activeThread );
		_level = 0;
	}

	/**
	 * StageCanvas に対する操作を開始します。
	 */
	public void begin()
	{
		if( isActiveThread() )	{
			_level++;
			getCanvasManager().hideTextCanvas();
			getActionControler().setActive( false );
			getActionControler().setSaveEnabled( true );
		}
	}

	/**
	 * StageCanvas に対する操作を終了し、キャンバスの状態を確定します。
	 */
	public void commit()
	{
		if( isActiveThread() )	{
			_level--;
			if( _level == 0 )	{
				ActionControler	controler = getActionControler();
				controler.setActive( true );
				controler.setSaveEnabled( false );
				Stage	stage = getStage();
				stage.commit();
			}
		}
	}
}