void do_play_ascii(Gameinfo *gameinfo) { int m, num; float fnum; int passes = 0; /* two passes and its over */ int tmp; char line[80]; char *line_ptr = line; char *command; char *tmpstring; int state = 1; if (have_time_settings()) clock_on = 1; while (state == 1) { state = 0; /* No score is estimated yet. */ current_score_estimate = NO_SCORE; /* Allow resignation at interface level (the engine may still be not * allowed to resign. */ resignation_allowed = 1; printf("\nBeginning ASCII mode game.\n\n"); gameinfo_print(gameinfo); /* Does the computer play first? If so, make a move. */ if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); /* main ASCII Play loop */ while (state == 0) { /* Display game board. */ if (opt_showboard) ascii_showboard(); #if !READLINE /* Print the prompt */ mprintf("%s(%d): ", color_to_string(gameinfo->to_move), movenum + 1); /* Read a line of input. */ line_ptr = line; if (!fgets(line, 80, stdin)) return; #else snprintf(line, 79, "%s(%d): ", color_to_string(gameinfo->to_move), movenum + 1); if (!(line_ptr = readline(line))) return; add_history(line_ptr); #endif while (state == 0 && (command = strtok(line_ptr, ";"), line_ptr = 0, command)) { /* Get the command or move. */ switch (get_command(command)) { case RESIGN: state = ascii_endgame(gameinfo, 1); break; case END: case EXIT: case QUIT: return; case HELP: show_commands(); break; case CMD_HELPDEBUG: printf(DEBUG_COMMANDS); break; case SHOWBOARD: opt_showboard = !opt_showboard; break; case INFO: printf("\n"); gameinfo_print(gameinfo); break; case SETBOARDSIZE: if (sgf_initialized) { printf("Boardsize cannot be changed after record is started!\n"); break; } command += 10; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (!check_boardsize(num, stdout)) break; /* Init board. */ board_size = num; clear_board(); /* In case max handicap changes on smaller board. */ gameinfo->handicap = place_fixed_handicap(gameinfo->handicap); sgfOverwritePropertyInt(sgftree.root, "SZ", board_size); sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap); break; case SETHANDICAP: if (sgf_initialized) { printf("Handicap cannot be changed after game is started!\n"); break; } command += 9; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (num < 0 || num > MAX_HANDICAP) { printf("\nInvalid handicap: %d\n", num); break; } /* Init board. */ clear_board(); /* Place stones on board but don't record sgf * in case we change more info. */ gameinfo->handicap = place_fixed_handicap(num); printf("\nSet handicap to %d\n", gameinfo->handicap); gameinfo->to_move = (gameinfo->handicap ? WHITE : BLACK); break; case FREEHANDICAP: if (sgf_initialized) { printf("Handicap cannot be changed after game is started!\n"); break; } while (*command && *command != ' ') command++; ascii_free_handicap(gameinfo, command); break; case SETKOMI: if (sgf_initialized) { printf("Komi cannot be modified after game record is started!\n"); break; } command += 5; if (sscanf(command, "%f", &fnum) != 1) { printf("\nInvalid command syntax!\n"); break; } komi = fnum; printf("\nSet Komi to %.1f\n", komi); break; case SETDEPTH: command += 6; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } mandated_depth = num; printf("\nSet depth to %d\n", mandated_depth); break; case SETLEVEL: command += 6; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } set_level(num); printf("\nSet level to %d\n", num); break; case DISPLAY: if (!opt_showboard) ascii_showboard(); break; case FORCE: command += 6; /* skip the force part... */ switch (get_command(command)) { case MOVE: state = do_move(gameinfo, command, &passes, 1); break; case PASS: state = do_pass(gameinfo, &passes, 1); break; default: printf("Illegal forced move: %s %d\n", command, get_command(command)); break; } break; case MOVE: state = do_move(gameinfo, command, &passes, 0); break; case PASS: state = do_pass(gameinfo, &passes, 0); break; case PLAY: command += 5; if (sscanf(command, "%d", &num) != 1) { printf("\nInvalid command syntax!\n"); break; } if (num >= 0) for (m = 0; m < num; m++) { gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player); state = computer_move(gameinfo, &passes); if (state) break; if (passes >= 2) break; } else { printf("\nInvalid number of moves specified: %d\n", num); break; } break; case PLAYBLACK: if (gameinfo->computer_player == WHITE) gameinfo->computer_player = BLACK; if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); break; case PLAYWHITE: if (gameinfo->computer_player == BLACK) gameinfo->computer_player = WHITE; if (gameinfo->computer_player == gameinfo->to_move) state = computer_move(gameinfo, &passes); break; case SWITCH: gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player); state = computer_move(gameinfo, &passes); break; case UNDO: case CMD_BACK: if (undo_move(1)) { sgftreeAddComment(&sgftree, "undone"); sgftreeBack(&sgftree); gameinfo->to_move = OTHER_COLOR(gameinfo->to_move); } else printf("\nCan't undo.\n"); break; case CMD_FORWARD: if (sgftreeForward(&sgftree)) gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode, gameinfo->to_move); else printf("\nEnd of game tree.\n"); break; case CMD_LAST: while (sgftreeForward(&sgftree)) gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode, gameinfo->to_move); break; case COMMENT: printf("\nEnter comment. Press ENTER when ready.\n"); fgets(line, 80, stdin); sgftreeAddComment(&sgftree, line); break; case SCORE: showscore = !showscore; if (!showscore) current_score_estimate = NO_SCORE; break; case CMD_DEAD: silent_examine_position(FULL_EXAMINE_DRAGONS); showdead = !showdead; break; case CMD_CAPTURE: strtok(command, " "); showcapture(strtok(NULL, " ")); break; case CMD_DEFEND: strtok(command, " "); showdefense(strtok(NULL, " ")); break; case CMD_SHOWMOYO: tmp = printmoyo; printmoyo = PRINTMOYO_MOYO; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWTERRI: tmp = printmoyo; printmoyo = PRINTMOYO_TERRITORY; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWAREA: tmp = printmoyo; printmoyo = PRINTMOYO_AREA; silent_examine_position(EXAMINE_DRAGONS); printmoyo = tmp; break; case CMD_SHOWDRAGONS: silent_examine_position(EXAMINE_DRAGONS); showboard(1); break; case CMD_GOTO: strtok(command, " "); ascii_goto(gameinfo, strtok(NULL, " ")); break; case CMD_SAVE: strtok(command, " "); tmpstring = strtok(NULL, " "); if (tmpstring) { /* discard newline */ tmpstring[strlen(tmpstring) - 1] = 0; /* make sure we are saving proper handicap */ init_sgf(gameinfo); writesgf(sgftree.root, tmpstring); printf("You may resume the game"); printf(" with -l %s --mode ascii\n", tmpstring); printf("or load %s\n", tmpstring); } else printf("Please specify filename\n"); break; case CMD_LOAD: strtok(command, " "); tmpstring = strtok(NULL, " "); if (tmpstring) { /* discard newline */ tmpstring[strlen(tmpstring) - 1] = 0; if (!sgftree_readfile(&sgftree, tmpstring)) { fprintf(stderr, "Cannot open or parse '%s'\n", tmpstring); break; } /* to avoid changing handicap etc. */ if (gameinfo_play_sgftree(gameinfo, &sgftree, NULL) == EMPTY) fprintf(stderr, "Cannot load '%s'\n", tmpstring); else { sgf_initialized = 1; sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap); } } else printf("Please specify a filename\n"); break; case CMD_LISTDRAGONS: silent_examine_position(EXAMINE_DRAGONS); show_dragons(); break; default: printf("\nInvalid command: %s", command); break; } if (passes >= 2) state = ascii_endgame(gameinfo, 0); } #if READLINE free(line_ptr); #endif } sgffile_output(&sgftree); passes = 0; /* Play a different game next time. */ update_random_seed(); /* Free the sgf tree and prepare for a new game. */ sgfFreeNode(sgftree.root); sgftree_clear(&sgftree); sgftreeCreateHeaderNode(&sgftree, board_size, komi, gameinfo->handicap); sgf_initialized = 0; gameinfo_clear(gameinfo); } }
/* done with all structures along the way to deepest*/ PRIVATE int update_deepest(Encoded *Enc, struct_en *str, struct_en *min){ /* apply move + get its energy*/ int tmp_en; tmp_en = str->energy + energy_of_move_pt(str->structure, Enc->s0, Enc->s1, Enc->bp_left, Enc->bp_right); do_move(str->structure, Enc->bp_left, Enc->bp_right); if (Enc->bp_left2 != 0) { tmp_en += energy_of_move_pt(str->structure, Enc->s0, Enc->s1, Enc->bp_left2, Enc->bp_right2); do_move(str->structure, Enc->bp_left2, Enc->bp_right2); } int last_en = str->energy; str->energy = tmp_en; /* use f_point if we have it */ if (Enc->funct) { int end = Enc->funct(str, min); // undo moves if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return (end?1:0); } if (Enc->verbose_lvl>1) { fprintf(stderr, " "); print_str(stderr, str->structure); fprintf(stderr, " %d\n", tmp_en); } /* better deepest*/ if (tmp_en < min->energy) { min->energy = tmp_en; copy_arr(min->structure, str->structure); /* delete degeneracy*/ free_degen(Enc); /* undo moves*/ if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return 1; } /* degeneracy*/ if ((str->energy == min->energy) && (Enc->current_en == min->energy)) { int found = 0; int i; for (i=Enc->begin_pr; i<Enc->end_pr; i++) { if (equals(Enc->processed[i], str->structure)) { found = 1; break; } } for (i=Enc->begin_unpr; !found && i<Enc->end_unpr; i++) { if (equals(Enc->unprocessed[i], str->structure)) { found = 1; break; } } if (!found) { //print_stren(stderr, str); // fprintf(stderr, " %6.2f\n", str->energy); Enc->unprocessed[Enc->end_unpr]=allocopy(str->structure); Enc->end_unpr++; } } /* undo moves*/ if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return 0; }
/* Execute a social command. */ void exec_social(struct char_data *npc, char *cmd, int next_line, int *cur_line, void **thing) { bool ok; void do_move(struct char_data *ch, char *argument, int cmd); void do_open(struct char_data *ch, char *argument, int cmd); void do_lock(struct char_data *ch, char *argument, int cmd); void do_unlock(struct char_data *ch, char *argument, int cmd); void do_close(struct char_data *ch, char *argument, int cmd); if (GET_POS(npc) == POSITION_FIGHTING) return; ok = TRUE; switch (*cmd) { case 'G' : *cur_line = next_line; return; case 'g' : *cur_line += next_line; return; case 'e' : act(cmd+1, FALSE, npc, *thing, *thing, TO_ROOM); break; case 'E' : act(cmd+1, FALSE, npc, 0, *thing, TO_VICT); break; case 'B' : act(cmd+1, FALSE, npc, 0, *thing, TO_NOTVICT); break; case 'm' : do_move(npc, "", *(cmd+1)-'0'+1); break; case 'w' : if (GET_POS(npc) != POSITION_SLEEPING) ok = FALSE; else GET_POS(npc) = POSITION_STANDING; break; case 's' : if (GET_POS(npc) <= POSITION_SLEEPING) ok = FALSE; else GET_POS(npc) = POSITION_SLEEPING; break; case 'c' : /* Find char in room */ *thing = get_char_room_vis(npc, cmd+1); ok = (*thing != 0); break; case 'o' : /* Find object in room */ *thing = get_obj_in_list_vis(npc, cmd+1, world[npc->in_room].contents); ok = (*thing != 0); break; case 'r' : /* Test if in a certain room */ ok = (npc->in_room == atoi(cmd+1)); break; case 'O' : /* Open something */ do_open(npc, cmd+1, 0); break; case 'C' : /* Close something */ do_close(npc, cmd+1, 0); break; case 'L' : /* Lock something */ do_lock(npc, cmd+1, 0); break; case 'U' : /* UnLock something */ do_unlock(npc, cmd+1, 0); break; case '?' : /* Test a random number */ if (atoi(cmd+1) <= number(1,100)) ok = FALSE; break; default: break; } /* End Switch */ if (ok) (*cur_line)++; else (*cur_line) += next_line; }
int main(int argc, char **argv) { cl_options_t cl_options = {0}; dbg_init(); DBG_LOG("Version %s", g_version); ui = &ui_sdlgl; printf("DreamChess %s\n", g_version); parse_options(argc, argv, &ui, &cl_options); config_init(); set_cl_options(&cl_options); if (!ui) { DBG_ERROR("Failed to find a user interface driver"); exit(1); } ui->init(); init_resolution(); while (1) { board_t board; int pgn_slot; option_t *option; if (!(config = ui->config(&pgn_slot))) break; ch_userdir(); option = config_get_option("first_engine"); #ifdef __APPLE__ char temp1[200]; char temp2[200]; if (!strcmp(option->string, "dreamer") || !strcmp(option->string, "Dreamer")) { CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef bundledir = CFBundleCopyBundleURL(mainBundle); CFStringRef stringref = CFURLCopyFileSystemPath(bundledir, kCFURLPOSIXPathStyle); CFStringGetCString(stringref, temp1, 200, kCFStringEncodingMacRoman); snprintf(temp2, sizeof(temp2), "%s/contents/MacOS/dreamer", temp1); game_set_engine_error(comm_init(temp2)); } else game_set_engine_error(comm_init(option->string)); #else game_set_engine_error(comm_init(option->string)); #endif comm_send("xboard\n"); comm_send("new\n"); comm_send("random\n"); comm_send("sd %i\n", config->cpu_level); comm_send("depth %i\n", config->cpu_level); if (config->difficulty == 0) comm_send("noquiesce\n"); if (config->player[WHITE] == PLAYER_UI && config->player[BLACK] == PLAYER_UI) comm_send("force\n"); if (config->player[WHITE] == PLAYER_ENGINE) comm_send("go\n"); in_game = 1; board_setup(&board); history = history_init(&board); move_list_init(&san_list); move_list_init(&fan_list); move_list_init(&fullalg_list); if (pgn_slot >= 0) if (game_load(pgn_slot)) { DBG_ERROR("Failed to load savegame in slot %i", pgn_slot); exit(1); } ui->update(history->view->board, NULL); while (in_game) { char *s; if ((s = comm_poll())) { DBG_LOG("Message from engine: '%s'", s); if (!history->result) { if ((!strncmp(s, "move ", 4) || strstr(s, "... ")) && config->player[history->last->board->turn] == PLAYER_ENGINE) { char *move_str = strrchr(s, ' ') + 1; board_t new_board = *history->last->board; move_t *engine_move; DBG_LOG("Parsing move string '%s'", move_str); engine_move = san_to_move(&new_board, move_str); if (!engine_move) engine_move = fullalg_to_move(&new_board, move_str); if (engine_move) { audio_play_sound(AUDIO_MOVE); do_move(engine_move, 1); free(engine_move); } else DBG_ERROR("Failed to parse move string '%s'", move_str); } else if (strstr(s, "llegal move")) game_undo(); /* Ignore result message if we've already determined a result ourselves. */ else { char *start = strchr(s, '{'); char *end = strchr(s, '}'); if (start && end && end > start) { char *comment = malloc(end - start); history->result = malloc(sizeof(result_t)); strncpy(comment, start + 1, end - start - 1); comment[end - start - 1] = '\0'; history->result->reason = comment; if (strstr(s, "1-0")) { history->result->code = RESULT_WHITE_WINS; ui->show_result(history->result); } else if (strstr(s, "1/2-1/2")) { history->result->code = RESULT_DRAW; ui->show_result(history->result); } else if (strstr(s, "0-1")) { history->result->code = RESULT_BLACK_WINS; ui->show_result(history->result); } else { free(history->result->reason); free(history->result); history->result = NULL; } } } } free(s); } ui->poll(); } comm_send("quit\n"); comm_exit(); history_exit(history); move_list_exit(&san_list); move_list_exit(&fan_list); move_list_exit(&fullalg_list); } ui->exit(); dbg_exit(); return 0; }
int mayor(struct char_data *ch, int cmd, char *arg) { static char open_path[] = "W3a3003b33000c111d0d111Oe333333Oe22c222112212111a1S."; static char close_path[] = "W3a3003b33000c111d0d111CE333333CE22c222112212111a1S."; /* const struct social_type open_path[] = { {"G",0} }; static void *thingy = 0; static int cur_line = 0; for (i=0; i < 1; i++) { if (*(open_path[cur_line].cmd) == '!') { i++; exec_social(ch, (open_path[cur_line].cmd)+1, open_path[cur_line].next_line, &cur_line, &thingy); } else { exec_social(ch, open_path[cur_line].cmd, open_path[cur_line].next_line, &cur_line, &thingy); } */ static char *path; static int index; static bool move = FALSE; void do_move(struct char_data *ch, char *argument, int cmd); void do_open(struct char_data *ch, char *argument, int cmd); void do_lock(struct char_data *ch, char *argument, int cmd); void do_unlock(struct char_data *ch, char *argument, int cmd); void do_close(struct char_data *ch, char *argument, int cmd); if (!move) { if (time_info.hours == 6) { move = TRUE; path = open_path; index = 0; } else if (time_info.hours == 20) { move = TRUE; path = close_path; index = 0; } } if (cmd || !move || (GET_POS(ch) < POSITION_SLEEPING) || (GET_POS(ch) == POSITION_FIGHTING)) return FALSE; switch (path[index]) { case '0' : case '1' : case '2' : case '3' : do_move(ch,"",path[index]-'0'+1); break; case 'W' : GET_POS(ch) = POSITION_STANDING; act("$n awakens and groans loudly.",FALSE,ch,0,0,TO_ROOM); break; case 'S' : GET_POS(ch) = POSITION_SLEEPING; act("$n lies down and instantly falls asleep.",FALSE,ch,0,0,TO_ROOM); break; case 'a' : act("$n says 'Hello Honey!'",FALSE,ch,0,0,TO_ROOM); act("$n smirks.",FALSE,ch,0,0,TO_ROOM); break; case 'b' : act("$n says 'What a view! I must get something done about that dump!'", FALSE,ch,0,0,TO_ROOM); break; case 'c' : act("$n says 'Vandals! Youngsters nowadays have no respect for anything!'", FALSE,ch,0,0,TO_ROOM); break; case 'd' : act("$n says 'Good day, citizens!'", FALSE, ch, 0,0,TO_ROOM); break; case 'e' : act("$n says 'I hereby declare the bazaar open!'",FALSE,ch,0,0,TO_ROOM); break; case 'E' : act("$n says 'I hereby declare Midgaard closed!'",FALSE,ch,0,0,TO_ROOM); break; case 'O' : do_unlock(ch, "gate", 0); do_open(ch, "gate", 0); break; case 'C' : do_close(ch, "gate", 0); do_lock(ch, "gate", 0); break; case '.' : move = FALSE; break; } index++; return FALSE; }