\ExplSyntaxOn \usepackage{pgf} %STONE \bool_set_false:N\l_pgfgo_stone_mark_bool %MOVE \int_new:N\l_pgfgo_move_from_int \int_set:Nn\l_pgfgo_move_from_int{1} \int_new:N\l_pgfgo_move_current_int \int_set:Nn\l_pgfgo_move_current_int{1} %MIDE LOS INTERCALOS ENTRE LOS MOVIMIENTOS \bool_set_true:N\l_pgfgo_move_player_black_bool \bool_set_false:N\l_pgfgo_move_player_white_bool \tl_new:N \l_pgfgo_stones_mark_tl \bool_set_false:N\l_pgfgo_prisoner_bool \keys_define:nn { pgfgo / stone }{ forget .code:n = {\bool_set_false:N\l_pgfgo_goban_remember_stone_bool}, forget .groups:n = {preset}, remember .code:n = {\bool_set_true:N\l_pgfgo_goban_remember_stone_bool}, remember .groups:n = {preset}, 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 / stone }{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 / stone }{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 / stone }{white}}, n .groups:n = { player-id }, mark .code:n = { \pgfgo_mark:nee{#1}{\l_pgfgo_parsed_x_coordinate_tl}{\l_pgfgo_parsed_y_coordinate_tl} }, mark .groups:n = {mark} } \keys_define:nn { pgfgo / move} { forget .code:n = {\bool_set_false:N\l_pgfgo_goban_remember_move_bool}, forget .groups:n = {preset, local}, remember .code:n = { \bool_set_true:N\l_pgfgo_goban_remember_move_bool}, remember .groups:n = {preset, local}, black .code:n = { \bool_set_true:N\l_pgfgo_players_black_bool \bool_set_false:N\l_pgfgo_players_white_bool }, black .groups:n = {player-id}, b .code:n = {\keys_set:nn{ pgfgo / move }{black}}, b .groups:n = { player-id, local }, white .code:n = { \bool_set_false:N\l_pgfgo_players_black_bool \bool_set_true:N\l_pgfgo_players_white_bool }, white .groups:n = { player-id }, w .code:n = {\keys_set:nn{ pgfgo / move }{white}}, w .groups:n = { player-id, local }, from .code:n = { \int_set:Nn\l_pgfgo_move_from_int{#1} \int_set:Nn\l_pgfgo_move_current_int{\int_use:N\l_pgfgo_move_from_int} }, from .groups:n = {first stone, preset, local}, } \keys_set:nn { pgfgo / move} {black} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------PIEDRA-------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new:Nn \pgfgo_stones_shine_default: { \pgfscope \pgfsetfillopacity{\fp_use:N\l_pgfgo_players_stone_drop_shine_opacity_fp} \pgftransformrotate{-45} \pgftransformrotate{\l_pgfgo_players_stone_drop_shine_angle_fp} \pgfsetfillcolor{\l_pgfgo_players_stone_drop_shine_color_tl} \fp_set:Nn\l_tmpa_fp{0.8} \pgfpathmoveto{\pgfpointpolar{135}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp}} \pgfpatharc{135}{190}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp} \pgfpathquadraticcurveto{\pgfpointpolar{135}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp}}{\pgfpointpolar{80}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp}} \pgfpatharc{80}{135}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp} \pgfpathclose \pgfusepath{fill} \pgfsetfillcolor{\l_pgfgo_players_stone_drop_shine_color_tl} \pgftransformshift{\pgfpointpolar{-45}{\fp_use:N\l_tmpa_fp * \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp}} \pgftransformrotate{45} \pgfpathellipse{\pgfpointorigin}{\pgfpoint{0.04cm}{0cm}}{\pgfpoint{0cm}{0.01cm}} \pgfusepath{fill} \endpgfscope } \cs_set:Nn\pgfgo_stone_set_render_options:{ \pgfonlayer{pgfgo_layer_stone} \pgfsetfillcolor{\l_pgfgo_players_stone_fill_color_tl} \pgfsetfillopacity{\fp_use:N\l_pgfgo_players_stone_fill_opacity_fp} \pgfsetstrokecolor{\l_pgfgo_players_stone_line_color_tl} \pgfsetstrokeopacity{\fp_use:N\l_pgfgo_players_stone_line_opacity_fp} \endpgfonlayer } \cs_set:Nn\pgfgo_stone_default_shape:{ \pgftransparencygroup %SOMBRA \bool_if:NT\l_pgfgo_players_stone_drop_shadow_bool{ \pgfscope \pgfsetfillopacity{\fp_use:N\l_pgfgo_players_stone_drop_shadow_opacity_fp} \pgfsetfillcolor{black} \pgftransformshift{\pgfpointpolar{\fp_use:N\l_pgfgo_players_stone_drop_shadow_angle_fp}{\dim_use:N\l_pgfgo_players_stone_drop_shadow_offset_dim}} \pgfpathcircle{ \pgfpointorigin}{ \l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp } \pgfusepath{fill} \pgftransformreset \endpgfscope } %PIEDRA\\ \pgfsetlinewidth{\l_pgfgo_players_stone_line_width_dim * \fp_use:N \l_pgfgo_players_stone_scale_fp} \pgfpathcircle{\pgfpointorigin}{\l_pgfgo_players_stone_radius_dim * \fp_to_decimal:N\l_pgfgo_players_stone_scale_fp} \pgfusepath{\bool_if:NT\l_pgfgo_players_stone_line_bool{stroke},\bool_if:NT\l_pgfgo_players_stone_fill_bool{fill}} %SHINE \bool_if:NT \l_pgfgo_players_stone_drop_shine_bool { \pgfscope \pgfgo_stones_shine_default: \endpgfscope } \endpgftransparencygroup } \cs_set:Nn\pgfgo_stone_render_shape:{ \pgfonlayer{pgfgo_layer_stone} \pgfgo_stone_default_shape: \endpgfonlayer } \cs_set_protected:Npn\pgfgo_stone:nnn #1#2#3 { \group_begin: \pgfgo_parse_coordinate:n {#2} \keys_set_groups:nnn{ pgfgo / stone }{ player-id }{#1} \bool_if:NTF \l_pgfgo_players_black_bool {\keys_set_exclude_groups:nnn{ pgfgo / players / black / stone } { external } {#1}} {\bool_if:NTF \l_pgfgo_players_white_bool {\keys_set_exclude_groups:nnn{ pgfgo / players / white / stone } { external } {#1}} {\keys_set_exclude_groups:nnn{ pgfgo / players / neutral / stone } { external } {#1}}} \keys_set_groups:nnn{ pgfgo / stone }{ at-end }{#1} \pgfgo_get_variables_from_current_player: \pgfgo_stone_set_render_options: \pgfscope \pgftransformshift{\pgfpointxy{#2}{#3}} \pgfgo_stone_render_shape: \endpgfscope \tl_set:Nn\l_pgfgo_parsed_x_coordinate_tl{#2} \tl_set:Nn\l_pgfgo_parsed_y_coordinate_tl{#3} %-----MARCAS------------------------- \pgfscope \keys_set_groups:nnn {pgfgo / stone} {mark} {#1} \endpgfscope \group_end: } \cs_generate_variant:Nn \pgfgo_stone:nnn {Vnn} \cs_new:Nn \pgfgo_stone:nn {\pgfgo_stone:nnn{#1}#2} \cs_generate_variant:Nn\pgfgo_stone:nn {nV} \cs_generate_variant:Nn\pgfgo_stone:nn {nf} \DeclareDocumentCommand{\stone}{O{}m}{ \keys_set_groups:nnn{ pgfgo / stone }{ preset }{#1} \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 \regex_extract_all:NnN\l_pgfgo_coordinate_parser_subset_AN_regex{#2}\l_tmpa_seq \seq_if_empty:NF \l_tmpa_seq { \pgfgo_coordinate_parser_AN:ff{\seq_item:Nn \l_tmpa_seq {2}}{\seq_item:Nn \l_tmpa_seq {3}} %Devuelve \l_pgfgo_coordinate_parser_inmediate_seq %RECORDAR LAS PIEDAS \bool_if:NT \l_pgfgo_goban_remember_stone_bool { \seq_gput_right:Ne \l_pgfgo_goban_elements_stack_seq { \exp_not:N\pgfgo_stone:nf{#1}{\seq_item:Nn \l_pgfgo_coordinate_parser_inmediate_seq {1}}} } \pgfgo_stone:nf{#1}{\seq_item:Nn \l_pgfgo_coordinate_parser_inmediate_seq {1}} } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------PIEDRAS------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new:Nn \pgfgo_stones_parsed:nn { \clist_map_variable:nNn {#2} \variable {\pgfgo_stone:nV{#1}\variable} } \cs_set:Npn\pgfgo_stones:nn #1#2 { \group_begin: \pgfgo_coordinate_parser_from_pgfgonce_to_items:n{#2} %Devuelve \l_pgfgo_coordinate_parser_items_from_pgfgonce_seq \keys_set_groups:nnn{ pgfgo / stone }{ preset }{#1} %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_stone_bool { \seq_gput_right:Ne \l_pgfgo_goban_elements_stack_seq {\exp_not:N\pgfgo_stones_parsed:nn{#1}{\l_tmpa_clist}} } \seq_map_variable:NNn \l_pgfgo_coordinate_parser_items_from_pgfgonce_seq\variable { %DIBUJAR LAS PIEDRAS \pgfgo_stone:nV{#1}\variable } \group_end: } \cs_generate_variant:Nn\pgfgo_stones:nn{nx} \NewDocumentCommand{\stones}{O{}m}{\pgfgo_stones:nn {#1}{#2}} %\let\stone\stones %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------PRISIONEROS--------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NewDocumentCommand{\prisoners}{O{}m}{\stones[prisoner, #1]{#2}} \NewDocumentCommand{\prisoner}{O{}m}{\stone[prisoner, #1]{#2}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %-------------------------------------------MOVE------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_set_protected:Npn\pgfgo_move:nnnn #1#2#3#4 { \group_begin: \pgfgo_get_variables_from_current_player: \tl_set:Nn\l_pgfgo_move_x_int{#3} \tl_set:Nn\l_pgfgo_move_y_int{#4} %CALCULA Y ALTERNA LOS COLORES \bool_if:NT\l_pgfgo_players_black_bool{ \keys_set_exclude_groups:nnn {pgfgo / players / black / move} {external} {#2} \pgfgo_get_variables_from_current_player: \pgfgo_stone:nnn{black}{#3}{#4} } \bool_if:NT\l_pgfgo_players_white_bool{ \keys_set_exclude_groups:nnn {pgfgo / players / white / move} {external} {#2} \pgfgo_get_variables_from_current_player: \pgfgo_stone:nnn{white}{#3}{#4} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------LABEL-----------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \tl_set:Ne \l_tmpb_tl {\pgfgo_players_move_label_format:n{\l_pgfgo_move_current_int}} \tl_set:Nn\l_tmpa_tl{0.45em} %Ajustar el tamano de acuerdo a la cantidad de caracteres <-------- \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{1em}} {2}{\tl_set:Nn\l_tmpa_tl{0.65em}} {3}{\tl_set:Nn\l_tmpa_tl{0.45em}} } %------------------------------------------------------------------ \IfBooleanT{#1}{ \pgfscope %TOMA EL COLOR CALCULADO ARRIBA \pgfsetcolor{\l_pgfgo_players_move_label_color_tl} \pgftext[at=\pgfpointxy{\l_pgfgo_move_x_int}{\l_pgfgo_move_y_int}]{ \bfseries\fontsize{ \l_tmpa_tl }{0pt}\selectfont \pgfgo_players_move_label_format:n{\l_pgfgo_move_current_int} } \pgfusepath{stroke} \endpgfscope } \int_gincr:N\l_pgfgo_move_current_int \group_end: \bool_gset_inverse:N\l_pgfgo_players_black_bool \bool_gset_inverse:N\l_pgfgo_players_white_bool } \cs_new:Nn\pgfgo_move:nnn{\pgfgo_move:nnnn{#1}{#2}#3} \cs_generate_variant:Nn \pgfgo_move:nnn {nnV} \cs_generate_variant:Nn\tl_count:n {x} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %-------------------------------------------MOVES-----------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new:Nn \pgfgo_move_parsed:nnn { \keys_set_groups:nnn { pgfgo / move} {player-id, first stone} {#2} \clist_map_variable:nNn {#3} \variable {\pgfgo_move:nnV{#1}{#2}\variable} } \NewDocumentCommand{\moves}{sO{}m}{ \group_begin: \pgfgo_coordinate_parser_from_pgfgonce_to_items:n{#3} %Devuelve \l_pgfgo_coordinate_parser_items_from_group_seq %Eliminar la key from para que no la usen las marcas posteriores. \keys_set_groups:nnn { pgfgo / move} {player-id, first stone} {#2} \keys_set_groups:nnn { pgfgo / players / neutral / move} { label } {#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_move_bool { \bool_if:NTF \l_pgfgo_goban_remember_move_label_bool{ \seq_gput_right:Ne \l_pgfgo_goban_elements_stack_seq { \exp_not:N\pgfgo_move_parsed:nnn{\exp_not:N \BooleanTrue}{from = \int_use:N\l_pgfgo_move_current_int, #2}{\l_tmpa_clist} } } { \seq_gput_right:Ne \l_pgfgo_goban_elements_stack_seq { \exp_not:N\pgfgo_move_parsed:nnn{\exp_not:N \BooleanFalse}{from = \int_use:N\l_pgfgo_move_current_int, #2}{\l_tmpa_clist} } } \seq_log:N \l_pgfgo_goban_elements_stack_seq } %------------------------------------------------------------------------- \seq_map_variable:NNn \l_pgfgo_coordinate_parser_items_from_pgfgonce_seq\variable{ %PIEDRAS RESTANTES \pgfgo_move:nnV {#1}{#2}\variable } \group_end: } \let\move\moves \ExplSyntaxOff