main.c (5257B)
1 /* main.c - ajedrez: punto de entrada y linea de comandos. */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <unistd.h> 6 #include "app.h" 7 8 static void usage(void) 9 { 10 printf("uso: ajedrez [modo] [opciones]\n\n" 11 "modos:\n" 12 " (nada) menu\n" 13 " ai contra la maquina\n" 14 " hotseat dos jugadores en la misma compu\n" 15 " watch maquina contra maquina\n" 16 " puzzle puzzles\n" 17 " resume retomar la ultima partida\n" 18 " pgn ARCHIVO visor de PGN\n" 19 " import [ARCHIVO] importar una partida (PGN o FEN) y seguirla\n" 20 " fen \"FEN\" jugar desde una posicion (dos jugadores)\n" 21 " online [servidor[:puerto]] mis partidas en el servidor (puerto 7374)\n" 22 " host [puerto] crear partida en red local\n" 23 " join COMPU [puerto] unirse a una partida en red local\n\n" 24 "opciones: --gui --layout wide|compact --scale N --lang es|en\n\n" 25 "herramientas:\n" 26 " --selftest [--deep] pruebas del nucleo\n" 27 " --sim N [nivel] N partidas motor contra motor verificando invariantes\n" 28 " --perft PROF [FEN] perft por jugada\n" 29 " --bench velocidad del motor\n" 30 " --uci el motor como motor UCI (opcion Level 0..4)\n\n" 31 "Stockfish (opcional, nivel extra y analisis): $CHESS_STOCKFISH, engine/stockfish o el PATH\n"); 32 } 33 34 int main(int argc, char **argv) 35 { 36 if (argc >= 2 && !strcmp(argv[1], "--selftest")) return app_selftest(argc >= 3 && !strcmp(argv[2], "--deep")); 37 if (argc >= 3 && !strcmp(argv[1], "--sim")) return app_sim(atoi(argv[2]), 12345, argc >= 4 ? atoi(argv[3]) : 1); 38 if (argc >= 3 && !strcmp(argv[1], "--perft")) 39 return app_perft(argc >= 4 ? argv[3] : "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", atoi(argv[2])); 40 if (argc >= 2 && !strcmp(argv[1], "--bench")) return app_bench(); 41 if (argc >= 2 && !strcmp(argv[1], "--uci")) return app_uci(); 42 if (argc >= 2 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))) { usage(); return 0; } 43 44 Settings st; 45 settings_load(&st); 46 g_lang = st.lang; 47 bool gui = false; 48 const char *mode = 0, *arg = 0, *extra = 0; 49 for (int i = 1; i < argc; i++) { 50 const char *a = argv[i]; 51 if (!strcmp(a, "--gui")) gui = true; 52 else if (!strcmp(a, "--layout") && i + 1 < argc) st.layout = !strcmp(argv[++i], "compact") ? LAYOUT_COMPACT : LAYOUT_WIDE; 53 else if (!strcmp(a, "--scale") && i + 1 < argc) st.scale = atoi(argv[++i]); 54 else if (!strcmp(a, "--lang") && i + 1 < argc) { g_lang = !strcmp(argv[++i], "en"); st.lang = g_lang; } 55 else if (!mode) mode = a; 56 else if (!arg) arg = a; 57 else if (!extra) extra = a; 58 else { usage(); return 1; } 59 } 60 if (!gui) st.layout = LAYOUT_WIDE; 61 /* cargar el archivo antes de abrir la pantalla, para poder avisar el error */ 62 char *text = 0; 63 if (mode && (!strcmp(mode, "pgn") || (!strcmp(mode, "import") && arg))) { 64 if (!arg || !(text = read_file(arg, 0))) { fprintf(stderr, "ajedrez: no se puede leer %s\n", arg ? arg : "(falta el archivo)"); return 1; } 65 } 66 Pos fenpos; 67 if (mode && !strcmp(mode, "fen") && (!arg || !pos_from_fen(&fenpos, arg))) { fprintf(stderr, "ajedrez: FEN invalido\n"); return 1; } 68 Frontend *fe = gui ? gui_open(st.layout, st.scale) : tui_open(); 69 if (!fe) { fprintf(stderr, "ajedrez: no se pudo abrir la pantalla\n"); return 1; } 70 if (!mode) app_menu(fe, &st); 71 else if (!strcmp(mode, "ai")) app_new_game(fe, &st, MODE_AI, 0); 72 else if (!strcmp(mode, "hotseat")) app_new_game(fe, &st, MODE_HOTSEAT, 0); 73 else if (!strcmp(mode, "watch")) app_new_game(fe, &st, MODE_WATCH, 0); 74 else if (!strcmp(mode, "puzzle")) app_puzzles(fe, &st); 75 else if (!strcmp(mode, "import")) app_import(fe, &st, text); 76 else if (!strcmp(mode, "fen")) app_new_game(fe, &st, MODE_HOTSEAT, &fenpos); 77 else if (!strcmp(mode, "online")) online_menu(fe, &st, arg); 78 else if (!strcmp(mode, "host")) lan_host(fe, &st, arg ? atoi(arg) : 0); 79 else if (!strcmp(mode, "join") && arg) { 80 char host[128]; 81 int port; 82 if (parse_hostport(arg, host, sizeof host, &port)) lan_join(fe, &st, host, extra ? atoi(extra) : port); 83 } 84 else if (!strcmp(mode, "resume")) { 85 char last[600], err[128]; 86 static Session s; 87 if (latest_save(last, sizeof last) && sess_resume(&s, last, err, sizeof err)) { app_play(fe, &s, &st); sess_close(&s); } 88 } else if (!strcmp(mode, "pgn")) { 89 char err[128]; 90 if (!app_viewer(fe, &st, text, err, sizeof err)) { fe->close(fe); fprintf(stderr, "ajedrez: %s\n", err); free(text); return 1; } 91 } else { fe->close(fe); usage(); return 1; } 92 fe->close(fe); 93 free(text); 94 if (access(last_pgn_path(), F_OK) == 0) 95 printf("%s %s\n", g_lang ? "Last game (PGN):" : "Ăšltima partida (PGN):", last_pgn_path()); 96 return 0; 97 }