/* * XScrabble - X version of the popular board game, for 1 to 4 players. * * This software comes with NO warranty whatsoever. I therefore take no * responsibility for any damages, losses or problems caused through use * or misuse of this program. * * I hereby grant permission for this program to be freely copied and * distributed by any means, provided no charge is made for it. * * Matthew Chapman, csuoq@csv.warwick.ac.uk * Oct 1994. */ /* user.c - user interaction with board */ #include "scrab.h" #include "globals.h" char selected_lett[MAXPLAYERS] = { ' ',' ',' ',' ' }; Widget prev[MAXPLAYERS]; int oldx,oldy; Boolean from_bar[MAXPLAYERS]; void Deselect(int ply) { /* deselect current player's tile, if required */ if (selected_lett[ply] != ' ') { /* deselect letter */ selected_lett[ply] = ' '; XtVaSetValues(prev[ply],SETBG(app_data.brightcolor), SETFG(app_data.lettercolor), NULL); } } void RemoveFromBoard() { int ac,dn; /* copy board to cboard, removing letters */ for (dn=0; dn1)]); MessageOne(curr_player,mess); } else { sprintf(mess,PROMPT[GO_ACCEPTED],score_for_go, PROMPT[WDPOINT+(score_for_go>1)]); sprintf(mess2,PROMPT[GO_ALL],player[curr_player].name,score_for_go, PROMPT[WDPOINT+(score_for_go>1)]); Message(curr_player,mess,mess2); /* copy cboard to board */ for (dn=0; dn0) { XtVaSetValues(timeleft[curr_player], XtNpercentageCompleted,0,NULL); XtVaSetValues(pauseButton[curr_player], XtNmappedWhenManaged,False,NULL); } } /* move to next player */ curr_player = (curr_player+1) % num_players; Wait(MESS_DELAY); ShowBoard(False); if (num_passed==num_players) GameOver(-1); sprintf(mess,PROMPT[YOUR_GO],player[curr_player].name); sprintf(mess2,PROMPT[START_GO_ALL],player[curr_player].name); Message(curr_player,mess,mess2); ShowScores(); /* beep the player */ XBell(dpy[curr_player],2*bell_level-100); savegame(); if (type[curr_player]!=0) ComputerGo(); else { /* make new player's buttons sensitive */ XtSetSensitive(change[curr_player],True); XtSetSensitive(finish[curr_player],True); XtSetSensitive(pass[curr_player],True); XtSetSensitive(evaluate[curr_player],True); XtSetSensitive(revert[curr_player],True); XtSetSensitive(pauseButton[curr_player],True); /* start the timer */ finished_go=False; comp=0; if (time_limit>0) { XtVaSetValues(pauseButton[curr_player], XtNmappedWhenManaged,True,NULL); Click(); } } } void ComputerGo() { int score_for_go,ac,dn,bn; char mess[256]; Boolean all_space; XtVaSetValues(compw[curr_player],XtNlabel,PROMPT[THINKING],NULL); comp_move(&score_for_go,type[curr_player]); UpdateComp(0); XtVaSetValues(compw[curr_player],XtNlabel," ",NULL); if (score_for_go==0) { sprintf(mess,PROMPT[PASS],player[curr_player].name); MessageAll(mess); num_passed++; } else { num_passed=0; sprintf(mess,PROMPT[COMP_SCORE],player[curr_player].name,score_for_go, PROMPT[WDPOINT+(score_for_go>1)]); MessageAll(mess); ShowBoard(True); ShowBar(curr_player); ShowScores(); /* copy board to cboard */ for (dn=0; dnbagptr+1) { XtPopdown(changeshell); XtDestroyWidget(changeshell); MessageOne(curr_player,PROMPT[CANNOT_CHANGE]); } else { /* remove changed letters from bar */ for (i=0; i1)]); MessageOne(i,mess); } } else { /* ply went out, by using all his tiles */ for (i=0; i1)]); MessageOne(i,mess); totalpoints+=points; } player[ply].score+=totalpoints; sprintf(mess,PROMPT[GAME_OVER_WIN],totalpoints,PROMPT[WDPOINT+(points>1)]); MessageOne(ply,mess); } ShowScores(); Wait(MESS_DELAY); for (i=0; i hiscore) { winner=i; hiscore=player[i].score; drawn=0; dr[drawn]=i; } } switch (drawn) { case 0: sprintf(mess,PROMPT[WINNER],player[winner].name); MessageAll(mess); break; case 1: if (num_players==2) MessageAll(PROMPT[DRAW_ALL]); else { sprintf(mess,PROMPT[DRAWN2],player[dr[0]].name,player[dr[1]].name); MessageAll(mess); } break; case 2: if (num_players==3) MessageAll(PROMPT[DRAW_ALL]); else { sprintf(mess,PROMPT[DRAWN3],player[dr[0]].name,player[dr[1]].name, player[dr[2]].name); MessageAll(mess); } break; case 3: MessageAll(PROMPT[DRAW_ALL]); break; default: MessageAll(PROMPT[SPAM]); break; } loadscores(); alterscores(); savescores(); for (i=0; i0; rep--) { swap1 = rand() % BARLEN; swap2 = rand() % BARLEN; while (swap2 == swap1) swap2 = rand() % BARLEN; tmp = player[i].bar[swap1]; player[i].bar[swap1] = player[i].bar[swap2]; player[i].bar[swap2] = tmp; } ShowBar(i); } void CompShowBar(Widget w, XtPointer client_data, XtPointer call_data) { int i; for (i=0; i0) && (w==compshowbar[i])) XtVaSetValues(barw[i],XtNmappedWhenManaged,True,NULL); } } void CompHideBar(Widget w, XtPointer client_data, XtPointer call_data) { int i; for (i=0; i0) && (w==comphidebar[i])) XtVaSetValues(barw[i],XtNmappedWhenManaged,False,NULL); } }