import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.awt.image.*;
import java.util.StringTokenizer;

//--------------------------------------------------
// プレイヤー管理クラス
//--------------------------------------------------
class PlayerManage extends BasicManage{
	//--------------------------------------------------
	// 定数
	//--------------------------------------------------
	// キャラ最大数
	final byte CHARA_MAX = 99;

	// キャライメージ最大数
	final byte CHARA_IMAGE_MAX = 99;

	// 最大でか画像数
	final byte BIG_IMAGE_MAX_NUM = 10;

	// でか画像の幅
	final short BIG_IMAGE_WIDTH = 288;
	final short BIG_IMAGE_HEIGHT = 256;

	// キャラの幅
	final byte CHARA_WIDTH = 24;
	final byte CHARA_HEIGHT = 32;

	// 中央への補正値
	final byte CENTER_OFFSET_X = -4;
	final byte CENTER_OFFSET_Y = -16;

	// アニメ数
	static final byte ANIME_NUM = 3;

	// 一枚あたりのキャラ数
	final byte ONE_CHARA_NUM = 8;

	// プレイヤー最大数8 + 船 気球
	static final byte PLAYER_MAX = 8*2;
	// 現在のプレイヤー人数
	int m_player_num = 8;

	//--------------------------------------------------
	// メンバ
	//--------------------------------------------------
	// でかキャラチップ
	Image BigCharaImage[];

	// それぞれのキャライメージ
	CharaImage chara_image[];

	// プレイヤー(４人？)
	Player player[];

	Player GetPlayerInstance( int no ){
		return player[ no ];
	}

	// インスタンス
	static PlayerManage m_instance;
	static PlayerManage GetInstance(){return m_instance;}
	static void NewInstance( MapEdit applet ){ m_instance = new PlayerManage( applet ); }

	//--------------------------------------------------
	// コンストラクタ
	//--------------------------------------------------
	PlayerManage( MapEdit applet ){
		int i;

		this.applet = applet;

		// キャラ用でか画像2個
		BigCharaImage = new Image[ 2 ];

		// キャラ画像生成
		chara_image = new CharaImage[ PLAYER_MAX ];

		// プレイヤー
		player = new Player[ PLAYER_MAX ];

		// ０番を主人公
		// 優先度を高いほうから設定
		for( i = 0; i < PLAYER_MAX; i++ ){
			player[ i ] = new Player();
			player[ i ].priority = (byte)(PLAYER_MAX - i);
		}
		
		m_player_num = 8;
	}

	//--------------------------------------------------
	// 初期化
	//--------------------------------------------------
	void Initialize(){
	}

	//--------------------------------------------------
	// キャラ画像読み込み
	//--------------------------------------------------
	void LoadCharaImage( String file, int no, MediaTracker mediaT ){
		BigCharaImage[ no ] = applet.getImage( applet.getDocumentBase(), file );
		mediaT.addImage( BigCharaImage[ no ], 0 );
	}

	//--------------------------------------------------
	// プレイヤー作成
	//--------------------------------------------------
	void MakePlayer(){
		int i, j, k, id;

		DebugPrint( "MakePlayer()" );

		// でかキャライメージをピクセル分解して、それぞれのキャラを作成
		for( i = 0; i < 2; i++ ){
			int[] CharaPixels = new int[ BIG_IMAGE_WIDTH * BIG_IMAGE_HEIGHT ];
			PixelGrabber pg = new PixelGrabber( BigCharaImage[ i ], 0, 0, BIG_IMAGE_WIDTH, BIG_IMAGE_HEIGHT, CharaPixels, 0, BIG_IMAGE_WIDTH );
			try{
				pg.grabPixels();
			}catch( InterruptedException e ){
				System.err.println("Error");
			}

			// でかチップ１枚につきキャラ８体
			for( id = 0; id < ONE_CHARA_NUM; id++ ){
				// コンストラクタ
				chara_image[ ONE_CHARA_NUM*i+id ] = new CharaImage();

				// 透過色の指定 最初の1pixel
				chara_image[ ONE_CHARA_NUM*i+id ].AlphaColor = CharaPixels[ 0 ];

				// 作成
				// 方向４、アニメ３
				for( j = 0; j < DIR_NUM; j++ ){
					for( k = 0; k < ANIME_NUM; k++ ){
						MakeChipImageByBigImage( chara_image[ ONE_CHARA_NUM * i + id ].chip_image[ j ][ k ], CharaPixels,
							CHARA_WIDTH, CHARA_HEIGHT,
							( CHARA_WIDTH * k ) + ( CHARA_WIDTH * ANIME_NUM )*( id % (ONE_CHARA_NUM/2) ),	// x
							( CHARA_HEIGHT * j ) + ( CHARA_HEIGHT * DIR_NUM ) * ( id / (ONE_CHARA_NUM/2) ),	// y
							BIG_IMAGE_WIDTH );
					}
				}
			}
		}

		// キャラのイメージセット
		for( i = 0; i < PLAYER_MAX; i++ ){
			// イメージIDを取得
			// ちびID
			//int id2 = player[ i ].image_id;
			player[ i ].SetImage( chara_image[ i ] );
		}
	}

	//--------------------------------------------------
	// 歩行アニメ
	//--------------------------------------------------
	void WalkAnime(){
		int i;

		for( i = 0; i < PLAYER_MAX; i++ ){
			player[ i ].RenewAnime();
		}
	}

	//--------------------------------------------------
	// 配置
	//--------------------------------------------------
	void SetPlayerLocation( int x, int y ){
		int i;

		// 座標セット 軌跡初期化
		for( i = 0; i < PLAYER_MAX; i++ ){
			player[ i ].SetPoint( x * MapManage.CHIP_SIZE, y * MapManage.CHIP_SIZE );
			player[ i ].InitHistory();
		}
	}
}


