<!--
//////////////////////////////////////////////////////////////
// 「JS RACING」	(C)1999 Masahiko.Nitanda
// サブモジュール

/////////////////////////////////////////////////////////////////////////////////
// 謝辞
// 「JS RACING」は「ArtRun」を参考にしました。
// 作者の森山氏(http://plaza.harmonix.ne.jp/~jimmeans/)には、とても感謝しています。


//////////////////////////////////////////////////////////////
// CommonRAM

Cnt = 0;		// カウント
CData = new Array(10000);	// コースデータ
ON = 1; OFF = 0;	// 定数
// キー配列(0:左、1:右、2:上、3:下、4:Zキー、5:Xキー)
ON_KEY = new Array(OFF, OFF, OFF, OFF, OFF, OFF);

//////////////////////////////////////////////////////////////
// インプリメンテーション

// imgタグを生成する(id:ID, z:Zｲﾝﾃﾞｯｸｽ, x:X座標, y:Y座標, w:画像幅, h:画像高さ, gn:画像名)
function WImgTAG(id, z, x, y, w, h, gn)
{
	document.write("<img ID='" + id + "' style='position:absolute;left:" + x + ";top:"
		+ y + ";width:" + w + ";height:" + h + ";visibility:hidden' src='" + gn + "'>");
}

// imgタグを生成する(id:ID, gn:画像名)
function WImgTAG2(id, gn)
{
	document.write("<img ID='" + id
		+ "' style='position:absolute;visibility:hidden' src='" + gn + "'>");
}

// 一定距離ごとにラインを非表示する
function MRoad()
{
	/////////////////////////////////////////////////////////////////
	// カーブ処理

	// カーブラインは、道路ラインを下から順番にずらして表示させてい
	// くことで表現する。例えば右カーブの場合、一つ上の道路ラインが
	// 一つ下の道路ラインよりも右に表示されるようにするとよい。
	// 又、カーブは曲線なので、遠くの道路ラインは手前の道路ラインよ
	// りも大きく曲がっていなければならない。コースデータにiをかけて
	// いるのはそれを表現するためである。

	dx = new Array(33);
	k = 0; ulx = 0;
	for (i = 0; i < 33; i++){
		j = 32 - i;
		k = CData[Math.floor((Dist + RLDis[j]) * 3)];
		if (i == 0) G = k;	// Ｇの保存
		ulx += k * i;
		dx[j] = ulx;
	}

	pos = (185 - MCRPx) * 0.05;	// 道路ポジション
	for (i = 0; i < 33; i++){
		// カーブ
		x = RLCx[i] + dx[i];
		RLPx[i] = x + (G * Speed) + (pos * i);
		RLSP[i].left = RLSP[i + 33].left = RLPx[i];
		
		// スクロール
		if (((Dist + RLDis[i]) % 10) < 5){
			// ラインなし
			RLSP[i + 33].visibility = "hidden";
			RLSP[i].visibility = "visible";
		}
		else{
			// ラインあり
			RLSP[i].visibility = "hidden";
			RLSP[i + 33].visibility = "visible";
		}
	}
}

// コースデータ初期化関数
function initCData()
{
	// とりあえずすべて直線
	for (i = 0; i < 10000; i++) CData[i] = 0;

	// カーブデータをセット
	midL(600, 100);
	softL(900, 100);
	midR(1500, 300);
	softL(1900, 300);
	midR(2300, 100);
	hardR(2900, 250);
	hardL(3200, 100);
	softL(3500, 300);
	softR(4000, 200);
	midL(4500, 150);
	hardR(4800, 300);
	softR(5300, 100);
	softL(5500, 200);
	midL(5800, 100);
	midR(6100, 300);
	hardL(6500, 200);
	softR(6900, 300);
	softL(7300, 200);
	hardR(7600, 150);
	midL(7900, 200);
	softL(8300, 300);
	midR(8600, 150);
}

///////////////////////////////////////////////////////////////
// コースデータセット関数群(参考：「ArtRun」森山氏)

// 左急カーブ
function hardL(p, len)
{
	for (i = p; i < p + 10; i++) CData[i] = -0.1;
	for (i = p + 10; i < p + 20; i++) CData[i] = -0.3;
	for (i = p + 20; i < p + 20 + len; i++) CData[i] = -0.5;
	for (i = p + 20 + len; i < p + 30 + len; i++) CData[i] = -0.3;
	for (i = p + 30 + len; i < p + 40 + len; i++) CData[i] = -0.1;
}

// 右急カーブ
function hardR(p, len)
{
	for (i = p; i < p + 10; i++) CData[i] = 0.1;
	for (i = p + 10; i < p + 20; i++) CData[i] = 0.3;
	for (i = p + 20; i < p + 20 + len; i++) CData[i] = 0.5;
	for (i = p + 20 + len; i < p + 30 + len; i++) CData[i] = 0.3;
	for (i = p + 30 + len; i < p + 40 + len; i++) CData[i] = 0.1;
}

// 左中カーブ
function midL(p, len)
{
	for (i = p; i < p + 10; i++) CData[i] = -0.1;
	for (i = p + 10; i < p + 10 + len; i++) CData[i] = -0.3;
	for (i = p + 10 + len; i < p + 20 + len; i++) CData[i] = -0.1;
}

// 右中カーブ
function midR(p, len)
{
	for (i = p; i < p + 10; i++) CData[i] = 0.1;
	for (i = p + 10; i < p + 10 + len; i++) CData[i] = 0.3;
	for (i = p + 10 + len; i < p + 20 + len; i++) CData[i] = 0.1;
}

// 左緩カーブ
function softL(p, len)
{
	for (i = p; i < p + len; i++) CData[i] = -0.1;
}

// 右緩カーブ
function softR(p, len)
{
	for (i = p; i < p + len; i++) CData[i] = 0.1;
}

/////////////////////////////////////////////////////////////////

function KeyDown(kcode)
{
	switch(window.event.keyCode)
	{
	case 100: case 37:	// 4：左
		ON_KEY[0] = ON;
		break;
	case 102: case 39:	// 6：右
		ON_KEY[1] = ON;
		break;
	case 104: case 38:	// 8:上
		ON_KEY[2] = ON;
		break;
	case 98: case 40:	// 2:下
		ON_KEY[3] = ON;
		break;
	case 90:		// Z：アクセル
		ON_KEY[4] = ON;
		break;
	case 88:		// X：ブレーキ
		ON_KEY[5] = ON;
		break;
	}
}

function KeyUp(kcode)
{
	switch(window.event.keyCode)
	{
	case 100: case 37:	// 4：左
		ON_KEY[0] = OFF;
		break;
	case 102: case 39:	// 6：右
		ON_KEY[1] = OFF;
		break;
	case 104: case 38:	// 8:上
		ON_KEY[2] = OFF;
		break;
	case 98: case 40:	// 2:下
		ON_KEY[3] = OFF;
		break;
	case 90:		// Z：アクセル
		ON_KEY[4] = OFF;
		break;
	case 88:		// X：ブレーキ
		ON_KEY[5] = OFF;
		break;
	}
}

// プレイデータ初期化
function initPlRAM()
{
	Cnt = 0;			// カウンタ
	IsStart = 0;	// スタートフラグ
	IsTOv = 0;		// タイムオーバーフラグ
	Dist = 0;		// 走行距離
	G = 0;			// カーブ時のＧ
	Time = 0;		// 経過時間(s)
	Speed = 0;		// ハイロ車スピード
	MSPN = 0;		// 自車の表示画像番号(画像非表示用)
	MCRPx = 218;	// ハイロ車相対X座標
	IsDrift = 0;	// ドリフトフラグ(1:ドリフト可能状態 ,2:ドリフト中)
	DriftD = 0;		// ドリフト方向(0:左, 1:右)
	IsSpn = 0;		// スピンフラグ(0:なし, 1:右スピン, -1:左スピン)
	SpnN = 0;		// スピンスプライト番号

	CNum = 0;				// コース番号
	IsGoal = 0;				// ゴールフラグ(0:なし, 1:ハイロ勝ち, 2:ハイロ負け)
	SkyX = 0;				// 空X座標
	for (i = 0; i < 5; i++) WhSG[i] = i * 2;	// 表示道路脇画像番号(-1は空)
	SGNum = 0;		// 道路脇画像表示番号
	IsSGNUp = 1;	// 道路脇画像表示番号増加フラグ
	for (i = 0; i < 5; i++) SGP[i] = 20 + 20 * i;	// 道路脇画像表示位置
	LSGP = 100;		// 最新道路脇画像の表示位置
	SGSPP = 8;		// スプライト番号

	// 一般車データ
	for (i = 0; i < 3; i++) NCSPN[i] = 9;	// 車表示スプライト番号(9:空)
	for (i = 0; i < 3; i++) NCSPD[i] = 0;	// 走行距離
	NCLDis = 0;					// 最遠一般車の走行距離

	// アンドレス車データ
	ACSpd = ACSpMid;	// 走行速度
	ACSPPx = 1;		// X軸位置(車線番号)
	ACSPX = 0;		// X座標(当たり判定用)
	ACSPD = 0;		// 走行距離
	ACSPZ = 0;		// Ｚインデックス
	IsACar = 1;		// 存在フラグ
	ACSDx = 0;		// X軸移動量
	IsAGoal = 0;	// ゴールフラグ

	// アニメーション用
	mcad_p = 1;	// ハイロ車内アニメ用ポインタ

	// ルーシーアニメデータ(0:消去、1:左に歩く、2:手前に歩く、3:奥に歩く)
	WhMess = 0;					// メッセージ表示
	LuP[0] = 233; LuP[1] = 240;	// ルーシーの座標
	LuS[0] = 16; LuS[1] = 48;	// ルーシーのサイズ
	LStC = 0; // 歩行カウント
	// visLu配列の添字＜0〜3:下（手前）移動、4〜7:上（奥）移動、8〜11:左移動、12〜15:右移動＞
	pvL = 0;
	MaxC = 2;	// 歩行アニメ切替え間隔
	for (i = 0; i < 3; i++) HaPx[i] = 205;	// ハートX座標
	for (i = 0; i < 3; i++) HaPy[i] = 245;	// ハートY座標
	for (i = 0; i < 3; i++) IsHaApp[i] = 0;		// ハート出現フラグ
	G1ACnt = 0;	// ゴールアニメ1用カウント
	hst = 0;	// ハートアニメフラグ
	IsEndA = 0;	// アニメ終了フラグ
	
	////////////////////////////////////////////////////
	// スプライト初期化
	SkySP[0].left = SkyX;
	SkySP[1].left = SkyX - 800;
	
	// アンドレススプライト
	for (j = 0; j < 4; j++){
		ACarSP[j].width = 96;
		ACarSP[j].height = 48;
	}
	ACarSP[4].left = 60;
	ACarSP[4].top = 245;
	ACarSP[4].zIndex = 33;
	
	// パラメータ表示
	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)";
	}
	
	WSp[0].background = CCol[CNum];	// 背景色
}

// -->

