summaryrefslogtreecommitdiffstats
path: root/apps/plugins/goban/sgf.h
blob: d2aca81ebbb3c50f817f764e4b1d5ed70c6439fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2007-2009 Joshua Simmons <mud at majidejima dot com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/

#ifndef GOBAN_SGF_H
#define GOBAN_SGF_H

#include "types.h"

/* Play one move.  If play_mode is not PLAY_MODE_FORCE, this will fail if
   an illegal move is played (plays by the "wrong" color are not counted
   as illegal. pos may be a POS() on the board, or PASS_POS. Returns true
   if the move was successfully played. */
bool play_move_sgf (unsigned short pos, unsigned char color);

/* Add a stone to the board, or remove one if color == EMPTY. returns true
   if the stone is successfully added/removed (will return false if there
   is nothing to add/remove there, eg. when adding a black stone when a
   black stone is already there) */
bool add_stone_sgf (unsigned short pos, unsigned char color);

/* Add a mark to the board at the current node pos must be on the board
   Returns false on failure. */
bool add_mark_sgf (unsigned short pos, enum prop_type_t type);

/* Returns true if there are more nodes before or after (respectively) the
   current node */
bool has_prev_nodes_sgf (void);
bool has_more_nodes_sgf (void);

/* When at the start of a branch, this will follow one of the branches.
   Variations are numbered from 0. Returns false on failure. */
bool go_to_variation_sgf (unsigned int num);

/* Get the number of variations at the current move (will be 1 unless the
   current node is a branch node */
int num_variations_sgf (void);

/* Calls into the display subsystem to mark any child variations of the
   current node. Returns the number of variations marked */
int mark_child_variations_sgf (void);

/* Calls into the display subsystem to pass marks to be drawn on the board
   for the current node. Does not do child variation marks. */
void set_all_marks_sgf (void);

/* Add a child regardless of if there is a child node already or not.
   *variation_number will be set to the variation number of the added
   variation Returns the handle of the new node. */
int add_child_sgf (int *variation_number);

/* Goes to the next variation after the current one if the current node is
   a branch node. Returns the number of the new variation */
int next_variation_sgf (void);

/* ints in these are handles to storage locations, bools mean failure if
   false */
int add_prop_sgf (int node, enum prop_type_t type, union prop_data_t data);
bool delete_prop_sgf (int node, enum prop_type_t type);
bool delete_prop_handle_sgf (int node, int prop);
int get_prop_sgf (int node, enum prop_type_t type, int *previous_prop);

/* If there is already a property of the same type, it will be
   overwritten, otherwise a new one is added Returns the handle of the
   added property. */
int add_or_set_prop_sgf (int node, enum prop_type_t type,
                         union prop_data_t data);

/* Find a property of similar type with the same position in the current
   node. (for example, if type == PROP_ADD_BLACK and pos == POS(0, 0), it
   will find a prop with type == PROP_ADD_WHITE and pos == POS(0, 0), but
   not any of the mark types with pos == POS(0, 0). returns the handle of
   the found property */
int get_prop_pos_sgf (enum prop_type_t type, union prop_data_t data);

/* If there is a move in the current node, return its handle. */
int get_move_sgf (void);

/* If there is a comment in the current node, this will read it out into
   the buffer.  Returns the size of the comment read (including the '\0').
   The buffer can be treated as a string. */
int read_comment_sgf (char *buffer, size_t buffer_size);

/* Write a comment property to the current node.  This will overwrite any
   comment that currently exists. Returns the number of characters
   written. */
int write_comment_sgf (char *string);

/* Move forward or back in the SGF tree, following any chosen variations
   (variations are "chosen" every time you go through one) These will
   update the board showing any moves/added or removed stones/ marks/etc.
   . */
bool undo_node_sgf (void);
bool redo_node_sgf (void);

/* Returns true if the SGF property type is handled in some way.  For
 * real SGF properties (in other words, ones that can actually be read from
 * a file, not psuedo-properties), if they are unhandled that just means that
 * we copy them verbatim from the old file to the new, keeping them with the
 * correct node
 */
bool is_handled_sgf (enum prop_type_t type);

/* Sets up the handicap on the board (based on header.handicap) */
void setup_handicap_sgf (void);

/* Goes to the start of a handicap game. */
void goto_handicap_start_sgf (void);

/* Must be called after setting up a new game, either blank or loaded from
   a file. (Picks a place to put the header properties if none was found,
   and may do other stuff) */
bool post_game_setup_sgf (void);

/* Get the child that matches the given move.
 *
 * Returns the variation number of the matching move, or negative if
 * none is found.
 */
int get_matching_child_sgf (unsigned short pos, unsigned char color);

#define NO_NODE (-1)
#define NO_PROP (-1)

/* These flags are used in undo handling for moves and added/removed
   stones */
#define FLAG_ORIG_EMPTY ((uint8_t) (1 << 7))
#define FLAG_ORIG_BLACK ((uint8_t) (1 << 6))
#define FLAG_KO_THREAT  ((uint8_t) (1 << 5))
#define FLAG_SELF_CAP   ((uint8_t) (1 << 4))
#define FLAG_W_CAP      ((uint8_t) (1 << 3))
#define FLAG_E_CAP      ((uint8_t) (1 << 2))
#define FLAG_S_CAP      ((uint8_t) (1 << 1))
#define FLAG_N_CAP      ((uint8_t) (1))

#define MIN_STORAGE_BUFFER_SIZE 200
#define UNHANDLED_PROP_LIST_FILE (PLUGIN_GAMES_DIR "/gbn_misc.bin")

/* Handle of the current node, the start of the game, and the root
 * of the tree
 */
extern int current_node;
extern int tree_head;
extern int start_node;

extern int sgf_fd;
extern int unhandled_fd;

/* true if the header location has already been marked in the current
   game, false otherwise */
extern bool header_marked;

#endif