/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
 * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
 * http://www.gnu.org/software/gnugo/ for more information.          *
 *                                                                   *
 * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
 * 2008 and 2009 by the Free Software Foundation.                    *
 *                                                                   *
 * 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 - version 3 or          *
 * (at your option) any later version.                               *
 *                                                                   *
 * This program is distributed in the hope that it will be useful,   *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
 * GNU General Public License in file COPYING for more details.      *
 *                                                                   *
 * You should have received a copy of the GNU General Public         *
 * License along with this program; if not, write to the Free        *
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
 * Boston, MA 02111, USA.                                            *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* values for move_reason.type */
#define THREAT_BIT    1

/* Only use even values for non-threat move reasons! */
#define ATTACK_MOVE              2
#define ATTACK_MOVE_GOOD_KO      4
#define ATTACK_MOVE_BAD_KO       6
#define ATTACK_THREAT           (ATTACK_MOVE | THREAT_BIT)
#define DEFEND_MOVE              8
#define DEFEND_MOVE_GOOD_KO     10
#define DEFEND_MOVE_BAD_KO      12
#define DEFEND_THREAT           (DEFEND_MOVE | THREAT_BIT)

#define CONNECT_MOVE            14
#define CUT_MOVE                16

#define SEMEAI_MOVE             18
#define SEMEAI_THREAT           (SEMEAI_MOVE | THREAT_BIT)

#define EXPAND_TERRITORY_MOVE   20
#define EXPAND_MOYO_MOVE        22
#define INVASION_MOVE           24

#define OWL_ATTACK_MOVE         26
#define OWL_ATTACK_MOVE_GOOD_KO 28
#define OWL_ATTACK_MOVE_BAD_KO  30
#define OWL_ATTACK_THREAT       (OWL_ATTACK_MOVE | THREAT_BIT)
#define OWL_DEFEND_MOVE         32
#define OWL_DEFEND_MOVE_GOOD_KO 34
#define OWL_DEFEND_MOVE_BAD_KO  36
#define OWL_DEFEND_THREAT       (OWL_DEFEND_MOVE | THREAT_BIT)
#define OWL_PREVENT_THREAT      38
#define UNCERTAIN_OWL_ATTACK    40
#define UNCERTAIN_OWL_DEFENSE   42
#define STRATEGIC_ATTACK_MOVE   44
#define STRATEGIC_DEFEND_MOVE   46

#define MY_ATARI_ATARI_MOVE     50
#define YOUR_ATARI_ATARI_MOVE   52
#define VITAL_EYE_MOVE          54

#define OWL_ATTACK_MOVE_GAIN    60
#define OWL_DEFEND_MOVE_LOSS    62
#define POTENTIAL_SEMEAI_ATTACK	64
#define POTENTIAL_SEMEAI_DEFENSE 66

#define ANTISUJI_MOVE           70

#define EITHER_MOVE             100
#define ALL_MOVE                102


/* Bitmap values for move_reason.status */
#define ACTIVE                  0
#define TERRITORY_REDUNDANT     1
#define STRATEGICALLY_REDUNDANT 2
#define REDUNDANT               (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT)
#define SECONDARY               4

#define MAX_REASONS 120

#define MAX_TRACE_LENGTH  160

#define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD

struct move_reason {
  int type;   /* e.g. attack, defend, or connect */
  int what;   /* pointer into list of strings, list of pair of dragons,
		 or similar */
  int status; /* This is a bitmap to mark redundant or secondary
                 move reasons. */
};

struct move_data {
  float value;    /* total comparison value, computed at the very end */
  float final_value; /* value after point redistribution. */
  float additional_ko_value; /* Additional threat value if ko fight going on.*/

  float territorial_value; /* Value in terms of actual profit. */
  float strategical_value; /* Value with respect to strength, weakness, and
			      safety of all groups on the board. */

  float maxpos_shape;      /* Maximal positive contribution to shape */
  float maxneg_shape;      /* Maximal negative contribution to shape */
  int numpos_shape;        /* Number of positive contributions to shape */
  int numneg_shape;        /* Number of negative contributions to shape */

  float followup_value;    /* Value of followup move (our sente). */
  float influence_followup_value;  /* Followup value of move as reported by
                                      experimental influence. */
  float reverse_followup_value;	/* Value of opponents followup move
				   (reverse sente). */
  float secondary_value;      /* Secondary move value. */
  float min_value;            /* Minimum allowed value for the move. */
  float max_value;            /* Maximum allowed value for the move. */
  float min_territory;        /* Minimum territorial value. */
  float max_territory;        /* Maximum territorial value. */
  float randomness_scaling;   /* Increase to randomize this move. */

  int reason[MAX_REASONS]; /* List of reasons for a move. */
  int move_safety;         /* Whether the move seems safe. */
  int worthwhile_threat;   /* Play this move as a pure threat. */
  float random_number;     /* Random number connected to this move. */
};



/*
 * Some sizes.  
 *
 * FIXME: Many of these could be optimized more for size (e.g. MAX_EYES)
 */

#define MAX_MOVE_REASONS	1000
#define MAX_WORMS		2*MAX_BOARD*MAX_BOARD/3
#define MAX_DRAGONS		MAX_WORMS
#define MAX_CONNECTIONS 	4*MAX_WORMS
#define MAX_POTENTIAL_SEMEAI	50
#define MAX_EYES		MAX_BOARD*MAX_BOARD/2
#define MAX_LUNCHES		MAX_WORMS
#define MAX_EITHER		100
#define MAX_ALL 		100
#define MAX_ATTACK_THREATS	6


extern struct move_data move[BOARDMAX];
extern struct move_reason move_reasons[MAX_MOVE_REASONS];
extern int next_reason;

/* Connections */
extern int conn_worm1[MAX_CONNECTIONS];
extern int conn_worm2[MAX_CONNECTIONS];
extern int next_connection;

extern int semeai_target1[MAX_POTENTIAL_SEMEAI];
extern int semeai_target2[MAX_POTENTIAL_SEMEAI];

/* Unordered sets (currently pairs) of move reasons / targets */
typedef struct {
  int reason1;
  int what1;
  int reason2;
  int what2;
} Reason_set;
extern Reason_set either_data[MAX_EITHER];
extern int        next_either;
extern Reason_set all_data[MAX_ALL];
extern int        next_all;

/* Eye shapes */
extern int eyes[MAX_EYES];
extern int eyecolor[MAX_EYES];
extern int next_eye;

/* Lunches */
extern int lunch_dragon[MAX_LUNCHES]; /* eater */
extern int lunch_worm[MAX_LUNCHES];   /* food */
extern int next_lunch;

/* Point redistribution */
extern int replacement_map[BOARDMAX];

/* The color for which we are evaluating moves. */
extern int current_color;

int find_worm(int str);
int find_dragon(int str);
   
int move_reason_known(int pos, int type, int what);
int attack_move_reason_known(int pos, int what);
int defense_move_reason_known(int pos, int what);
int owl_attack_move_reason_known(int pos, int what);
int owl_defense_move_reason_known(int pos, int what);
int owl_move_reason_known(int pos, int what);
int semeai_move_reason_known(int pos, int what);
int get_biggest_owl_target(int pos);
int is_antisuji_move(int pos);

void discard_redundant_move_reasons(int pos);

void mark_changed_dragon(int pos, int color, int affected, int affected2,
			 int move_reason_type,
			 signed char safe_stones[BOARDMAX],
			 float strength[BOARDMAX], float *effective_size);
void mark_changed_string(int affected, signed char changed_stones[BOARDMAX],
			 float strength[BOARDMAX], signed char new_status);
int adjacent_to_nondead_stone(int pos, int color);

int find_connection(int worm1, int worm2);

/*
 * Local Variables:
 * tab-width: 8
 * c-basic-offset: 2
 * End:
 */