////////////////////////////////////////////////////////////////////////////
//  The功夫 for PS-BB				:	敵管理
//
//	create	2003/02/04	山森		:	
//
////////////////////////////////////////////////////////////////////////////

/************************/
/*	敵初期化 & 確保		*/
/************************/
InitEnemy()
{
	new	i, j;

	for(i=0; i<ENEMY_MAX; i++){
		eneBe[i] = 0;								//	有効ﾌﾗｸﾞ
		eneNo[i] = 0;								//	種別
		eneType[i] = 0;								//	位置種別
		eneSts[i] = 0;								//	状態
		enex[i] = eney[i] = -128.0;					//	位置
		eneWorkF0[i] = eneWorkF1[i] = 0.0;			//	ワーク
		eneWorkF2[i] = eneWorkF3[i] = 0.0;			//	ワーク
		eneWork0[i] = eneWork1[i] = 0;				//	ワーク
		eneWork2[i] = eneWork3[i] = 0;				//	ワーク

		enePat[i] = 0;								//	パターン数
		for(j=0; j<4; j++){
			eneSx[i][j] = eneSy[i][j] = 0;			//	スケール
			eneTx[i][j] = eneTy[i][j] = 0;			//	テクスチャ位置
		}
		SafeDestroy(eneObj[i]);
		eneObj[i] = CreatePlane(Disp2D());
		SetOptionI(eneObj[i], TAG("ZSRT"), ZSORT_NORMAL);
		SetOptionF(eneObj[i], TAG("ZOFS"), 9.0);
		SetColor(eneObj[i], 1.0, 1.0, 1.0, 1.0);
		Hide(eneObj[i]);
	}
}

/************************/
/*	敵開放				*/
/************************/
FreeEnemy()
{
	new	i;

	for(i=0; i<ENEMY_MAX; i++) SafeDestroy(eneObj[i]);
}

/************************/
/*	敵登録情報設定		*/
/************************/
SetEnemyEntryIfo()
{
	new	peek, poke, data;

	peek = poke = 0;	

	while(data != 9999){
		if(poke >= ENEMAP_SIZE){
			printf("Buffer over! EneMap[%d].", ENEMAP_SIZE);
			break;
		}
		EneMap[poke++] = StageData[Stage*3+Block][peek++];
		data = EneMap[poke-1];
	}
}

/************************/
/*	敵発生管理			*/
/************************/
EneGene()
{
	new	type, eno, pow;

	if(EneMap[enePeek] <= mPos){
		type = EneMap[++enePeek];
		eno =  EneMap[++enePeek];
		pow =  EneMap[++enePeek];
		enePeek++;
		EntryEnemy(eno, type, pow);
	}
}


/****************************/
/*	敵発生					*/
/*	eno:	敵番号			*/
/*	type:	出現パターン	*/
/****************************/
EntryEnemy(eno, type, pow)
{
	new	idx, i, j;

//	eno = ET_ROCK;

	for(i=0; i<ENEMY_MAX; i++){
		if(!eneBe[i]) break;						//	この敵は使用可能(未登録)?
	} 
	if(i >= ENEMY_MAX) return;						//	エントリーできない(OBJがフル使用)

	eneBe[i] = 1;									//	有効ﾌﾗｸﾞ
	eneNo[i] = eno;									//	種別
	eneHit[i] = 1;									//	当たり判定ﾌﾗｸﾞ(敵攻撃がﾌﾟﾚｲﾔｰにあたるか)
	eneType[i] = type;								//	位置種別
	eneSts[i] = 0;									//	状態
	eneWorkF0[i] = eneWorkF1[i] = 0.0;				//	ワーク
	eneWorkF2[i] = eneWorkF3[i] = 0.0;				//	ワーク
	eneWork0[i] = eneWork1[i] = 0;					//	ワーク
	eneWork2[i] = eneWork3[i] = 0;					//	ワーク
	eneDestroy[i] = 0;								//	
	eneDmgWait[i] = 0;								//	ﾀﾞﾒｰｼﾞ待ち
	enePow[i] = pow;								//	死亡後にﾊﾟﾜｰに変化?

	idx = eno * 22;
	eneAttack[i] = eneTexTbl[idx];					//	当たり判定ﾌﾗｸﾞ(ﾌﾟﾚｲﾔｰ攻撃が敵にあたるか)
	enePat[i] = eneTexTbl[idx+1];					//	パターン数
	idx += 2;

	for(j=0; j<enePat[i]; j++){
		eneSx[i][j] = eneTexTbl[idx+j*4];			//	スケール情報
		eneSy[i][j] = eneTexTbl[idx+j*4+1];
		eneTx[i][j] = eneTexTbl[idx+j*4+2];			//	テクスチャ情報
		eneTy[i][j] = eneTexTbl[idx+j*4+3];
	}

	enex[i] = 320.0;								//	位置
	eney[i] = float(eneEntryPos[eno*10+type]);		//	位置

}

/****************************/
/*	敵発生					*/
/*	eno:	敵番号			*/
/*	type:	出現パターン	*/
/****************************/
stock EntryEnemy2(eno, type, float:x, float:y, hit)
{
	new	idx, i, j;

	for(i=0; i<ENEMY_MAX; i++){
		if(!eneBe[i]) break;						//	この敵は使用可能(未登録)?
	} 
	if(i >= ENEMY_MAX) return -1;					//	エントリーできない(OBJがフル使用)

	eneBe[i] = 1;									//	有効ﾌﾗｸﾞ
	eneNo[i] = eno;									//	種別
	eneHit[i] = hit;								//	当たり判定ﾌﾗｸﾞ(敵攻撃がﾌﾟﾚｲﾔｰにあたるか)
	eneAttack[i] = 0;								//	当たり判定ﾌﾗｸﾞ(ﾌﾟﾚｲﾔｰ攻撃が敵にあたるか)
	eneType[i] = type;								//	位置種別
	eneSts[i] = ENEMY_DAMAGE;						//	状態
	eneWorkF0[i] = eneWorkF1[i] = 0.0;				//	ワーク
	eneWorkF2[i] = eneWorkF3[i] = 0.0;				//	ワーク
	eneWork0[i] = eneWork1[i] = 0;					//	ワーク
	eneWork2[i] = eneWork3[i] = 0;					//	ワーク
	eneDmgWait[i] = 0;								//	ﾀﾞﾒｰｼﾞ待ち

	idx = eno * 22;

	enePat[i] = eneTexTbl[idx+1];					//	パターン数
	idx += 2;

	for(j=0; j<enePat[i]; j++){
		eneSx[i][j] = eneTexTbl[idx+j*4];			//	スケール情報
		eneSy[i][j] = eneTexTbl[idx+j*4+1];
		eneTx[i][j] = eneTexTbl[idx+j*4+2];			//	テクスチャ情報
		eneTy[i][j] = eneTexTbl[idx+j*4+3];
	}

	enex[i] = x;									//	位置
	eney[i] = y;									//	位置

	return i;
}

/************************/
/*	敵処理				*/
/************************/
EnemyJob()
{

	new	i;

	for(i=0; i<ENEMY_MAX; i++){
		if(!eneBe[i]) continue;						//	この敵は無効(未登録)
		if(eneDmgWait[i]) eneDmgWait[i]--;			//	ﾀﾞﾒｰｼﾞ後の硬直時間?




		switch(eneNo[i]){
			case ET_WOOLONG:							eJobWoolong(i);		//	00:烏龍茶
			case ET_MAN_B, ET_MAN_G, ET_MAN_R:			eJobMan(i);			//	01:ローブ(黒) / 02:ローブ(緑) / 03:ローブ(赤)
			case ET_BEE, ET_BAT:						eJobBee(i);			//	04:虫 / 05:蝙蝠
			case ET_SNAKE:								eJobSnake(i);		//	06:蛇
			case ET_KNIFE, ET_ARROW, ET_MASA, ET_NUN:	eJobKnife(i);		//	07:ナイフ / 08:矢 / 09:鉞 / 22:ヌンチャク
			case ET_FIRE_R, ET_FIRE_B:					eJobFire(i);		//	10:火の玉(赤) / 11:火の玉(青)
			case ET_OHGI_O, ET_OHGI_W:					eJobOhgio(i);		//	12:扇子(橙) / 14:扇子(白)
			case ET_OHGI_Y:								eJobOhgiy(i);		//	13:扇子(黄)
			case ET_BALL:								eJobBall(i);		//	15:毬
			case ET_IRONBALL, ET_STONE_S:				eJobIronball(i);	//	16:鉄球 / 17:小石
			case ET_ROCK:								eJobRock(i);		//	18:岩
			case ET_STONE_L:							eJobStonel(i);		//	19:巨大岩
			case ET_STICK, ET_BON:						eJobStick(i);		//	20:小枝 / 21:盆
			case ET_STONE_S2, ET_BON2:					eJobStones2(i);		//	23:砕けた石(17:小石) / 24:砕けた盆(21:盆)
		}

		SetPos(eneObj[i], enex[i], eney[i], 0.0);	//	位置更新
	}
}

/************************/
/*	ｽｺｱ加算				*/
/************************/
EneScoreAdd(i)
{
	if(eneDestroy[i]){
		ScoreAdd(eneScoreTbl[eneNo[i]]);
	}
}


