/*
 *
 * misc.c -- miscellaneous routines
 *
 */

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

char spaces[81] =
"                                        \
										";

read_words() {
	FILE *fp;
	char inp[16], tinp[16];
	int i, tlen, rlen;
	long pt, wr;

	fp = fopen( DICT_FILE, "r" );
	if( fp == NULL ) {
		move( 4, 0 );
		printw( "Eraro: ne povis trovi vortaran dosieron '%s'\n", DICT_FILE );
		exit_window();
		exit( 1 );
	}
	printw( "Legante vortaron...\n" );
	refresh();
	pt = 0;
	wr = 0;
	tlen = 2;
	wlen[tlen] = wr;
	tinp[0] = '\0';
	while( fscanf( fp, "%s", inp ) != EOF ) {
		rlen = strlen( inp );
		if( rlen < 2 || rlen > 15 ) {
			move( 4, 0 );
			printw( "Eraro en vortara dosiero je vorto %s: vortoj longu inter 2 kaj 15\n", inp );
			printw( "literoj.\n" );
			exit_window();
			exit( 1 );
		}
		if( rlen < strlen( tinp ) ||
			( strcmp( tinp, inp ) > 0 && strlen( tinp ) == rlen ) ) {
			move( 4, 0 );
			printw( "Eraro en vortara dosiero je vortoj %s kaj %s.\n",
					  tinp, inp );
			printw( "La vortaro ordigxu de plej mallongaj al plej longaj vortoj, kaj\n" );
			printw( "alfabete (laux ASCII) ene de cxiu samlonga vortaro." );
			exit_window();
			exit( 1 );
		}
		for( i = 0; i < rlen; i++ ) {
			if( inp[i] >= 'a' && inp[i] <= '|' ) inp[i] = inp[i] - 'a' + 'A';
			else if( inp[i] < 'A' || inp[i] > '\\' ) {
				move( 4, 0 );
				printw( "Eraro en vortara dosiero je vorto %s: vortoj enhavu nur alfabetajn\n", inp );
				printw( "literojn (A -> |).\n" );
				exit_window();
				exit( 1 );
			}
		}
		if( rlen > tlen ) {
			tlen = rlen;
			wlen[tlen] = wr;
		}
		strcpy( &words[pt], inp );
		wptr[wr++] = pt;
		pt += rlen + 1;
		strcpy( tinp, inp );
	}
	dict_size = pt;
	wlen[16] = wr;
	fclose( fp );
}

clear_rect( y1, x1, y2, x2 )
  int y1, x1, y2, x2;
{
	int i;

	for( i = y1; i <= y2; i++ ) {
		move( i, x1 );
		printw( "%s", &spaces[79 - ( x2 - x1 )] );
	}
	move( y1, x1 );
}

clear_prompt() {
	clear_rect( 19, 0, 23, 78 );
	move( 19, 0 );
}

clear_turn() {
	clear_rect( 18, 0, 18, 79 );
	move( 18, 0 );
}

press_return() {
	char c;

	move( 23, 0 );
	printw( "Press <RETURN> -> " );
	refresh();
	do {
		c = getch();
		if( c == 'q' || c == 'Q' ) abort = 1;
	} while( c != '\n' );
}

print_board() {
	int i, j;

	for( i = 1; i < 16; i++ ) {
		move( BOARD_UY + i - 1, BOARD_LX );
		for( j = 1; j < 16; j++ ) {
			if( board[i][j] >= 'A' ) standout();
			if( ( i == b1y && j == b1x ) || ( i == b2y && j == b2x ) )
				addch( board[i][j] - 'A' + 'a' );
			else if( board[i][j] == CH_DW ) addch( 'o' );
			else addch( board[i][j] );
			if( board[i][j] >= 'A' ) standend();
		}
	}
	refresh();
}

print_tiles() {
	int i, j;

	clear_rect( TILE_RACKS_Y, TILE_RACKS_X,
				  TILE_RACKS_Y + 7, TILE_RACKS_X + 24 );
	for( i = 0; i < players; i++ ) {
		move( TILE_RACKS_Y + i * 3, TILE_RACKS_X - 4 );
		if( plr_skills[i] != 0 ) printw( "(%d)", plr_skills[i] );
		move( TILE_RACKS_Y + i * 3, TILE_RACKS_X );
		if( i == human_player )
			printw( "Viaj literoj" );
		else
			printw( "%s literoj", you[i] );
		for( j = 0; j < 7; j++ ) {
			addch( ' ' );
			if( plr_tiles[i][j] > 0 ) {
#ifndef PRINT_CPU_TILES
				if( i == human_player || game_done == players )
#endif
					addch( plr_tiles[i][j] );
#ifndef PRINT_CPU_TILES
				else addch( '-' );
#endif
			} else addch( ' ' );
		}
		move( TILE_RACKS_Y + i * 3 + 1, TILE_RACKS_X + 5 );
		printw( "Poentoj   %3d", plr_scores[i] );
	}
	move( TILE_RACKS_Y + 12, TILE_RACKS_X - 4 );
	i = 0;
	if( b1x != 0 ) i++;
	if( b2x != 0 ) i++;
	printw( "Senliteraj ludiloj gxis nun: %d", i );
	if( b1x != 0 ) {
		move( TILE_RACKS_Y + 13, TILE_RACKS_X + 3 );
		printw( "Vico %2d, Kolono %2d (%c)", b1y, b1x, board[b1y][b1x] );
	}
	if( b2x != 0 ) {
		move( TILE_RACKS_Y + 14, TILE_RACKS_X + 3 );
		printw( "Vico %2d, Kolono %2d (%c)", b2y, b2x, board[b2y][b2x] );
	}
	move( TILE_RACKS_Y + human_player * 3, TILE_RACKS_X - 1 );
	refresh();
}

char draw_tile() {
	int i, tleft;
	int tile;

	tleft = 0;
	for( i = 0; i < 29; i++ )
		tleft += tiles_left[i];

	if( tleft == 0 ) return( 0 );
	tile = get_random() % tleft;
	for( i = 0;; i++ ) {
		if( tile - tiles_left[i] >= 0 )
			tile -= tiles_left[i];
		else
			break;
	}
	tiles_left[i]--;
	print_tiles_left( tleft - 1 );
	return( i == 28 ? CH_BL : i + 'A' );
}

print_tiles_left( t )
  int t;
{
	move( TILES_LEFT_Y, TILES_LEFT_X );
	printw( "Literoj restas: %3d", t );
}

char get_key() {
	char c;

	c = getch();
	if( c >= 'a' && c <= '|' ) c = c - 'a' + 'A';
/*	if( c == '\033' )
		if( getch() == '[' ) {
			c = getch();
			if( c == 'A' ) c = 'K';
			else if( c == 'B' ) c = 'J';
			else if( c == 'C' ) c = 'L';
			else if( c == 'D' ) c = 'H';
			else c = '\0';
		} else c = '\0'; */
	return( c );
}

seed_random() {
	struct timeval tp;

	gettimeofday( &tp, 0 );
	srandom( tp.tv_sec % 65536 - 32768 );
}

long get_random() {
	return( (long) random() );
}
