/**
 * プレイヤー共通イニシャライズ処理
 */
task Initialize_All(){
	//ダミー用のイニシャライズ処理開始
	Initialize_Dummy();
	
	//共通データを取得するために2F待つ
	PWait( 2 );
	
	//OFT用共通データが存在するか確認する
	if( IsCommonDataAreaExists( "OFT" ) ){
		//ループ処理用テンポラリ変数
		let tmp_Player = "";
		
		//共通データが存在した
		while( Player == Player_Dummy ){
			tmp_Player = GetCommonDataDefaultEx( "OFT", "Player", "" );
			alternative( tmp_Player )
				case( "Sunny" ){
					Player = Player_Sunny;
				}
				case( "Luna" ){
					Player = Player_Luna;
				}
				case( "Star" ){
					Player = Player_Star;
				}
			
			yield;
		}
	}else{
		//共通データが存在しなかった
		RaiseError( "このプレイヤースクリプトはOriental Fairy's Tale専用です。\nOriental Fairy's Taleから起動してください。", "警告" );
	}
	
	//選択したプレイヤーのイニシャライズ処理を起動する
	alternative( Player )
		case( Player_Sunny ){
			Initialize_Sunny();
		}
		case( Player_Luna ){
			Initialize_Luna();
		}
		case( Player_Star ){
			Initialize_Star();
		}
	
	//プレイヤー共通メイン処理タスク
	TMain();
}

/**
 * プレイヤー共通メイン処理タスク
 */
task TMain(){
	let shieldcount = 0;
	let shieldmaxcount = 15;
	let shieldstartuse = 100;
	let shieldstartcount = 0;
	let recoverymaxcount = 80;
	let recoverycount = recoverymaxcount;
	let shotcount1 = 0;
	let shotcount2 = 0;
	let shotmaxcount2 = 20;
	let doublepush1 = 0;
	let doublepush2 = 0;
	let doublepush1count = 10;
	let doublepush2count = 10;
	let onshield = false;
	
	//ボム時のアイテム自動回収タスク起動
	CollectUserItemOnBomb();
	
	loop{
		//キーステート格納
		GetKeyStateAll();
		
		//有効なときのみ各種操作
		if( true ){
			onshield = false;
			
			//ユーザーキー押下時処理
			if( Key_User == KEY_PUSH ){
				if( shieldstartcount == 0 ){
					shieldcount = shieldmaxcount;
					shieldsize = 1;
					shieldstartcount = shieldmaxcount;
				}
			}else if( Key_User == KEY_HOLD ){
				if( shieldcount == 0 ){
					shieldcount += 1;
				}
			}
			
			//シールド or ゲージ回復処理
			if( shieldcount > 0 ){
				//シールド処理
				onshield = Shield();
				shieldcount -= 1;
				recoverycount = 0;
				
				//シールド展開時の初期費用
				if( shieldstartcount > 0 ){
					SubShieldGauge( shieldstartuse / shieldmaxcount );
					shieldstartcount -= 1;
				}
			}else{
				//ゲージ回復率の回復
				if( recoverycount < recoverymaxcount ){
					recoverycount += 1;
				}
				
				//ゲージ自然回復
				AddShieldGauge( GaugeRecovery * ( recoverycount / recoverymaxcount ) );
			}
			
			//シールド展開中画像サイズ設定
			if( shieldsize > 0 ){
				shieldangle += shieldangleplus;
				
				if( !onshield ){
					shieldsize -= 1 / shieldsizeframe;
				}
			}
			
			//ユーザーキー押下時処理
			if( Key_Shot == KEY_PUSH ){
				doublepush1 = doublepush1count;
				//2回押し処理 チャージショット
				if( doublepush2 > 0 ){
					doublepush1 = 0;
					doublepush2 = 0;
					
					//チャージストックが1以上あれば発動
					if( GetNowChargeCount() > 0 ){
						//チャージストックを1減らす
						SubNowChargeCount( 1 );
						//SE再生
						PlaySE( SE_ChargeShot );
						
						//選択したプレイヤーのチャージショット発射処理を起動する
						alternative( Player )
							case( Player_Sunny ){
								ChargeShot_Sunny();
							}
							case( Player_Luna ){
								ChargeShot_Luna();
							}
							case( Player_Star ){
								ChargeShot_Star();
							}
					}
				}
			}else if( Key_Shot == KEY_PULL ){
				if( doublepush1 > 0 ){
					doublepush2 = doublepush2count;
				}
			}
			if( Key_Shot == KEY_PUSH || Key_Shot == KEY_HOLD ){
				shotcount2 = shotmaxcount2;
			}
			
			//ショット処理
			if( doublepush1 > 0 ){
				doublepush1 -= 1;
			}
			if( doublepush2 > 0 ){
				doublepush2 -= 1;
			}
			if( shotcount2 > 0 ){
				shotcount2 -= 1;
				shotcount1 += 1;
				
				//選択したプレイヤーのショット発射処理を起動する
				alternative( Player )
					case( Player_Sunny ){
						Shot_Sunny( shotcount1 );
					}
					case( Player_Luna ){
						Shot_Luna( shotcount1 );
					}
					case( Player_Star ){
						Shot_Star( shotcount1 );
					}
			}
		}
		
		//1Fウェイト
		PWait( 1 );
	}
}

/**
 * プレイヤー共通メインループ処理
 */
function MainLoop_All(){
	//当たり判定設定
	if( intersectionCount == 0 ){
		SetIntersectionCircle( GetPlayerX(), GetPlayerY(), Intersection );
	}else{
		intersectionCount -= 1;
	}
}

/**
 * プレイヤー共通描画処理
 */
function DrawLoop_All(){
	//プレイヤーの描画
	SetTexture( imgPlayer );
	SetRenderState( ALPHA );
	if( Key_Right == KEY_PUSH || Key_Right == KEY_HOLD ){
		//右移動
		SetGraphicRect( Player_Rect * 2, Player_Rect * 0, Player_Rect * 3, Player_Rect * 1 );
	}else if( Key_Left == KEY_PUSH || Key_Left == KEY_HOLD ){
		//左移動
		SetGraphicRect( Player_Rect * 1, Player_Rect * 0, Player_Rect * 2, Player_Rect * 1 );
	}else{
		//通常
		SetGraphicRect( Player_Rect * 0, Player_Rect * 0, Player_Rect * 1, Player_Rect * 1 );
	}
	SetGraphicScale( 1, 1 );
	SetGraphicAngle( 0, 0, 0 );
	DrawGraphic( GetPlayerX(), GetPlayerY() );
	
	//シールドの描画
	let imgSize = 128;
	let imgIdx = 0;
	alternative( Player )
		case( Player_Sunny ){
			imgIdx = 0;
		}
		case( Player_Luna ){
			imgIdx = 3;
		}
		case( Player_Star ){
			imgIdx = 1;
		}
	SetTexture( imgShield );
	SetGraphicRect( imgSize * imgIdx, imgSize * 2, imgSize * (imgIdx + 1), imgSize * 3 );
	SetGraphicScale( shieldsize * ShieldRadius / ( imgSize / 2 ), shieldsize * ShieldRadius / ( imgSize / 2 ) );
	SetGraphicAngle( 0, 0, shieldangle );
	DrawGraphic( GetPlayerX(), GetPlayerY() );
}

/**
 * プレイヤー共通ファイナライズ処理
 */
function Finalize_All(){
}

/**
 * プレイヤーの設定を一括でセットする
 */
function SetPlayerSettings(){
	//移動速度設定
	SetSpeed( HiSpeed, LowSpeed );
	
	//グレイズ半径設定
	SetGrazeCircle( Graze );
	
	//喰らいボム有効フレーム設定
	SetRebirthFrame( Rebirth );
	
	//喰らいボム減少フレーム設定
	SetRebirthFrameReduction( RebirthReduction );
	
	//初期ボム数設定
	SetInitialBombCount( InitialBomb );
	
	//プレイヤー残機画像設定
	SetPlayerLifeImage( imgPlayer, 0, 0, Player_Rect, Player_Rect );
	
	//アイテム自動回収ライン設定
	SetItemCollectLine( ItemCollect );
}

/**
 * シールド処理
 */
function Shield(){
	if( GetShieldGauge() > GaugeShieldUse ){
		SubShieldGauge( GaugeShieldUse );
		intersectionCount = 20;
		let bulletnum = GetEnemyShotCountEx( GetPlayerX(), GetPlayerY(), ShieldRadius, ALL );
		if( bulletnum > 0 ){
			AddChargeGauge( ChargePlus * bulletnum );
			AddScorePoint( bulletnum );
			AddBombExtendPoint( bulletnum );
		}
		DeleteEnemyShotImmediatelyInCircle( SHOT, GetPlayerX(), GetPlayerY(), ShieldRadius );
		
		return true;
	}else{
		return false;
	}
}

/**
 * アイテム回収
 */
task CollectUserItem(){
	SetCommonDataEx( "OFT", "CollectUserItem", true );
	
	//念のため2F待つ(プレイヤー待ちなし)
	FWait( 2 );
	
	SetCommonDataEx( "OFT", "CollectUserItem", false );
}

/**
 * アイテム回収
 */
task CollectUserItemOnBomb(){
	loop{
		while( !OnBomb() ){
			yield;
		}
		
		SetCommonDataEx( "OFT", "CollectUserItem", true );
		
		while( OnBomb() ){
			yield;
		}
		
		SetCommonDataEx( "OFT", "CollectUserItem", false );
	}
}
