void game_slave(void) { game.mode = 3; init: game_init(); tft_setZoom(2); RECTANGLE(GAME_S); STRING(GAME_S_STR); STRING(GAME_S_ORIE); get: switch (ROE_get()) { case ROE_SW1: case ROE_SW2: SOUND(SOUND_CONF); while (ROE_get() != ROE_N); tft_setOrient(tft_getOrient() + 1); goto init; } switch (connect_read()) { case CONN_LEFT: connect_put(CONN_READY); game.mode = 2; goto init; case CONN_DETECT: case CONN_RIGHT: connect_put(CONN_READY); game.mode = 3; goto init; case CONN_START: box.dx = connect_get(); connect_put(CONN_READY); box.dy = (box.dx >> 1) & 0x01; box.dx &= 0x01; box.e = 0; RECTANGLE_CLEAN(GAME_S); box_show(GAME_BGC); return; case CONN_SOUND: sound_freq(connect_get16()); } goto get; }
// display a text message void message_box(int delay, int x, int y, char *fgc, char *bgc, char *bc, char *txt) { workarea mon; monitor_dimensions_struts(x, y, &mon); if (fork()) return; display = XOpenDisplay(0x0); box *b = box_create(root, BOX_OVERRIDE, 0, 0, 1, 1, config_title_bg); textbox *text = textbox_create(b->window, TB_CENTER | TB_AUTOHEIGHT | TB_AUTOWIDTH, 8, 5, 1, 1, config_title_font, config_title_fg, config_title_bg, txt, NULL); box_moveresize(b, MIN(mon.x + mon.w - text->w - 26, MAX(mon.x + 26, x - text->w / 2)), MIN(mon.y + mon.h - text->h - 20, MAX(mon.y + 20, y - text->h / 2)), text->w + 16, text->h + 10); XSelectInput(display, b->window, ExposureMask); textbox_show(text); box_show(b); double stamp = timestamp(); while ((timestamp() - stamp) < (double) delay / 1000) { if (XPending(display)) { XEvent ev; XNextEvent(display, &ev); if (ev.type == Expose) textbox_draw(text); } usleep(10000); // 10ms } textbox_free(text); box_free(b); exit(EXIT_SUCCESS); }
uint8_t game_master(void) { uint8_t index = 0; game.mode = 2; init: game_init(); tft_setZoom(2); RECTANGLE(GAME_M); STRING(GAME_M_STR); list: SELECTION(index == 0, GAME_M_ORIE, GAME_M); SELECTION(index == 1, GAME_M_LEFT, GAME_M); SELECTION(index == 2, GAME_M_RIGHT, GAME_M); get: switch (ROE_get()) { case ROE_SW1: case ROE_SW2: SOUND(SOUND_CONF); while (ROE_get() != ROE_N); goto enter; case ROE_CW1: case ROE_CW2: SOUND(SOUND_SELECT); if (index == 2) index = 0; else index++; refresh: if (index == 1 && game.mode == 3) { game.mode = 2; connect_put(CONN_RIGHT); if (connect_get() != CONN_READY) goto clean; goto init; } else if (index == 2 && game.mode == 2) { game.mode = 3; connect_put(CONN_LEFT); if (connect_get() != CONN_READY) goto clean; goto init; } goto list; case ROE_CCW1: case ROE_CCW2: SOUND(SOUND_SELECT); if (index == 0) index = 2; else index--; goto refresh; } if (connect_read() == CONN_SOUND) sound_freq(connect_get16()); goto get; enter: if (index == 0) { tft_setOrient(tft_getOrient() + 1); goto init; } connect_put(CONN_START); connect_put(box.dy << 1 | box.dx); if (connect_get() != CONN_READY) goto clean; RECTANGLE_CLEAN(GAME_M); box_show(GAME_BGC); return 1; clean: tft_fill(GAME_BGC); return 0; }