171 lines
6.6 KiB
C
171 lines
6.6 KiB
C
|
/***************************************************************************
|
||
|
* __________ __ ___.
|
||
|
* 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
|