|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 7179 (0x1c0b)
Types: TextFile
Names: »select.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Hearts/select.c«
#include <curses.h>
#include "misc.h"
#include "defs.h"
extern WINDOW *card_window[],
*round_window, *lead_window, *text_window, *play_window;
extern int dist_socket;
extern char first_game;
typedef struct table *table_ptr;
struct table {
table_ptr next_table; /* Points to next table entry */
int table_id; /* Unique ID from distributor */
char player_name[4][9]; /* Player names */
int hand; /* Current table hand */
int round; /* Current table round */
char closed; /* If game over */
};
table_ptr first_table,
cur_table;
int table_count, /* # tables existing */
cur_screen_table, /* nth table shown as table 1 */
screen_table_id[8]; /* table_id of tables on screen */
char buf[64];
/*
* Find table given unique table_id in buf[1].
*/
table_ptr
find_table(buf)
char *buf;
{
table_ptr cur_table;
int table_num;
(void) sscanf(buf + 1, "%d", &table_num);
for (cur_table = first_table;
cur_table && cur_table->table_id != table_num;
cur_table = cur_table->next_table)
;
return(cur_table);
}
/*
* Create new table given table_id in buf[1]. Return pointer to new table.
*/
table_ptr
new_table(buf)
char *buf;
{
table_ptr cur_ptr, new_table_ptr;
int i, table_num;
char *malloc();
(void) sscanf(buf + 1, "%d", &table_num);
new_table_ptr = (table_ptr) malloc(sizeof(struct table));
new_table_ptr->next_table = NULL;
new_table_ptr->table_id = table_num;
new_table_ptr->closed = FALSE;
for (i = 0; i < 4; i++)
(void) strcpy(new_table_ptr->player_name[i], "<empty>");
if (first_table) {
for (cur_ptr = first_table; cur_ptr->next_table;
cur_ptr = cur_ptr->next_table)
;
cur_ptr->next_table = new_table_ptr;
}
else
first_table = new_table_ptr;
++table_count;
return(new_table_ptr);
}
/*
* Update current table entry based on buf. Return table # modified.
*/
update_table(buf)
char *buf;
{
int i;
table_ptr tmp_table;
switch (buf[0]) {
case 't' :
if ((cur_table = find_table(buf)) == NULL)
cur_table = new_table(buf);
break;
case 'h' :
(void) sscanf(buf + 1, "%d", &cur_table->hand);
break;
case 'r' :
(void) sscanf(buf + 1, "%d", &cur_table->round);
break;
case 'p' :
(void) strcpy(cur_table->player_name[buf[1] - '0'], buf + 2);
break;
case 'x' :
if (tmp_table = find_table(buf)) {
for (i = 0; i < 8; i++)
if (screen_table_id[i] = tmp_table->table_id)
screen_table_id[i] = 0;
tmp_table->table_id = 0;
tmp_table->closed = TRUE;
}
}
}
/*
* show_table - display table which is position table_pos on screen.
*/
show_table(cur_ptr, table_pos)
table_ptr cur_ptr;
int table_pos;
{
int window_num, window_pos;
int i;
window_num = table_pos % 4 + 1;
window_pos = (table_pos + 4) & 8;
for (i = 0; i < 6; i++) {
wmove(card_window[window_num], window_pos + i, 0);
wclrtoeol(card_window[window_num]);
}
mvwprintw(card_window[window_num], window_pos++, 0,
" Table %d", table_pos + 1);
if (cur_ptr->closed)
mvwaddstr(card_window[window_num], window_pos++, 0,
" <game over>");
else {
if (cur_ptr->hand == 0)
mvwaddstr(card_window[window_num], window_pos++, 0,
" <starting>");
else
mvwprintw(card_window[window_num], window_pos++, 0,
"Hand: %d Round: %d",
cur_ptr->hand, cur_ptr->round);
for (i = 0; i <4; i++)
mvwaddstr(card_window[window_num], window_pos++, 5,
cur_ptr->player_name[i]);
}
wrefresh(card_window[window_num]);
}
/*
* show_tables - display up to 8 tables starting with table # start_id.
*/
show_tables(start_id)
int start_id;
{
table_ptr cur_ptr;
int cur_id, i;
for (i = 0; i < 8; i++)
screen_table_id[i] = 0;
werase(round_window);
if (table_count)
mvwprintw(round_window, 0, 0, "Page %d of %d",
(start_id + 7) / 8, (table_count + 7) / 8);
wrefresh(round_window);
cur_ptr = first_table;
for (cur_id = 1; cur_id < start_id; cur_id++)
cur_ptr = cur_ptr->next_table;
for (cur_id = 0; (cur_id < 8) && cur_ptr;
cur_ptr = cur_ptr->next_table) {
screen_table_id[cur_id] = cur_ptr->table_id;
show_table(cur_ptr, cur_id++);
}
}
ask_option()
{
werase(lead_window);
mvwaddstr(lead_window, 0, 0, "Option: ");
wrefresh(lead_window);
}
show_options()
{
werase(play_window);
mvwaddstr(play_window, 0, 0, "Options are:");
if (!first_game)
mvwaddstr(play_window, 1, 0, "<A>nother game");
mvwaddstr(play_window, 2, 0, "<N>ew game");
if (table_count)
mvwaddstr(play_window, 3, 0, "<J>oin game");
if (table_count > 8)
mvwaddstr(play_window, 4, 0, "<M>ore games");
mvwaddstr(play_window, 5, 0, "<Q>uit");
wrefresh(play_window);
ask_option();
}
dist_died()
{
death("Distributor died!!");
}
select_game()
{
int dealer_port;
fd_type read_fd;
int i;
char ch;
char joined, joining;
table_ptr temp_table;
clear();
refresh();
/*
* Get current games info
*/
do {
if (read_socket(dist_socket, buf) == 0)
dist_died();
if (buf[0] != 'g')
update_table(buf);
}
while (buf[0] != 'g');
show_tables(cur_screen_table = 1);
show_options();
/*
* Wait for user input or table update info
*/
joined = joining = FALSE;
do {
fd_init(0, &read_fd); /* stdin */
fd_set(dist_socket, &read_fd);
if (select(WIDTH, &read_fd, (fd_type *) 0, (fd_type *) 0,
(struct timeval *) 0) == -1)
dist_died();
if (fd_isset(dist_socket, read_fd)) {
if (read_socket(dist_socket, buf) == 0)
dist_died();
i = update_table(buf);
show_tables(cur_screen_table);
}
if (fd_isset(0, read_fd)) {
ch = get_char();
werase(text_window);
wrefresh(text_window);
switch (ch) {
case 'Q' :
case 'q' :
wimp_out();
case 'A' :
case 'a' :
if (!first_game)
joined = TRUE;
break;
case 'N' :
case 'n' :
write_socket(dist_socket, "n");
joined = TRUE;
break;
case 'J' :
case 'j' :
mvwaddstr(lead_window, 0, 0, "Join table #:");
wrefresh(lead_window);
joining = TRUE;
break;
case 'M' :
case 'm' :
if (table_count > 8) {
if ((cur_screen_table += 8) > table_count)
cur_screen_table = 1;
for (i = CLUBS; i <= SPADES; i++) {
werase(card_window[i]);
wrefresh(card_window[i]);
}
show_tables(cur_screen_table);
}
break;
default:
if (joining && (ch >= '1') && (ch <= '8')) {
if (i = screen_table_id[ch - '1']) {
(void) sprintf(buf, "j%d", i);
write_socket(dist_socket, buf);
joined = TRUE;
}
else {
mvwaddstr(text_window, 0, 0, "Table not open.");
wrefresh(text_window);
ask_option();
}
}
else {
mvwaddstr(text_window, 0, 0, "Huh?");
wrefresh(text_window);
ask_option();
}
joining = FALSE;
break;
}
}
}
while (!joined);
/*
* Now free up malloced table space
*/
while (first_table) {
temp_table = first_table;
first_table = first_table->next_table;
free ((char *) temp_table);
}
clear();
refresh();
if (!first_game && ((ch == 'a') || (ch == 'A')))
/*
* Play another game with current dealer.
*/
dealer_port = 0;
else {
if (read_socket(dist_socket, buf) == 0)
dist_died();
(void) sscanf(buf + 1, "%d", &dealer_port);
}
(void) close(dist_socket);
return(dealer_port);
}