/****************************************************************************
 *	sphit
 ****************************************************************************/

/* スプライト同士のピクセル単位の当たり判定を行います。
 * [in]
 *	(x1,y1),pno1	スプライト1の座標とパターン番号
 *	(x2,y2),pno2	スプライト2の座標とパターン番号
 * [out]
 *	戻り値		当たりなら1、外れなら0を返します。
 * [note]
 *	* 当たり判定は、スプライトパターンのマスク成分だけを使って行います。
 *	  両方のスプライトパターンのマスク成分が1ピクセルでも重なっていれば、
 *	  当たりと見なします。
 */
int
sphit(int x1, int y1, int pno1, int x2, int y2, int pno2)
{
	extern unsigned char PAT[];

	int i;
	unsigned char *p1, *p2;
	unsigned short mask1, mask2;

	/* 大まかな判定。 */
	if(x1 + 8 - 1 < x2) return 0; /* スプライト1がスプライト2より左 */
	if(y1 + 8 - 1 < y2) return 0; /* スプライト1がスプライト2より上 */
	if(x2 + 8 - 1 < x1) return 0; /* スプライト1がスプライト2より右 */
	if(y2 + 8 - 1 < y1) return 0; /* スプライト1がスプライト2より下 */

	/* スプライトパターンアドレスを計算。 */
	p1 = &PAT[(pno1 & 0xff/*念のため*/) * 8 * 3/*bit1,bit0,mask*/];
	p2 = &PAT[(pno2 & 0xff/*念のため*/) * 8 * 3/*bit1,bit0,mask*/];

	/* 各ラインでのピクセル単位の当たり判定。 */
	if(y1 <= y2) {
		i = y2 - y1;
		p1 += i * 3;
	} else {
		i = y1 - y2;
		p2 += i * 3;
	}
	if(x1 <= x2) {
		x2 -= x1;
		      x1 = 0;
	} else {
		x1 -= x2;
		      x2 = 0;
	}
	do {
		/* 注意：スプライトデータは0:不透明/1:透明 */
		mask1 = (p1[2/*mask*/] ^ 0xff) << x1;
		mask2 = (p2[2/*mask*/] ^ 0xff) << x2;
		if(mask1 & mask2) return 1;
		p1 += 3;
		p2 += 3;
	} while(++i < 8);

	return 0;
}
