/* This module sets up a few initial board positions */
/* It may be extended at some stage to allow an      */
/* interactive board setup.			     */

#include "tsume.h"
#include "tsumedat.h"

setup_file ()
{
/* now if only I could read a position from a file */
}

setup_interactive ()
{
/*	in_a_hand = 0;
	
	scanf ( data, "%d %d %s", new_x, new_y, bit );
	if ( new_x > 9 || new_y > 9 || new_x < 0 || new_y < 0 )
	{	printf ( "Invalid coordinates ( %d-%d )- try again\n",
			new_x, new_y );
		continue;
	if ( new_x == 0 && new_y == 0 )
	if ( new_x > 9 || new_y > 9 || new_x < 1 || new_y < 1 )
	{
*/		printf ( "Pieces for attackers hand must be at 0-0\n");
/*		continue;
	};
 */
}


/* This is a simple problem. i.e. mate in five, 5.36 Cpu Secs to solve */
setup_s0 ( init_s )
I_STATE	init_s;
{	init_s->board[ 1 + 9 * 5 ] = DEF_KING;
	king_x_pos = 1;
	king_y_pos = 5;

	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 1 + 9 * 7 ] = DEF_PAWN;
	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 2 + 9 * 6 ] = ATT_PAWN;

	dropping ( init_s->def_h, DEF_HORSE );
	init_s->board[ 1 + 9 * 2 ] = DEF_HORSE;

	dropping ( init_s->def_h, DEF_BISHOP );
	init_s->board[ 4 + 9 * 2 ] = ATT_BISHOP;

	dropping ( init_s->def_h, DEF_ROOK );
	init_s->board[ 3 + 9 * 3 ] = ATT_P_ROOK;
}


/* This is difficult. 1 hour 8600 cpu does not find the solution */
/* Solution requires 17 moves and a drop by the defense as the fourth move */
setup_s1 ( init_s )
I_STATE	init_s;
{	init_s->board[ 2 + 9 * 2 ] = DEF_KING;
	king_x_pos = 2;
	king_y_pos = 2;

	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 1 + 9 * 3 ] = DEF_PAWN;
	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 4 + 9 * 2 ] = DEF_PAWN;
	dropping ( init_s->def_h, DEF_PAWN );
	init_s->att_h[0] = ATT_PAWN;

	dropping ( init_s->def_h, DEF_HORSE );
	init_s->board[ 2 + 9 * 4 ] = DEF_HORSE;
	dropping ( init_s->def_h, DEF_HORSE );
	init_s->board[ 4 + 9 * 4 ] = ATT_HORSE;

	dropping ( init_s->def_h, DEF_BISHOP );
	init_s->board[ 4 + 9 * 3 ] = ATT_BISHOP;

	dropping ( init_s->def_h, DEF_SILVER );
	init_s->board[ 2 + 9 * 1 ] = ATT_SILVER;

	dropping ( init_s->def_h, DEF_GOLD );
	init_s->board[ 3 + 9 * 5 ] = ATT_GOLD;
}


/* This is a 7 move problem. 8600 cpu = 33:25.86 !!! */
setup_s2 ( init_s )
I_STATE	init_s;
{	init_s->board[ 2 + 9 * 1 ] = DEF_KING;
	king_x_pos = 2;
	king_y_pos = 1;

	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 1 + 9 * 3 ] = DEF_PAWN;
	dropping ( init_s->def_h, DEF_PAWN );
	init_s->board[ 3 + 9 * 3 ] = DEF_PAWN;

	dropping ( init_s->def_h, DEF_LANCE );
	init_s->board[ 2 + 9 * 4 ] = ATT_LANCE;
	dropping ( init_s->def_h, DEF_LANCE );
	init_s->board[ 4 + 9 * 3 ] = ATT_LANCE;

	dropping ( init_s->def_h, DEF_SILVER );
	init_s->att_h[0] = ATT_SILVER;

	dropping ( init_s->def_h, DEF_BISHOP );
	init_s->board[ 2 + 9 * 3 ] = ATT_BISHOP;
	dropping ( init_s->def_h, DEF_BISHOP );
	init_s->board[ 1 + 9 * 1 ] = DEF_P_BISHOP;

	dropping ( init_s->def_h, DEF_ROOK );
	init_s->board[ 3 + 9 * 5 ] = DEF_P_ROOK;
}


/***	The following problems were all taken from the same book
/***	as those above. They have not been timed. ***/
setup_v ( init_s, num )
I_STATE	init_s;
int num;
{
	switch ( num )
	{
	case 1:
/* 3 move */
		init_s->board[ 2 + 9 * 4 ] = DEF_KING;
		king_x_pos = 2;
		king_y_pos = 4;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 2 + 9 * 6 ] = DEF_TOKIN;
		dropping ( init_s->def_h, DEF_SILVER );
		init_s->board[ 2 + 9 * 5 ] = DEF_SILVER;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 4 + 9 * 1 ] = DEF_GOLD;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 1 + 9 * 3 ] = ATT_ROOK;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 3 + 9 * 3 ] = ATT_ROOK;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 4 + 9 * 2 ] = ATT_BISHOP;
		break;

	case 2:
/* 5 move */
		init_s->board[ 1 + 9 * 3 ] = DEF_KING;
		king_x_pos = 1;
		king_y_pos = 3;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 1 + 9 * 5 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 2 + 9 * 5 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 4 + 9 * 4 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_LANCE );
		init_s->board[ 4 + 9 * 2 ] = DEF_LANCE;
		dropping ( init_s->def_h, DEF_SILVER );
		init_s->board[ 2 + 9 * 3 ] = ATT_SILVER;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 5 + 9 * 3 ] = ATT_ROOK;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 4 + 9 * 5 ] = ATT_BISHOP;
		break;

	case 3:
/* 7 moves */
		init_s->board[ 2 + 9 * 2 ] = DEF_KING;
		king_x_pos = 2;
		king_y_pos = 2;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 3 + 9 * 5 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 6 + 9 * 1 ] = ATT_TOKIN;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->board[ 2 + 9 * 1 ] = DEF_HORSE;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->board[ 1 + 9 * 5 ] = ATT_HORSE;
		dropping ( init_s->def_h, DEF_SILVER );
		init_s->board[ 3 + 9 * 4 ] = ATT_SILVER;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 1 + 9 * 1 ] = DEF_BISHOP;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->att_h[0] = ATT_ROOK;
		break;

	case 4:
/* 9 moves */
		init_s->board[ 2 + 9 * 3 ] = DEF_KING;
		king_x_pos = 2;
		king_y_pos = 3;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 4 + 9 * 3 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 3 + 9 * 4 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 2 + 9 * 6 ] = ATT_PAWN;
		dropping ( init_s->def_h, DEF_SILVER );
		init_s->board[ 2 + 9 * 2 ] = ATT_SILVER;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 4 + 9 * 4 ] = DEF_GOLD;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 3 + 9 * 6 ] = ATT_GOLD;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 1 + 9 * 5 ] = ATT_ROOK;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 3 + 9 * 5 ] = ATT_BISHOP;
		break;

	case 5:
/* 11 moves */
		init_s->board[ 1 + 9 * 1 ] = DEF_KING;
		king_x_pos = 1;
		king_y_pos = 1;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 1 + 9 * 5 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 2 + 9 * 3 ] = ATT_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 4 + 9 * 1 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->board[ 2 + 9 * 4 ] = ATT_HORSE;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 1 + 9 * 4 ] = DEF_GOLD;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 3 + 9 * 5 ] = ATT_GOLD;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 4 + 9 * 4 ] = ATT_ROOK;
		break;

	case 6:
/* 11 moves */
		init_s->board[ 2 + 9 * 2 ] = DEF_KING;
		king_x_pos = 2;
		king_y_pos = 2;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 3 + 9 * 2 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 1 + 9 * 5 ] = ATT_PAWN;
		dropping ( init_s->def_h, DEF_LANCE );
		init_s->board[ 1 + 9 * 1 ] = DEF_LANCE;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 3 + 9 * 3 ] = DEF_GOLD;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 2 + 9 * 5 ] = ATT_GOLD;
		dropping ( init_s->def_h, DEF_ROOK );
		init_s->board[ 4 + 9 * 4 ] = ATT_P_ROOK;
		dropping ( init_s->def_h, DEF_LANCE );
		init_s->att_h[0] = ATT_LANCE;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->att_h[1] = ATT_HORSE;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->att_h[2] = ATT_BISHOP;
		break;

	case 7:
/* 13 moves */
		init_s->board[ 2 + 9 * 2 ] = DEF_KING;
		king_x_pos = 2;
		king_y_pos = 2;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 1 + 9 * 1 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 2 + 9 * 1 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 4 + 9 * 4 ] = DEF_PAWN;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 3 + 9 * 3 ] = ATT_PAWN;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->board[ 3 + 9 * 1 ] = DEF_HORSE;
		dropping ( init_s->def_h, DEF_SILVER );
		init_s->board[ 1 + 9 * 4 ] = ATT_SILVER;
		dropping ( init_s->def_h, DEF_GOLD );
		init_s->board[ 4 + 9 * 3 ] = ATT_GOLD;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 4 + 9 * 1 ] = ATT_BISHOP;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 5 + 9 * 4 ] = ATT_BISHOP;
		break;

	default:
/* 15 moves */
		init_s->board[ 1 + 9 * 2 ] = DEF_KING;
		king_x_pos = 1;
		king_y_pos = 2;
		dropping ( init_s->def_h, DEF_PAWN );
		init_s->board[ 3 + 9 * 4 ] = ATT_PAWN;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->board[ 2 + 9 * 4 ] = ATT_HORSE;
		dropping ( init_s->def_h, DEF_BISHOP );
		init_s->board[ 4 + 9 * 5 ] = ATT_P_BISHOP;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->att_h[0] = ATT_HORSE;
		dropping ( init_s->def_h, DEF_HORSE );
		init_s->att_h[1] = ATT_HORSE;
		break;
	}
}


/* This is the monster that I wrote the program to solve for me. All   */
/* of the pieces are on the board and the solution requires 113 moves. */
/* The final position has only 4 or 5 pieces on the board.	       */
setup_big ( init_s )
I_STATE	init_s;
{	int	i;

	for ( i = 0; i < 40; init_s->def_h[i++] = NULL );

	init_s->board[ 9 + 9 * 1 ] = DEF_KING;
	king_x_pos = 9;
	king_y_pos = 1;

	init_s->board[ 1 + 9 * 3 ] = ATT_PAWN;
	init_s->board[ 7 + 9 * 4 ] = ATT_PAWN;
	init_s->board[ 8 + 9 * 4 ] = DEF_PAWN;
	init_s->board[ 4 + 9 * 5 ] = ATT_PAWN;
	init_s->board[ 8 + 9 * 5 ] = ATT_PAWN;
	init_s->board[ 9 + 9 * 7 ] = ATT_PAWN;
	init_s->board[ 5 + 9 * 8 ] = ATT_PAWN;
	init_s->board[ 7 + 9 * 1 ] = ATT_TOKIN;
	init_s->board[ 6 + 9 * 2 ] = ATT_TOKIN;
	init_s->board[ 3 + 9 * 3 ] = ATT_TOKIN;
	init_s->board[ 4 + 9 * 3 ] = ATT_TOKIN;
	init_s->board[ 6 + 9 * 4 ] = ATT_TOKIN;
	init_s->board[ 3 + 9 * 5 ] = DEF_TOKIN;
	init_s->board[ 5 + 9 * 5 ] = ATT_TOKIN;
	init_s->board[ 1 + 9 * 6 ] = ATT_TOKIN;
	init_s->board[ 3 + 9 * 6 ] = ATT_TOKIN;
	init_s->board[ 6 + 9 * 6 ] = DEF_TOKIN;
	init_s->board[ 4 + 9 * 7 ] = ATT_TOKIN;

	init_s->board[ 2 + 9 * 2 ] = ATT_LANCE;
	init_s->board[ 7 + 9 * 2 ] = ATT_LANCE;
	init_s->board[ 5 + 9 * 4 ] = DEF_LANCE;
	init_s->board[ 7 + 9 * 6 ] = ATT_LANCE;

	init_s->board[ 2 + 9 * 1 ] = DEF_HORSE;
	init_s->board[ 9 + 9 * 5 ] = ATT_HORSE;
	init_s->board[ 2 + 9 * 7 ] = ATT_HORSE;
	init_s->board[ 7 + 9 * 8 ] = ATT_HORSE;

	init_s->board[ 3 + 9 * 2 ] = DEF_SILVER;
	init_s->board[ 6 + 9 * 5 ] = ATT_SILVER;
	init_s->board[ 8 + 9 * 7 ] = DEF_SILVER;
	init_s->board[ 8 + 9 * 8 ] = DEF_SILVER;

	init_s->board[ 2 + 9 * 4 ] = DEF_GOLD;
	init_s->board[ 1 + 9 * 5 ] = DEF_GOLD;
	init_s->board[ 4 + 9 * 6 ] = DEF_GOLD;
	init_s->board[ 6 + 9 * 7 ] = ATT_GOLD;

	init_s->board[ 9 + 9 * 3 ] = DEF_ROOK;
	init_s->board[ 3 + 9 * 4 ] = ATT_P_ROOK;

	init_s->board[ 9 + 9 * 4 ] = ATT_P_BISHOP;
	init_s->board[ 9 + 9 * 9 ] = ATT_BISHOP;
}
