/* * * 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 je malplena kvadrato por ekmeti literojn surtabule.\n" ); printw( " Tajpu 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 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, por nuligi, kaj 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 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, por nuligi, kaj 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 por firmigi vian elekton. Alikaze, tajpu 'n'. -> " ); } else { clear_rect( 19, 0, 20, 79 ); printw( " Tajpu 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 ); }