- else {
- /* Generate my next move. */
- float move_value;
- int move;
- if (autolevel_on)
- adjust_level_offset(mycolor);
- move = genmove(mycolor, &move_value, NULL);
- gnugo_play_move(move, mycolor);
- sgffile_add_debuginfo(sgftree.lastnode, move_value);
-
- if (is_pass(move)) {
- /* pass */
- sgftreeAddPlay(&sgftree, to_move, -1, -1);
- gmp_sendPass(ge);
- ++passes;
- }
- else {
- /* not pass */
- sgftreeAddPlay(&sgftree, to_move, I(move), J(move));
- gmp_sendMove(ge, J(move), I(move));
- passes = 0;
- TRACE("\nmy move: %1m\n\n", move);
- }
- sgffile_add_debuginfo(sgftree.lastnode, 0.0);
- sgffile_output(&sgftree);
+
+ gameinfo->computer_player = mycolor;
+ sgf_write_header(sgftree.root, 1, get_random_seed(), komi,
+ gameinfo->handicap, get_level(), chinese_rules);
+ gameinfo->handicap = gnugo_sethand(gameinfo->handicap, sgftree.root);
+ sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap);
+
+ /* main GMP loop */
+ while (passes < 2) {
+
+ if (to_move == yourcolor) {
+ int move;
+ /* Get opponent's move from gmp client. */
+ message = gmp_check(ge, 1, &j, &i, &error);
+
+ if (message == gmp_err) {
+ fprintf(stderr, "GNU Go: Sorry, error from gmp client\n");
+ sgftreeAddComment(&sgftree, "got error from gmp client");
+ sgffile_output(&sgftree);
+ return;
+ }
+
+ if (message == gmp_undo) {
+ int k;
+ assert(j > 0);
+
+ for (k = 0; k < j; k++) {
+ if (!undo_move(1)) {
+ fprintf(stderr, "GNU Go: play_gmp UNDO: can't undo %d moves\n",
+ j - k);
+ break;
+ }
+ sgftreeAddComment(&sgftree, "undone");
+ sgftreeBack(&sgftree);
+ to_move = OTHER_COLOR(to_move);
+ }
+ continue;
+ }
+
+ if (message == gmp_pass) {
+ passes++;
+ move = PASS_MOVE;
+ } else {
+ passes = 0;
+ move = POS(i, j);
+ }
+
+ TRACE("\nyour move: %1m\n\n", move);
+ sgftreeAddPlay(&sgftree, to_move, I(move), J(move));
+ gnugo_play_move(move, yourcolor);
+ sgffile_output(&sgftree);
+
+ } else {
+ /* Generate my next move. */
+ float move_value;
+ int move;
+ if (autolevel_on)
+ adjust_level_offset(mycolor);
+ move = genmove(mycolor, &move_value, NULL);
+ gnugo_play_move(move, mycolor);
+ sgffile_add_debuginfo(sgftree.lastnode, move_value);
+
+ if (is_pass(move)) {
+ /* pass */
+ sgftreeAddPlay(&sgftree, to_move, -1, -1);
+ gmp_sendPass(ge);
+ ++passes;
+ } else {
+ /* not pass */
+ sgftreeAddPlay(&sgftree, to_move, I(move), J(move));
+ gmp_sendMove(ge, J(move), I(move));
+ passes = 0;
+ TRACE("\nmy move: %1m\n\n", move);
+ }
+ sgffile_add_debuginfo(sgftree.lastnode, 0.0);
+ sgffile_output(&sgftree);
+ }
+
+ to_move = OTHER_COLOR(to_move);