/*
 *
 * pmove.c -- player move routines
 *
 */

#include "scrab.h"
#include "globals.h"


player_move() {
	char c;
	int xpos, ypos, done;

	xpos = BOARD_LX;
	ypos = BOARD_UY;
	for( ;; ) {
		clear_prompt();
		printw( "  Uzu la 'hjkl' klavojn por movi la tapsignon.\n" );
		printw( "  Tajpu <REIRI> je malplena kvadrato por ekmeti literojn surtabule.\n" );
		printw( "  Tajpu <SPACO> por reordigi viajn literojn.\n" );
		printw( "  Tajpu '.' por uzi vian vicon por preni novajn literojn.\n" );
		refresh();
		done = 0;
		do {
			move( ypos, xpos );
			refresh();
			c = get_key();
			switch( c ) {
			  case 'H':
				if( xpos > BOARD_LX ) xpos--;
				break;
			  case 'L':
				if( xpos < BOARD_RX ) xpos++;
				break;
			  case 'J':
				if( ypos < BOARD_LY ) ypos++;
				break;
			  case 'K':
				if( ypos > BOARD_UY ) ypos--;
				break;
			  case '\n':
				if( board[ypos - BOARD_UY + 1][xpos - BOARD_LX + 1] < 'A' )
					done = place_tiles( xpos, ypos );
				break;
			  case ' ':
				done = rearrange_tiles();
				break;
			  case '.':
				done = draw_new_tiles();
				break;
			}
		} while( done == 0 );
		if( done == 1 ) break;
	}
	if( c == '.' ) game_done++;
	else game_done = 0;
}

int place_tiles( xpos, ypos )
  int xpos, ypos;
{
	char c;
	int xinc, yinc;
	int i, j, t1, t2, ct1, ct2, tile;
	struct plrlet newlet[7];
	int placed;
	int err, xt, yt;

	clear_prompt();
	printw( "  Kiadirekte vi volus meti viajn literojn:" );
	printw( " horizontale aux\n  vertikale (h/v)? " );
	refresh();
	c = get_key();
	if( c != 'H' && c != 'V' ) return( -1 );
	if( c == 'H' ) {
		xinc = 1;
		yinc = 0;
	} else {
		xinc = 0;
		yinc = 1;
	}
	show_instructions();
	placed = 0;
	for( ;; ) {
		move( ypos, xpos );
		refresh();
		c = get_key();
		if( c == '-' || c == 127 || c == 8 ) {
			if( placed == 0 ) break;
			--placed;
			do {
				xpos -= xinc;
				ypos -= yinc;
			} while( board[ypos - BOARD_UY + 1][xpos - BOARD_LX + 1] >= 'A' );
			move( ypos, xpos );
			addch( newlet[placed].oldlet );
			plr_tiles[human_player][newlet[placed].tilepos]
			  = newlet[placed].letter;
			print_tiles();
		} else if( c == 27 ) {
			while( placed-- > 0 ) {
				do {
					xpos -= xinc;
					ypos -= yinc;
				} while( board[ypos - BOARD_UY + 1][xpos - BOARD_LX + 1] >= 'A' );
				move( ypos, xpos );
				addch( newlet[placed].oldlet );
				plr_tiles[human_player][newlet[placed].tilepos]
				  = newlet[placed].letter;
			}
			print_tiles();
			break;
		} else if( c == '\n' ) {
			if( placed == 0 ) break;
			clear_prompt();
			err = 0;
			if( board[8][8] == CH_DW ) {
				if( placed < 2 ) {
					printw( "  Je la unua movo, vi devas meti almenaux du ludilojn!\n" );
					err = 1;
				} else {
					for( i = 0; i < placed; i++ )
						if( newlet[i].x != 8 || newlet[i].y != 8 ) err++;
					if( err == placed )
						printw( "  Je la unua movo, vi devas meti ludilon sur la centra kvadrato!\n" ); 
					else err = 0;
				}
			} else {
				for( i = 0; i < placed; i++ ) {
					xt = newlet[i].x;
					yt = newlet[i].y;
					if( board[yt][xt - 1] >= 'A' || board[yt][xt + 1] >= 'A'
					  || board[yt - 1][xt] >= 'A' || board[yt + 1][xt] >= 'A' )
						break;
				}
				if( i == placed ) {
					printw( "  Vi devas almeti je parto de la ekzistanta ludilaro!\n" );
					err = 1;
				}
			}
			if( err == 0 ) {
				clear_prompt();
				for( tile = 0, t1 = -1, t2 = -1, i = 0; i < placed; i++ )
					if( newlet[i].letter == CH_BL ) {
						tile++;
						if( t1 == -1 ) {
							t1 = i;
							ct1 = newlet[i].blankchar;
						} else if( t2 == -1 ) {
							t2 = i;
							ct2 = newlet[i].blankchar;
						}
					}
				for( i = 0, xt = 2; i < tile; i++ ) {
					if( i == 0 ) j = t1;
					else if( i == 1 ) j = t2;
					if( newlet[j].blankchar == CH_BL ) {
						clear_rect( 20, 0, 20, 79 );
						printw( "  Kiu litero vi volas ke la " );
						if( tile == 2 && i == 0 ) printw( "unua " );
						else if( tile == 2 ) printw( "dua " );
						printw( "senlitero estu? " );
						refresh();
						do {
							c = get_key();
						} while( c < 'A' || c > '\\' );
						newlet[j].blankchar = c;
					}
					move( 22, xt );
					if( tile == 2 && i == 0 ) printw( "Unua s" );
					else if( tile == 2 ) printw( "Dua s" );
					else printw( "S" );
					printw( "enlitero estas " );
					if( index( "AEFHILMNORSX", newlet[j].blankchar ) != 0 ) {
						printw( "n" );
						xt++;
					}
					printw( " %c.", newlet[j].blankchar );
					xt += 28;
				}
				clear_rect( 20, 0, 20, 79 );
				printw( "  Tajpu <REIRI> por fini vian vicon.  alikaze, pusxu 'n'. -> " );
				refresh();
				do {
					c = getch();
				} while( c != '\n' && c != 'N' && c != 'n' );
				if( c == '\n' ) break;
				if( t1 != -1 ) newlet[t1].blankchar = ct1;
				if( t2 != -1 ) newlet[t2].blankchar = ct2;
			} else press_return();
			show_instructions();
		} else {
			if( xpos > BOARD_RX || ypos > BOARD_LY ) continue;
			tile = -1;
			for( i = 0; i < 7; i++ ) {
				if( c == plr_tiles[human_player][i] ) tile = i;
				else if( plr_tiles[human_player][i] == CH_BL && tile == -1 )
					tile = i;
			}
			if( tile == -1 ) continue;
			if( plr_tiles[human_player][tile] == CH_BL )
				newlet[placed].blankchar = c;
			newlet[placed].letter = plr_tiles[human_player][tile];
			plr_tiles[human_player][tile] = 0;
			newlet[placed].x = xpos - BOARD_LX + 1;
			newlet[placed].y = ypos - BOARD_UY + 1;
			newlet[placed].oldlet =
			  board[ypos - BOARD_UY + 1][xpos - BOARD_LX + 1];
			if( newlet[placed].oldlet == CH_DW ) newlet[placed].oldlet = 'o';
			newlet[placed].tilepos = tile;
			addch( newlet[placed].letter );
			do {
				xpos += xinc;
				ypos += yinc;
			} while( board[ypos - BOARD_UY + 1][xpos - BOARD_LX + 1] >= 'A'
			  && xpos <= BOARD_RX && ypos <= BOARD_LY );
			print_tiles();
			placed++;
		}
	}
	if( placed <= 0 ) return( -1 );
	err = find_new_words( &newlet[0], placed, xinc, yinc );
	display_words( human_player, &newlet[0], err, placed );
	return( 1 );
}

show_instructions() {
	clear_prompt();
	printw( "  Tajpu la literon por meti en cxiun kvadraton, kaj '%c' por senlitera ludilo.\n", CH_BL );
	printw( "  Se vi tajpas literon, kiun vi ne havas, kaj vi havas senliteron, gxi\n" );
	printw( "  metigxos por vin auxtomate.\n" );
	printw( "  Tajpu '-' por retroiri, <ESK> por nuligi, kaj <REIRI> kiam vi finos.\n" );
	refresh();
}

int rearrange_tiles() {
	char c;
	int i, j;

	clear_prompt();
	printw( "  Cxiu litero, kiun vi tajpas, movigxos al la fino de via literujo.\n" );
	printw( "  Tajpu '%c' por senlitero, kaj <REIRI> kiam vi finos.\n",
		  CH_BL );
	refresh();
	print_tiles();
	do {
		c = get_key();
		for( i = 0; i < 7; i++ ) {
			if( c == plr_tiles[human_player][i] ) {
				for( j = i; j < 6; j++ )
					plr_tiles[human_player][j] = plr_tiles[human_player][j + 1];
				plr_tiles[human_player][6] = c;
				print_tiles();
				break;
			}
		}
	} while( c != '\n' );
	return( -1 );
}

disp_instr() {
	clear_rect( 19, 0, 20, 79 );
	printw( "  Tajpu la literojn, kiujn vi volas malpreni, uzu '%c' por senlitera ludilo.\n", CH_BL );
	printw( "  Tajpu '-' por retroiri, <ESK> por nuligi, kaj <REIRI> kiam vi finos.\n" );
	refresh();
}

int draw_new_tiles() {
	char c, tile[7];
	int i, j, plr;
	int used[7];

	clear_prompt();
	disp_instr();
	plr = human_player;
	j = 0;
	for( i = 0; i < 7; i++ ) {
		used[i] = 0;
		tile[i] = plr_tiles[plr][i];
	}
	for( ;; ) {
		clear_rect( 22, 0, 22, 79 );
		printw( "  Literoj por malpreni:" );
		for( i = 0; i < 7; i++ )
			if( used[i] != 0 ) printw( " %c", tile[i] );
		print_tiles();
		c = get_key();
		if( c == '\n' ) {
			if( j != 0 ) {
				clear_rect( 19, 0, 20, 79 );
				printw( "  Tajpu <REIRI> por firmigi vian elekton.  Alikaze, tajpu 'n'. -> " );
			} else {
				clear_rect( 19, 0, 20, 79 );
				printw( "  Tajpu <REIRI> por pasi la vicon.  Alikaze, tajpu 'n'. -> " );
			}
			refresh();
			do {
				c = getch();
			} while( c != '\n' && c != 'N' && c != 'n' );
			if( c == '\n' ) break;
			disp_instr();
		} else if( c == '-' || c == 127 || c == 8 ) {
			if( j > 0 ) {
				for( i = 0; i < 7; i++ )
					if( used[i] == j ) {
						used[i] = 0;
						plr_tiles[plr][i] = tile[i];
						j--;
						break;
					}
			} else {
				j = -1;
				break;
			}
		} else if( c == 27 ) {
			for( i = 0; i < 7; i++ )
				if( used[i] != 0 ) plr_tiles[plr][i] = tile[i];
			print_tiles();
			j = -1;
			break;
		} else {
			for( i = 0; i < 7; i++ ) {
				if( c == plr_tiles[plr][i] ) {
					j++;
					used[i] = j;
					plr_tiles[plr][i] = 0;
					break;
				}
			}
		}
	}
	if( j == -1 ) return( -1 );
	for( i = 0; i < 7; i++ )
		if( used[i] != 0 ) {
			c = tile[i] - 'A';
			if( tile[i] == CH_BL ) c = 28;
			tiles_left[c]++;
		}
	for( i = 0; i < 7; i++ )
		if( used[i] != 0 ) plr_tiles[plr][i] = draw_tile();
	print_tiles();
	return( 1 );
}
