<!--
//////////////////////////////////////////////////////////////
// 「JS RACING」	(C)1999 Masahiko.Nitanda
// プレイ画面処理モジュール

/////////////////////////////////////////////////////////////////////////////////
// 謝辞
// 「JS RACING」は「ArtRun」を参考にしました。
// 作者の森山氏(http://plaza.harmonix.ne.jp/~jimmeans/)には、とても感謝しています。

//////////////////////////////////////////////////////////////
// CommonRAM

PlTID = 0;						// プレイタイマーID
PlInt = 40;						// プレイインターバル
PlwI = 3600 / PlInt;	// 走行距離計算用
IsStart = 0;					// スタートフラグ
IsTOv = 0;						// タイムオーバーフラグ
RLCx = new Array(33);	// 道路ラインセンターX座標
RLCy = new Array(33);	// 道路ラインY座標
RLPx = new Array(33);	// 道路ラインの表示X座標
RLDis = new Array(33);	// 道路ラインの視点からの距離
RLWid = new Array(33);	// 道路ラインの幅
Dist = 0;			// 走行距離
G = 0;				// カーブ時のＧ
TimeL = 30;		// 制限時間(s)
Time = 0;			// 経過時間(s)
Speed = 0;		// ハイロ車スピード
SpMax = 300;	// 最高スピード(300km/h)
MSPN = 0;			// 自車の表示画像番号(画像非表示用)
MCarP = new Array(185, 245);	// ハイロ車表示座標(常に真中)
MCRPx = 218;	// ハイロ車相対X座標
IsDrift = 0;	// ドリフトフラグ(1:ドリフト可能状態 ,2:ドリフト中)
DriftD = 0;		// ドリフト方向(0:左, 1:右)
IsSpn = 0;		// スピンフラグ(0:なし, 1:右スピン, -1:左スピン)
SpnN = 0;			// スピンスプライト番号

ChkP = new Array(1000, 2000, 3000);		// チェック・ゴールポイント位置
CCol = new Array("#62c400", "#e2b252", "#ffffff");	// コースカラー
CNum = 0;			// コース番号
IsGoal = 0;		// ゴールフラグ(0:なし, 1:ハイロ勝ち, 2:ハイロ負け)
CGPS = new Array(0, 0);	// チェック・ゴール画像サイズ
UpLT = 10;		// 制限時間増加値
SkyX = 0;			// 空X座標
WhSG = new Array(0, 2, 4, 6, 8);		// 表示道路脇画像番号(-1は空)
SGNum = 0;		// 道路脇画像表示番号
IsSGNUp = 1;	// 道路脇画像表示番号増加フラグ
SGP = new Array(20, 40, 60, 80, 100);	// 道路脇画像表示位置
LSGP = 100;		// 最新道路脇画像の表示位置
SGSpaP = 20;	// 道路脇画像表示間隔調整用
SGSPP = 8;		// スプライト番号

// 一般車データ
NCSpd = 160;								// 速度
NCSPN = new Array(9, 9, 9);	// 車表示スプライト番号(9:空)
NCSPPx = new Array(3);			// X軸位置(車線番号)
NCSPX = new Array(3);				// X座標(当たり判定用)
NCSPD = new Array(0, 0, 0);	// 走行距離
NCSPZ = new Array(3);				// Zインデックス
NCLDis = 0;									// 最遠一般車の走行距離
NCSpaD = 20;								// 車間距離

// アンドレス車データ
ACSpMax = 300;		// 最高速度(追いかけ時)
ACSpMid = 260;		// 通常速度
ACSpd = ACSpMid;	// 走行速度
ACSPPx = 1;		// X軸位置(車線番号)
ACSPX = 0;		// X座標(当たり判定用)
ACSPD = 0;		// 走行距離
ACSPZ = 0;		// Ｚインデックス
IsACar = 1;		// 存在フラグ
ACSDx = 0;		// X軸移動量
IsAGoal = 0;	// ゴールフラグ

// アニメーション用
// ハイロ車内アニメデータ
MCAData = new Array(10, 11, 12, 13, 14, 15, 16, 0);
mcad_p = 1;	// ハイロ車内アニメ用ポインタ
// ルーシーアニメデータ(0:消去、1:左に歩く、2:手前に歩く、3:奥に歩く)
LuWData = new Array(
	2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 0
);
WhMess = 0;					// メッセージ表示
MessC = 10;					// メッセージカウント
MessOx = 155;				// メッセージ表示位置(基本位置)
LuP = new Array(233, 240);	// ルーシーの座標
LuS = new Array(16, 48);		// ルーシーのサイズ
LStC = 0; // 歩行カウント
// visLu配列の添字＜0〜3:下（手前）移動、4〜7:上（奥）移動、8〜11:左移動、12〜15:右移動＞
pvL = 0;
MaxC = 2;	// 歩行アニメ切替え間隔
G1AData = new Array(0, 17, 18);		// ゴールアニメ１データ
HaPx = new Array(205, 205, 205);	// ハートX座標
HaPy = new Array(245, 245, 245);	// ハートY座標
HaDx = new Array(0, -1, 1);				// ハートX移動量
HaDy = new Array(-2, -1, -1);			// ハートY移動量
HaPyMax = new Array(125, 130, 130);	// ハートY座標最大値
HaAppC = new Array(12, 15, 18);			// ハート出現タイミング
IsHaApp = new Array(0, 0, 0);				// ハート出現フラグ
G1ACnt = 0;	// ゴールアニメ1用カウント
hst = 0;		// ハートアニメフラグ
IsEndA = 0;	// アニメ終了フラグ

//////////////////////////////////////////////////////////////
// インプリメンテーション

// プレイタイマー
function IntPl()
{
	clearTimeout(PlTID);	// プレイタイマークリア
	
	// メッセージ表示
	if (WhMess == 1){
		if (MessC > 0) MessC--;	// メッセージカウント減少
		else{
			// メッセージ非表示
			MessSP.style.visibility = "hidden";
			MessSP.style.left = MessOx;
			WhMess = 0;
		}
	}
	if (!IsStart) FAnim(1);	// カウントダウンアニメ
	else if (IsGoal == 1){
		// ハイロ勝ち
		FAnim(2);
		if (IsEndA){
			if (FGOver(1)) return;
		}
	}
	else if (IsGoal == 2){
		// ハイロ負け
		FAnim(3);
		if (IsEndA){
			if (FGOver(2)) return;
		}
	}
	else if (IsTOv){
		// タイムオーバー
		if (FGOver(0)) return;
	}
	else FPMain();	// プレイメイン処理
	
	PlTID = setTimeout("IntPl()", PlInt);	// プレイタイマー設定
}

// タイムオーバー
function FGOver(w)
{
	if (!Cnt && w){
		// スコア計算
		s1 = (TimeL - Math.floor(Time)) * 100;
		s2 = 0;
		if (w == 1) s2 = 2000;	// ボーナス
		
		// スコア表示
		GOMessSP[3].innerText = " TIME:" + s1;
		GOMessSP[4].innerText = "BONUS:" + s2;
		GOMessSP[5].innerText = "TOTAL:" + (s1 + s2);
		for (i = 1; i < 7; i++)
			GOMessSP[i].style.visibility = "visible";
		
		Cnt++;
	}
	
	if (ON_KEY[5]){
		// タイトルに戻る
		retTW();
		
		return 1;
	}
	
	return 0;
}

// タイトルに戻る
function retTW()
{
	// スプライト消去
	SkySP.visibility = "hidden";
	for (i = 0; i < 66; i++) RLSP[i].visibility = "hidden";
	for (i = 0; i < 30; i++) SGSP[i].visibility = "hidden";
	for (i = 0; i < 9; i++) NCarSP[i].visibility = "hidden";
	for (i = 0; i < 19; i++) MCarSP[i].visibility = "hidden";
	for (i = 0; i < 5; i++) ACarSP[i].visibility = "hidden";
	for (i = 0; i < 3; i++) HartSP[i].visibility = "hidden";
	CntDSP.visibility = "hidden";
	MessSP.style.visibility = "hidden";
	for (i = 0; i < 2; i++){
		RTSP[i].visibility = "hidden";
		SpSP[i].visibility = "hidden";
		DGSP[i].visibility = "hidden";
	}
	for (i = 0; i < 3; i++) CGPSP[i].visibility = "hidden";
	for (i = 0; i < 7; i++) GOMessSP[i].style.visibility = "hidden";
	
	WSp[WhWind].visibility = "hidden";
	WhWind = 3;	// タイトル画面
	WSp[WhWind].visibility = "visible";
	
	TiTID = setTimeout("IntTi()", TiInt);	// タイトルタイマー設定
}

// プレイメイン処理
function FPMain()
{
	MRoad();	// 道路ライン表示
	FSideG();	// 道路脇画像処理
	FCGP();		// チェック・ゴール処理
	FNCar();	// 他車の処理
	FACar();	// アンドレス車処理
	FMyCar();	// ハイロ車処理
	
	//////////////////////////////////////////
	// キャラ移動

	// 空
	SkyX -= G * Speed / 5;
	if (SkyX >= 800) SkyX -= 800;
	else if (SkyX <= -400) SkyX += 800;
	SkySP[0].left = SkyX;
	SkySP[1].left = SkyX - 800;
	
	// パラメータ表示
	t = TimeL - Math.floor(Time);
	d = Math.floor(ChkP[CNum] - Dist);
	for (i = 0; i < 2; i++){
		RTSP[i].innerText = "Time:" + t + "(s)";
		SpSP[i].innerText = "Speed:" + Speed + "(km/h)";
		DGSP[i].innerText = "Distance:" + d + "(m)";
	}
	if (t < 4){
		if (t > 0){
			WhMess = 1;	// メッセージ表示フラグセット
			MessC = 5;	// メッセージカウント
			MessSP.innerText = t;
			MessSP.style.left = MessOx + 30;
			MessSP.style.visibility = "visible";	// メッセージ表示
		}
		else if (t <= 0){
			// タイムオーバー
			MessC = 0;
			GOMessSP[0].style.visibility = "visible";
			GOMessSP[6].style.visibility = "visible";
			IsTOv = 1;
		}
	}

	Time += PlInt / 1000;	// 経過時間計算
}

// チェック・ゴール処理
function FCGP()
{
	k = ChkP[CNum] - Dist;
	if (RLDis[0] > k){
		// チェック・ゴールポイント画像移動拡大
		if (IsSGNUp){
			// 道路脇画像の変更
			if (SGNum < 2) SGNum++;
			IsSGNUp = 0;
		}

		// 画像表示位置の道路幅を求める
		for (i = 0; i < 33; i++){
			if (RLDis[i] <= k) break;
		}

		if (i < 33){
			CGPSP[CNum].width = CGPS[0] = Math.floor(3300 / RLDis[i]);
			CGPSP[CNum].height = CGPS[1] = Math.floor(1000 / RLDis[i]);
			CGPSP[CNum].left = RLPx[i] - CGPS[0] / 22;
			CGPSP[CNum].top = RLCy[i] - CGPS[1];
			CGPSP[CNum].zIndex = i + 1;	// Zインデックス
			
			// チェック･ゴールポイント画像表示
			CGPSP[CNum].visibility = "visible";
		}
		else {
			if (CNum < 2){
				// チェックポイント通過
				CGPSP[CNum].visibility = "hidden";
				CNum++;
				Time -= UpLT;	// 制限時間増加
				WhMess = 1;		// 制限時間増加メッセージ表示
				MessC = 20;		// メッセージカウント
				MessSP.innerText = "+" + UpLT + "(s)";
				MessSP.style.visibility = "visible";	// メッセージ表示
				
				WSp[0].background = CCol[CNum];	// 背景色変更
				IsSGNUp = 1;	// 道路脇画像番号増加フラグセット
			}
			else {
				// ゴール
				if (!IsAGoal) IsGoal = 1;	// ハイロ勝ち
				else IsGoal = 2;		// ハイロ負け
			}
		}
	}
}

// 道路脇画像処理
function FSideG()
{
	// 道路脇画像生成
	if ((Dist + RLDis[0] - LSGP) > SGSpaP){
		for (i = 0; i < 5; i++){
			if (WhSG[i] == -1){
				if (SGSPP <= 6) SGSPP += 2;
				else SGSPP = 0;
				WhSG[i] = SGSPP + SGNum * 10;
				LSGP = SGP[i] = Dist + RLDis[0];
				
				break;
			}
		}
	}
	
	// 道路脇画像
	for (i = 0; i < 5; i++){
		if (WhSG[i] != -1){
			k = SGP[i] - Dist;
			if (RLDis[0] > k){
				// 画像表示位置の道路幅を求める
				for (j = 0; j < 33; j++){
					if (RLDis[j] <= k) break;
				}

				if (j < 33){
					w = Math.floor(640 / RLDis[j]);
					h = Math.floor(1280 / RLDis[j]);
					l1 = RLPx[j] - w;
					l2 = RLPx[j] + RLWid[j];
					t = RLCy[j] - h;
					SGSP[WhSG[i]].width = SGSP[WhSG[i] + 1].width = w;
					SGSP[WhSG[i]].height = SGSP[WhSG[i] + 1].height = h;
					SGSP[WhSG[i]].left = l1;
					SGSP[WhSG[i] + 1].left = l2;
					SGSP[WhSG[i]].top = SGSP[WhSG[i] + 1].top = t;
					SGSP[WhSG[i]].zIndex = SGSP[WhSG[i] + 1].zIndex = j + 1;

					// 道路脇画像表示
					SGSP[WhSG[i]].visibility = SGSP[WhSG[i] + 1].visibility = "visible";
				}
				else{
					// 画像非表示
					SGSP[WhSG[i]].visibility = SGSP[WhSG[i] + 1].visibility = "hidden";
					WhSG[i] = -1;
				}
			}
		}
	}
}

// 一般車処理
function FNCar()
{
	// 最遠一般車の距離を求める(mf:最遠一般車番号)
	md = 0;
	for (mf = 0; mf < 3; mf++){
		if (md < NCSPD[mf]) md = NCSPD[mf];
	}
	
	if (Speed > NCSpd){
		if ((Dist + RLDis[0] - md) > NCSpaD){
			// 一般車出現
			for (i = 0; i < 3; i++){
				if (NCSPN[i] == 9){
					n = Math.floor((Math.random() * 16) % 9);
					// スプライト重複防止
					is_dup = 0;
					for (j = 0; j < 3; j++){
						if (NCSPN[j] == n) is_dup = 1;
					}
					
					if (!is_dup){
						NCSPN[i] = n;
						NCSPD[i] = Dist + RLDis[0];	// 走行距離セット
						NCSPPx[i] = Math.floor((Math.random() * 16) % 4);
						
						break;
					}
				}
			}
		}
	}
	
	for (i = 0; i < 3; i++){
		if (NCSPN[i] != 9){
			// 一般車走行距離
			NCSPD[i] += NCSpd / PlwI;
			
			// 画像表示位置の道路幅を求める
			k = NCSPD[i] - Dist;
			for (j = 0; j < 33; j++){
				if (RLDis[j] <= k) break;
			}

			if (j < 33 && k < 120){
				l = Math.floor(RLWid[j] / 4);
				w = h = l;
				NCSPX[i] = RLPx[j] + l * NCSPPx[i];
				t = RLCy[j] - h;
				NCSPZ[i] = j + 1;
				NCarSP[NCSPN[i]].width = w;
				NCarSP[NCSPN[i]].height = h;
				NCarSP[NCSPN[i]].left = NCSPX[i];
				NCarSP[NCSPN[i]].top = t;
				NCarSP[NCSPN[i]].zIndex = NCSPZ[i];

				// 画像表示
				NCarSP[NCSPN[i]].visibility = "visible";
			}
			else {
				// 画像非表示
				NCarSP[NCSPN[i]].visibility = "hidden";
				NCSPN[i] = 9;
			}
		}
	}
}

// アンドレス車処理
function FACar()
{
	// アンドレス車走行距離
	ACSPD += ACSpd / PlwI;
	
	if (ACSPD >= ChkP[2]){
		// アンドレスゴール
		IsAGoal = 1;	// ゴールフラグセット
		ACSpd = 0;		// 速度０にする
	}
	
	if (!IsACar){
		if (ACSPD < Dist + RLDis[0]){
			if (Dist + RLDis[32] < ACSPD){
				// アンドレス車出現
				ACSPPx = Math.floor((Math.random() * 16) % 4);
				IsACar = 1;
				if (!IsAGoal) ACSpd = ACSpMid;	// 通常速度セット
				ACSDx = 0;
			}
		}
	}
	
	if (IsACar){
		// 画像表示位置の道路幅を求める
		k = ACSPD - Dist;
		for (i = 0; i < 33; i++){
			if (RLDis[i] <= k) break;
		}

		if (i < 33 && k < 120){
			if (!ACSDx){
				// 一般車をよける処理
				mn = -1;	// アンドレス車から一番近い一般車(-1:なし)
				dl = 1000;	// アンドレス車との車間距離
				// アンドレス車から一番近い一般車を求める
				for (j = 0; j < 3; j++){
					if (NCSPN[j] != 9){
						l = NCSPD[j] - ACSPD;
						if (-10 < l && l < dl){
							dl = l;
							mn = j;
						}
					}
				}
				// 移動量移動方向の決定
				if (mn != -1){
					if (NCSPPx[mn] == ACSPPx){
						if (Math.floor((Math.random() * 16) % 2)){
							// 右に移動
							if (ACSPPx < 3) ACSDx = 0.25;
							else ACSDx = -0.25;	// 左に移動
						}
						else{
							// 左に移動
							if (ACSPPx > 0) ACSDx = -0.25;
							else ACSDx = 0.25;	// 右に移動
						}
					
						ACSpd = NCSpd;	// 一般車同じ速度にする
					}
				}
			}
			// X方向移動
			if (ACSDx){
				ACSPPx += ACSDx;
				if (!((ACSPPx * 10) % 10)){
					// 移動完了
					ACSDx = 0;
					ACSpd = ACSpMid;	// 走行速度を戻す
				}
			}
			
			// 拡縮処理
			l = Math.floor(RLWid[i] / 4);
			w = l;
			h = Math.floor(l / 2);
			ACSPX = RLPx[i] + l * ACSPPx;
			t = RLCy[i] - h;
			ACSPZ = i + 1;
			for (j = 0; j < 4; j++){
				ACarSP[j].width = w;
				ACarSP[j].height = h;
			}
			ACarSP[4].left = ACSPX;
			ACarSP[4].top = t;
			ACarSP[4].zIndex = ACSPZ;
			
			ACarSP[0].visibility = "visible";	// 画像表示
		}
		else{
			// 画像非表示
			if (i == 33) ACSpd = ACSpMax;	// 最高速度(追いかけ時)
			
			ACarSP[0].visibility = "hidden";
			IsACar = 0;	// 存在フラグリセット
		}
	}
}

// 自車(ハイロ)処理
function FMyCar()
{
	if (IsSpn){
		// スピン(スピンスプライト番号：1-9)
		if (Speed >= 20) Speed -= 20;	// 減速
		else Speed = 0;

		if (!Cnt){
			if (IsSpn == 1) SpnN = 1;	// 右スピン
			else SpnN = 9;	// 左スピン
			
			// スピンメッセージ
			// Wow!!メッセージ
			WhMess = 1;	// メッセージ表示フラグセット
			MessC = 10;	// メッセージカウント
			MessSP.innerText = "Wow!!";
			MessSP.style.left = MessOx - 20;
			MessSP.style.visibility = "visible";	// メッセージ表示
		}
		
		CMCarSP(SpnN);	// 画像変更
		SpnN = SpnN + IsSpn;
		
		if ((SpnN == 0) || (SpnN == 10)){
			// スピン終了
			Cnt = 0;
			IsSpn = 0;
		}
		else Cnt++;
	}
	
	/////////////////////////////////////////////////////
	// キー入力処理
	if (!IsSpn){
		if (ON_KEY[4]){
			// アクセル
			if (Speed < SpMax) Speed += 10;
			
			if (IsDrift == 1){
				IsDrift = 2;	// ドリフト開始
				
				// Wonderful!メッセージ
				WhMess = 1;	// メッセージ表示フラグセット
				MessC = 10;	// メッセージカウント
				MessSP.innerText = "Wonderful!";
				MessSP.style.left = MessOx - 100;
				MessSP.style.visibility = "visible";	// メッセージ表示
			}
			if (!G) IsDrift = 0;	// Gがないとドリフト終了
		}
		else if (ON_KEY[5]){
			// ブレーキ
			if (Speed >= SpMax){
				if (G){
					if (ON_KEY[0] && !ON_KEY[1]){
						// ドリフト方向左
						IsDrift = 1;	// ドリフト可能状態
						DriftD = 0;		// ドリフト方向セット
					}
					else if (ON_KEY[1] && !ON_KEY[0]){
						// ドリフト方向右
						IsDrift = 1;	// ドリフト可能状態
						DriftD = 1;		// ドリフト方向セット
					}
				}
			}

			if (Speed >= 20) Speed -= 20;
			else Speed = 0;
			
			if (IsDrift == 2){
				if (Speed >= 200){
					if (DriftD) IsSpn = 1;	// 右スピン
					else IsSpn = -1;	// 左スピン
				
					Cnt = 0;
				}
			
				IsDrift = 0;	// ドリフト終了
			}
		}
		else{
			// すこしづつ減速
			if (Speed >= 3) Speed -= 3;
			else Speed = 0;
		
			IsDrift = 0;	// ドリフト終了
		}

		// 車の左右への移動量は、スピードに比例している
		if (ON_KEY[0] && !ON_KEY[1]){
			// 左へ移動
			if (IsDrift != 2){
				dx = 12;
				sp = 9;
			}
			else{
				if (!DriftD){
					// ドリフト方向左(曲りすぎ)
					dx = 32;
					sp = 8;	// 左ドリフト画像
				}
				else{
					// ドリフト方向右(丁度よい)
					dx = -24;
					sp = 2;	// 右ドリフト画像
				}
			}

			if (Speed){
				MCRPx -= dx;
				CMCarSP(sp);	// 左後部画像に変更
			}
		}
		else if (ON_KEY[1] && !ON_KEY[0]){
			// 右へ移動
			if (IsDrift != 2){
				dx = 12;
				sp = 1;
			}
			else{
				// ドリフトの時
				if (DriftD){
					// ドリフト右(曲りすぎ)
					dx = 32;
					sp = 2;	// 右ドリフト画像
				}
				else{
					// ドリフト左(丁度よい)
					dx = -24;
					sp = 8;	// 左ドリフト画像
				}
			}

			if (Speed) MCRPx += dx;

			if (Speed) CMCarSP(sp);	// 左後部画像に変更
		}
		else{
			// 直線
			IsDrift = 0;	// ドリフト終了
			CMCarSP(0);	// 後部画像に変更
		}
	}

	// カーブ時に受けるＧの処理
	if ((G > 0 && 0 < MCRPx) || (G < 0 && MCRPx < 304))
		MCRPx -= G * Speed * Speed / 2300;

	// コース外処理（一番下の道路ライン幅414）
	if (MCarP[0] < RLPx[30] || RLPx[30] + 318 < MCarP[0]){
		// 急減速
		if (Speed >= 35) Speed -= 35;
		else Speed = 0;

		IsDrift = 0;	// ドリフト終了
	}
	
	/////////////////////////////////////////////////////////
	// 衝突判定
	if (!IsSpn){
		// 一般車と自車
		for (i = 0; i < 3; i++){
			if (NCSPN[i] != 9){
				if (NCSPZ[i] > 25){
					if (MCarP[0] < NCSPX[i] + 90){
						if (NCSPX[i] < MCarP[0] + 40){
							// 当たり（スピン）
							if (ON_KEY[0] && !ON_KEY[1]) IsSpn = -1;	// 左スピン
							else IsSpn = 1;	// 右スピン

							Cnt = 0;
						}
					}
				}
			}
		}

		if (!IsSpn){
			// アンドレスと自車
			if (IsACar){
				if (ACSPZ > 27){
					if (MCarP[0] < ACSPX + 90){
						if (ACSPX < MCarP[0] + 40){
							// 当たり（スピン）
							if (ON_KEY[0] && !ON_KEY[1]) IsSpn = -1;	// 左スピン
							else IsSpn = 1;	// 右スピン

							Cnt = 0;
						}
					}
				}
			}
		}
	}

	// 走行距離処理
	Dist += Speed / PlwI;
}

// 自車の画像変更
function CMCarSP(sp)
{
	MCarSP[MSPN].visibility = "hidden";
	MCarSP[sp].visibility = "visible";
	
	MSPN = sp;	// 画像番号を保存
}

//////////////////////////////////////////////////////////////
// アニメーション関数群

// アニメーション関数
function FAnim(wh_anim)
{
	switch (wh_anim){
	case 1:	// カウントダウンアニメ
		CDAnim();
		break;
	case 2:	// ゴールアニメ１（ハイロ勝ち）
		G1Anim();
		break;
	case 3:	// ゴールアニメ２（ハイロ負け）
		G2Anim();
		break;
	}
}

// カウントダウンアニメ
function CDAnim()
{
	if (!Cnt){
		CntDSP.visibility = "visible";		// カウント表示
		ACarSP[0].visibility = "hidden";	// 後部画像非表示
		MCarSP[0].visibility = "hidden";	// ハイロ後部画像非表示
		MCarSP[10].visibility = "visible";	// ハイロ画像表示
		mcad_p = 1;
	}
	
	// ハイロ車内
	if (!(Cnt % 7) && mcad_p < 8){
		MCarSP[MCAData[mcad_p - 1]].visibility = "hidden";	// 前回画像非表示
		MCarSP[MCAData[mcad_p]].visibility = "visible";		// 画像表示
		mcad_p++;
	}
	
	// ルーシー
	switch (LuWData[Cnt]){
	case 0:	// 消去
		LuSP[pvL].visibility = "hidden";	// 前回画像を非表示
		break;
	case 1:	// 左に歩く
		WTTL();
		break;
	case 2:	// 手前に歩く
		WTTS();
		break;
	case 3:	// 奥に歩く
		WTOS();
		break;
	}

	LUCY_SP.left = LuP[0];
	LUCY_SP.top = LuP[1];

	// アンドレスアニメ(手を動かす)
	if (!(Cnt % 10)){
		ACarSP[3].visibility = "hidden";	// 手を上げている画像非表示
		ACarSP[1].visibility = "visible";	// 手を出している画像表示
	}
	else if (!((Cnt + 2) % 10)){
		ACarSP[1].visibility = "hidden";	// 手を出している画像非表示
		ACarSP[3].visibility = "visible";	// 手を上げている画像表示
	}
	
	// カウントダウン
	cd = 3 - Math.floor(Cnt / 16);
	if (cd > 0){
		CNTD_SP.innerText = cd;
		Cnt++;	// カウント増加
	}
	else{
		// アニメ終了
		LuP[0] = 233; LuP[1] = 240;	// ルーシーの座標
		LuS[0] = 16; LuS[1] = 48;	// ルーシーのサイズ
		ACarSP[1].visibility = "hidden";	// 手を出している画像非表示
		ACarSP[3].visibility = "hidden";	// 手を上げている画像非表示
		ACarSP[0].visibility = "visible";	// アンドレス後部画像表示
		CntDSP.visibility = "hidden";		// カウント非表示
		Cnt = 0;		// カウントリセット
		WhAnim = 0;	// アニメ終了
		WhMess = 1;	// GOメッセージ表示
		MessC = 20;	// メッセージカウント
		MessSP.innerText = "GO";
		MessSP.style.left = MessOx;
		MessSP.style.visibility = "visible";	// GO!メッセージ表示
		
		IsStart = 1;	// スタートフラグセット
		ACSPD = RLDis[32] + 1;
	}
}

// Walk to this side（手前に歩く）
function WTTS()
{
	ds = 1.025;	// 拡大率
	sp = 0.5;	// 歩行スピード
	MaxC = 1;	// 歩行アニメ切替え間隔
	
	// 画像サイズ確定
	LuS[0] *= ds; LuS[1] *= ds;
	
	// 画像サイズを元に移動量決定
	k = LuS[0] / 32;
	LuP[1] += sp * k;
	
	for (i = 0; i < 16; i++){
		LuSP[i].width = LuS[0];
		LuSP[i].height = LuS[1];
	}
	
	// 歩行アニメ
	LStC++;	// 歩行カウント増加
	
	if (MaxC <= LStC){
		LuSP[pvL].visibility = "hidden";	// 前回画像を非表示
		if (8 <= pvL && pvL < 11) pvL++;
		else pvL = 8;
		LuSP[pvL].visibility = "visible";	// 新しい画像を表示
		
		LStC = 0;	// 歩行カウントリセット
	}
}

// Walk to other side（向こう側へ歩く）
function WTOS()
{
	ds = 1.025;	// 縮小率 
	sp = 0.5;		// 歩行スピード
	MaxC = 1;	// 歩行アニメ切替え間隔
	
	// 画像サイズ確定
	LuS[0] /= ds; LuS[1] /= ds;
	
	// 画像サイズを元に移動量決定
	k = LuS[0] / 32;
	LuP[1] -= sp * k;
	
	for (i = 0; i < 16; i++){
		LuSP[i].width = LuS[0];
		LuSP[i].height = LuS[1];
	}
	
	// 歩行アニメ
	LStC++;	// 歩行カウント増加
	
	if (MaxC <= LStC){
		LuSP[pvL].visibility = "hidden";	// 前回画像を非表示
		if (12 <= pvL && pvL < 15) pvL++;
		else pvL = 12;
		LuSP[pvL].visibility = "visible";	// 新しい画像を表示
		
		LStC = 0;	// 歩行カウントリセット
	}
}

// Walk to the left（左へ歩く）
function WTTL()
{
	sp = 1.25;		// 歩行スピード決定
	MaxC = 3;	// 歩行アニメ切替え間隔

	// 画像サイズを元に移動量決定
	k = LuS[0] / 8;
	LuP[0] -= sp * k;		// 左移動
	
	// 歩行アニメ
	LStC++;	// 歩行カウント増加
	
	if (MaxC <= LStC){
		LuSP[pvL].visibility = "hidden";	// 前回画像を非表示
		if (pvL < 3) pvL++;
		else pvL = 0;
		LuSP[pvL].visibility = "visible";	// 新しい画像を表示
		
		LStC = 0;	// 歩行カウントリセット
	}
}

// ゴールアニメ１（ハイロ勝ち）
function G1Anim()
{
	// 画像消去及びアンドレス画像チェンジ
	if (!Cnt){
		ACarSP[0].visibility = "hidden";	// アンドレス車後部非表示
		ACarSP[2].visibility = "visible";	// アンドレスがっかりしている画像表示
	}

	if (!(Cnt % 4)){
		// ハイロ車内アニメ
		if (G1ACnt < 3) CMCarSP(G1AData[G1ACnt]);	// 画像チェンジ
		else if (3 <= G1ACnt) hst = 1;	// ハートアニメフラグセット
		
		G1ACnt++;	// カウント増加
	}
	
	// ハートアニメ
	if (hst){
		for (i = 0; i < 3; i++){
			if (Cnt == HaAppC[i]){
				HartSP[i].visibility = "visible";	// ハート表示
				IsHaApp[i] = 1;	// 出現フラグセット
			}
	
			if (IsHaApp[i]){
				// ハート移動
				if (HaPy[i] > HaPyMax[i]){
					HaPx[i] += HaDx[i];
					HaPy[i] += HaDy[i];
				}
				else{
					// ハート座標リセット
					HaPx[i] = 205;
					HaPy[i] = 245;
				}
		
				HartSP[i].left = HaPx[i];
				HartSP[i].top = HaPy[i];
			}
		}
	}
	
	if (Cnt < 50) Cnt++;	// カウント増加
	else{
		// アニメ終了
		CMCarSP(0);	// ハイロ後部画像表示
		for (i = 0; i < 3; i++){
			HartSP[i].visibility = "hidden";	// ハート画像非表示
			IsHaApp[i] = 0;	// ハート出現フラグリセット
		}
		ACarSP[2].visibility = "hidden";		// アンドレスがっかりしている画像非表示
		ACarSP[0].visibility = "visible";		// アンドレス後部画像表示
		HaPx[0] = HaPx[1] = HaPx[2] = 205;	// ハートX座標
		HaPy[0] = HaPy[1] = HaPy[2] = 245;	// ハートY座標
		G1ACnt = 0;	// ゴールアニメフラグ
		hst = 0;		// ハートアニメフラグ
		WhAnim = 0;	// アニメフラグリセット
		Cnt = 0;	// カウントリセット
		
		IsEndA = 1;	// アニメ終了フラグセット
	}
}

// ゴールアニメ２（ハイロ負け）
function G2Anim()
{
	if (!Cnt){
		ACarSP[0].visibility = "hidden";	// アンドレス車後部画像非表示
		ACarSP[3].visibility = "visible";	// 喜んでいる画像表示
	}
	
	if (Cnt < 20) Cnt++;
	else{
		// アニメ終了
		ACarSP[3].visibility = "hidden";	// 喜んでいる画像非表示
		ACarSP[0].visibility = "visible";	// アンドレス車後部画像表示
		WhAnim = 0;	// アニメフラグリセット
		Cnt = 0;		// カウントリセット
		
		IsEndA = 1;	// アニメ終了フラグセット
	}
}

// -->

