\ExplSyntaxOn
\usepackage{tikz}



%MARK
\int_new:N\l_pgfgo_mark_sequence_current_int
\int_set:Nn\l_pgfgo_mark_sequence_current_int{1}




\bool_set_false:N\l_pgfgo_mark_color_bool
\bool_set_false:N\l_pgfgo_players_mark_fill_bool
\bool_set_false:N\l_pgfgo_mark_hatched_lines_bool
\bool_set_false:N\l_pgfgo_mark_t_bool

\tl_set:Nn\l_pgfgo_mark_custom_tl{!}


\cs_new:Nn\pgfgo_mark_current:{}


\keys_define:nn { pgfgo / mark }{
	forget						.code:n	=	{\bool_set_false:N\l_pgfgo_goban_remember_mark_bool},
	forget						.groups:n	=	{preset},
	
	remember					.code:n	=	{\bool_set_true:N\l_pgfgo_goban_remember_mark_bool},
	remember					.groups:n	=	{preset},
	
	circle				.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_circle:},
	circle				.groups:n		=	{ shape },

	triangle			.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_triangle:},
	triangle			.groups:n		=	{ shape },

	square				.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_square:},
	square				.groups:n		=	{ shape },
	
	cross					.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_cross:},
	cross					.groups:n		=	{ shape },

	filled~square	.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_filled_square:},
	filled~square	.groups:n		=	{ shape },

	filled~circle	.code:n			=	{\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_filled_circle:},
	filled~circle	.groups:n		=	{ shape },

	t-circle			.code:n			= {
		\bool_set_true:N\l_pgfgo_mark_t_bool
		\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_t_circle:
		},
	
	t-circle			.groups:n		=	{ shape },

	t-square			.code:n			= {
		\bool_set_true:N\l_pgfgo_mark_t_bool
		\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_t_square:
	},
	
	t-square			.groups:n		=	{ shape },

	hatched~lines	.code:n			=	{
		\bool_set_true:N\l_pgfgo_mark_hatched_lines_bool
		\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_hatched_lines:
	},
	
	hatched~lines		.groups:n		=	{ shape },

	custom					.code:n			= {
																\tl_set:Nn\l_pgfgo_mark_custom_tl{#1}
																\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_custom:
															},
	
	hatched~lines		.groups:n		=	{ shape },

	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%-------------------OTRAS KEYS---------------------%
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	
	black				.code:n		=	{
		\bool_set_true:N	\l_pgfgo_players_black_bool
		\bool_set_false:N	\l_pgfgo_players_white_bool
		\bool_set_false:N	\l_pgfgo_players_neutral_bool
	},
	black				.groups:n = { player-id },
	b						.code:n	= {\keys_set:nn{ pgfgo / mark }{black}},
	b						.groups:n = { player-id },
	
	
	white				.code:n		=	{
		\bool_set_true:N	\l_pgfgo_players_white_bool
		\bool_set_false:N	\l_pgfgo_players_black_bool
		\bool_set_false:N	\l_pgfgo_players_neutral_bool
	},
	white				.groups:n = { player-id },
	w						.code:n	= {\keys_set:nn{ pgfgo / mark }{white}},
	w						.groups:n = { player-id },
	
	neutral				.code:n		=	{
		\bool_set_false:N	\l_pgfgo_players_white_bool
		\bool_set_false:N	\l_pgfgo_players_black_bool
		\bool_set_true:N	\l_pgfgo_players_neutral_bool
	},
	neutral				.groups:n = { player-id },
	n						.code:n	= {\keys_set:nn{ pgfgo / mark }{white}},
	n						.groups:n = { player-id },
}











%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------------------------MARCAS-------------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\cs_set:Nn\pgfgo_mark_circle: {
	\pgfsetstrokecolor{\l_pgfgo_players_mark_line_color_tl}
	\pgfsetlinewidth{\l_pgfgo_players_mark_line_width_dim}
	
	\pgfpathcircle{\pgfpointorigin}{\l_pgfgo_players_stone_radius_dim * 0.6}
	
	\pgfusepath{stroke}
}







\cs_set:Nn\pgfgo_mark_triangle: {
	\pgfsetstrokecolor{\l_pgfgo_players_mark_line_color_tl}
	\pgfsetlinewidth{\l_pgfgo_players_mark_line_width_dim}
	
	\pgfpathmoveto{\pgfpoint{0}{\l_pgfgo_players_stone_radius_dim * 0.6}}
	\pgfpathlineto{\pgfpoint{-\l_pgfgo_players_stone_radius_dim * 0.866 * 0.6}{-\l_pgfgo_players_stone_radius_dim * 0.5 * 0.6}}
	\pgfpathlineto{\pgfpoint{\l_pgfgo_players_stone_radius_dim * 0.866 * 0.6}{-\l_pgfgo_players_stone_radius_dim * 0.5 * 0.6}}
	\pgfpathclose
	
	\pgfusepath{stroke}
}





\cs_set:Nn\pgfgo_mark_square: {
	\pgfsetstrokecolor{\l_pgfgo_players_mark_line_color_tl}
	\pgfsetlinewidth{\l_pgfgo_players_mark_line_width_dim}
	
	\pgfpathrectanglecorners
		{\pgfpoint{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}
		{\pgfpoint{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}

	\pgfusepath{stroke}
}



\cs_set:Nn\pgfgo_mark_hatched_lines: {
	\bool_if:NTF\l_pgfgo_players_mark_fill_bool{
		\pgfsetfillpattern{north~west~lines}{\l_pgfgo_players_mark_fill_color_tl}}{
		\pgfsetfillpattern{north~west~lines}{gray}}
	
	\pgfpathrectanglecorners
		{\pgfpoint{\l_pgfgo_players_stone_radius_dim}{\l_pgfgo_players_stone_radius_dim}}
		{\pgfpoint{-\l_pgfgo_players_stone_radius_dim}{-\l_pgfgo_players_stone_radius_dim}}

	\pgfusepath{fill}
}

\cs_set:Nn\pgfgo_mark_filled_square: {
	\bool_if:NTF\l_pgfgo_players_mark_fill_bool
		{\pgfsetfillcolor{\l_pgfgo_players_mark_fill_color_tl}}
		{\pgfsetfillcolor{gray}}
	
	\pgfpathrectanglecorners
		{\pgfpoint{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.5}{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.5}}
		{\pgfpoint{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.5}{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.5}}

	\pgfusepath{fill}
}

\cs_set:Nn\pgfgo_mark_filled_circle: {
	\bool_if:NTF\l_pgfgo_players_mark_fill_bool
		{\pgfsetfillcolor{\l_pgfgo_players_mark_fill_color_tl}}
		{\pgfsetfillcolor{gray}}
	
	\pgfpathcircle{\pgfpointorigin}{\l_pgfgo_players_stone_radius_dim * 0.5}

	\pgfusepath{fill}
}

\cs_set:Nn\pgfgo_mark_cross: {
	\pgfsetstrokecolor{\l_pgfgo_players_mark_line_color_tl}
	\pgfsetlinewidth{\l_pgfgo_players_mark_line_width_dim}
	
	\pgfpathmoveto{\pgfpoint{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}
	\pgfpathlineto{\pgfpoint{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}
	\pgfpathmoveto{\pgfpoint{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}
	\pgfpathlineto{\pgfpoint{\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}{-\l_pgfgo_players_stone_radius_dim * 0.7071 * 0.6}}

	\pgfusepath{stroke}
}

\cs_set_eq:NN\pgfgo_mark_current:\pgfgo_mark_cross:



\cs_set:Nn\pgfgo_mark_custom: {
	%Ajustar el tamano de acuerdo a la cantidad de caracteres <--------
	\tl_set:Nn\l_tmpa_tl{0.45em}
	\regex_count:nVN{.}\l_pgfgo_mark_custom_tl\l_tmpa_int
	\int_case:nn{\l_tmpa_int}{
		{1}{\tl_set:Nn\l_tmpa_tl{1em}}
		{2}{\tl_set:Nn\l_tmpa_tl{0.65em}}
		{3}{\tl_set:Nn\l_tmpa_tl{0.45em}}
	}
	%------------------------------------------------------------------

	\pgfsetcolor{\l_pgfgo_players_mark_line_color_tl}
	\pgftext{{
			\fontsize{\l_tmpa_tl}{0pt}\selectfont
			\l_pgfgo_players_mark_label_font_tl
			\textcolor{\l_pgfgo_players_mark_label_color_tl}{\l_pgfgo_mark_custom_tl}}}

	\pgfusepath{stroke}
}

\cs_set:Nn\pgfgo_mark_t_circle: {
	\pgfsetstrokecolor{\l_pgfgo_goban_grid_color_tl}
	\pgfsetlinewidth{\l_pgfgo_goban_grid_line_width_dim}
	\pgfsetfillcolor{\l_pgfgo_players_stone_fill_color_tl}
	\pgfsetstrokeopacity{\l_pgfgo_goban_grid_opacity_tl}

	\pgfpathcircle{\pgfpointorigin}{\l_pgfgo_players_stone_radius_dim * 0.35}

	\pgfusepath{stroke, fill}
}


\cs_set:Nn\pgfgo_mark_t_square: {
	\pgfsetstrokecolor{\l_pgfgo_goban_grid_color_tl}
	\pgfsetlinewidth{\l_pgfgo_goban_grid_line_width_dim}
	\pgfsetfillcolor{\l_pgfgo_players_stone_fill_color_tl}
	\pgfsetstrokeopacity{\l_pgfgo_goban_grid_opacity_tl}

	\pgfpathrectanglecorners
		{\pgfpointpolar{45}{\l_pgfgo_players_stone_radius_dim * 0.25 * 1.41}}
		{\pgfpointpolar{225}{\l_pgfgo_players_stone_radius_dim * 0.25 * 1.41}}
	\pgfusepath{stroke, fill}
}



\cs_set:Nn\pgfgo_mark_sequence: {
	%Ajustar el tamano de acuerdo a la cantidad de caracteres <--------
	\tl_set:Nn\l_tmpa_tl{0.45em}
	\tl_set:Nx\l_tmpb_tl{\pgfgo_players_mark_sequence_format:n{\l_pgfgo_mark_sequence_current_int}}
	\regex_count:nVN{[a-zA-Z\d]}\l_tmpb_tl\l_tmpa_int
	\int_case:nn{\l_tmpa_int}{
		{1}{\tl_set:Nn\l_tmpa_tl{0.7em}}
		{2}{\tl_set:Nn\l_tmpa_tl{0.65em}}
		{3}{\tl_set:Nn\l_tmpa_tl{0.45em}}
	}
	%------------------------------------------------------------------
	\pgfsetcolor{\l_pgfgo_players_mark_label_color_tl}
	\pgftext{{
			\fontsize{\l_tmpa_tl}{0pt}\selectfont
			\l_pgfgo_players_mark_label_font_tl
			\pgfgo_players_mark_sequence_format:n{\l_pgfgo_mark_sequence_current_int}
	}}
	\pgfusepath{stroke}

	\int_gincr:N\l_pgfgo_mark_sequence_current_int
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------------------------MARCA--------------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\cs_set_protected:Npn\pgfgo_mark:nnn #1#2#3 {
	\group_begin:
	
	\keys_set_groups:nnn{ pgfgo / mark }{ player-id }{#1}
	\bool_if:NTF \l_pgfgo_players_black_bool 
	{\keys_set_exclude_groups:nnn{ pgfgo / players / black / mark } { external }{#1}}
	{\bool_if:NTF \l_pgfgo_players_white_bool 
		{\keys_set_exclude_groups:nnn{ pgfgo / players / white / mark } { external } {#1}}
		{\keys_set_exclude_groups:nnn{ pgfgo / players / neutral / mark } { external } {#1}}}
	\pgfgo_get_variables_from_current_player:
	\keys_set_groups:nnn {pgfgo / mark} { shape } {#1}
	
	

	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%---------------------SHADOW-----------------------%
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	\bool_if:NF\l_pgfgo_mark_t_bool{
		\pgfonlayer{pgfgo_layer_mark_shadow}
		\pgfsetfillcolor{\l_pgfgo_goban_border_fill_color_tl}

		\bool_if:NTF\l_pgfgo_mark_hatched_lines_bool{
			\tl_set:Nn\l_pgfgo_mark_shadow_scale{1}
		}{
			\tl_set:Nn\l_pgfgo_mark_shadow_scale{0.8}
		}
		
		\pgftransformshift{\pgfpointxy{#2}{#3}}
		\pgfpathcircle{\pgfpointorigin}{\l_pgfgo_players_stone_radius_dim * \l_pgfgo_mark_shadow_scale}

		\pgfusepath{fill}
		\endpgfonlayer
	}

	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%---------------------MARCA------------------------%
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	\pgftransformshift{\pgfpointxy{#2}{#3}}
	\pgfonlayer{pgfgo_layer_mark}
	\bool_if:NTF \l_pgfgo_players_mark_sequence_bool {
		\pgfgo_mark_sequence:
	}{
		\pgfgo_mark_current:
	}
	
	\endpgfonlayer
	\pgftransformreset
	\group_end:
}


\cs_generate_variant:Nn\pgfgo_mark:nnn  {nee}
\cs_new:Nn \pgfgo_mark:nn {\pgfgo_mark:nnn{#1}#2}
\cs_generate_variant:Nn\pgfgo_mark:nn {nV}




\cs_new:Nn \pgfgo_marks_parsed:nn {
	\clist_map_variable:nNn {#2} \variable {\pgfgo_mark:nV{#1}\variable}
}



%\l_pgfgo_mark_sequence_current_int

\cs_set_protected:Npn\pgfgo_marks:nn #1#2 {
	\group_begin:
		\keys_set_groups:nnn{ pgfgo / mark }{ preset }{#1}
		\pgfgo_coordinate_parser_from_pgfgonce_to_items:n{#2}
		%RECORDAR LAS PIEDAS
		\clist_set_from_seq:NN \l_tmpa_clist\l_pgfgo_coordinate_parser_items_from_pgfgonce_seq
		\bool_if:NT \l_pgfgo_goban_remember_mark_bool {
			\seq_gput_right:Ne \l_pgfgo_goban_elements_stack_seq {\exp_not:N\pgfgo_marks_parsed:nn{#1}{\l_tmpa_clist}}
		}
		
		\keys_set_exclude_groups:nnn{ pgfgo / players / neutral / mark } { external }{#1}
		\int_set:NV\l_pgfgo_mark_sequence_current_int\l_pgfgo_neutral_mark_sequence_from_int
		
		 %Devuelve \l_pgfgo_coordinate_parser_items_from_pgfgonce_seq
		
		\seq_map_variable:NNn \l_pgfgo_coordinate_parser_items_from_pgfgonce_seq\variable{
			\pgfgo_mark:nV{#1}\variable
		}
	\group_end:
}



\DeclareDocumentCommand{\marks}{O{}m}{\pgfgo_marks:nn{#1}{#2}}

\let\mark\marks



\ExplSyntaxOff