#!/bin/bash
# original filename: xboard-xiangqi.sh
# 2020-4-22 updated, v4.9.1-7.1, by Careone

APPNAME="xboard-xiangqi"
APPVER="4.9.1-7.1"
APPDESC=""

### HEAD ###
## debug switches ##
#DEBUG=0	#TODO
## debug switches end ##

# tag 15:
# useful commands
#   -transparent white: 把白色背景，替换成 透明
# convert xqboard-57.png -fuzz 2% -transparent white xqboard-alpha.png
#
#   -flatten 平整图像。即使用指定的背景色，替换原来的透明背景
# convert xqboard-alpha.png -background blue -flatten xqboard-gray.png

# 自定义棋盘图片的技巧：
# 1. 推荐图片的 宽:高 = 9:10, 必须为PNG格式。默认尺寸 441x490.适用于 49x49棋格;
# 2. 棋盘河界不要有“楚河汉界”或其它文字。不然缩放棋格大小时，文字会变形残缺;
# 3. 自定义的棋盘图片，使用时，九宫斜线中间可能会残缺断点、错位、变双线；
# 4. 自定义的棋盘图片，棋子的定位可能不在中间，需要特别调整图片；
# 5. 如果原始棋盘图片的棋格大小是大于 49x49,则可以直接使用这个图片，不一定要缩放
#    到 441x490 尺寸。理由：原始大图片，通常使用时，九宫斜线中间会出现断点；
#    如果使用缩放后的标准尺寸图片，使用时，九宫斜线中间，会变成双线段，或者突起;
# ------------------------------

## disabled defines ##
#VARIANT_STR=	#指定象棋变种的选项和参数。
## VARIANT_STR="-variant xiangqi"	#玩中国象棋
## VARIANT_STR="-variant shoqi"	#玩日本将棋
## disabled defines end ##
  
# 中国象棋引擎相关 defines
_CMD=
_CMD0=maxqi	# 默认的中国象棋引擎 maxqi, 包含在软件包 fairymax 内
_PKG=

declare -a xxq_engine eng_eleeye
# 可用的 xboard 中国象棋引擎。注：未包含 EleEye 象眼引擎
xxq_engine=( sjaakii haqikid maxqi hoixiangqi )	

# 中国象棋引擎 EleEye 象眼，可能会有多个文件别名
eng_eleeye=( eleeye_engine ELEEYE eleeye )

SHOW_TESTED_XXQ_ENGINE=
	       
## Dir defines
prefix="/usr/share/games/xboard"

global_theme_dir="/usr/share/games/xboard/themes"
global_board_dir="/usr/share/games/xboard/themes/textures"
global_sample_dir="/usr/share/games/xboard/samples/xiangqi"

## TODO: dirs defined for furture
#user_theme_dir="$HOME/.xboard/themes"
#user_board_dir="$HOME/.xboard/themes/textures"
## TODO END ##

## File defines
# XBoard Global/User Configure and
# XBoard-Xiangqi Global/User Configure
xbd_gcfg="/etc/xboard/xboardrc"
xbd_ucfg="$HOME/.xboardrc"

xxq_gcfg_dir="/usr/share/games/xboard/themes/conf"
declare -a xxq_gcfg
xxq_gcfg[0]="xq"
xxq_ucfg="$HOME/.xboard-xiangqi-rc"

# xxq_gcfg 2: global configure, added by package xboard-xiangqi. based on file
#	xq and modified
xxq_gcfg[1]="xiangqi"	

# XXQ_CFG_STR: Xboard xiangqi 需要的附加选项，可以指定配置文件。
#  好处：玩国际象棋 chess, 或者中国象棋 xiangqi, 使用不同的配置文件，互不影响

XXQ_THEME_CONF=


##
#MOVEHISTORY_STR="-moveHistoryUp true"	  # for option --show-move-history
#ENGINEOUTPUT_STR="-engineOutputUp true"  # for option --show-engine-output

MOVEHISTORY_STR="-moveHistoryUp true"
ENGINEOUTPUT_STR="-engineOutputUp false"

SHOWCOORDS_STR="-showCoords true"

# tag 65: tips to launch Xboard Xiangqi
# xboard @xq: read settings from configure file: 
#	/usr/share/games/xboard/themes/conf/xq
# xboard @xq -fcp maxqi -scp maxqi
# xboard @xq -uxiAdapter {uci2wb -%variant "%fcp" "%fd"} -fcp eleeye_engine -fUCCI -scp eleeye_engine -sUCCI
# xboard -variant xiangqi -fcp maxqi -SettingsFile ~/.xboard-xiangqi-rc -saveSettingsFile ~/.xboard-xiangqi-rc -saveSettingsOnExit true
## TODO and bugful:
# xboard @xq -fcp haqikid -scp haqikid

## disabled defines
#XXQ_CFG_STR="-settingsFile $xxq_gcfg_dir/${xxq_gcfg[1]} -saveSettingsFile $xxq_ucfg -saveSettingsOnExit true"

# ----- other xboard options/settings -----
# -size 49	# 指定棋格大小。推荐 47-65
# -moveHistoryUp true		# (是)否 显示 走棋记录
# -engineOutputUp true		# (是)否 显示 引擎输出
#
# -evalGraphUp true		# (是)否 显示 评估图
# -internetChessServerInputBox true	# (是)否 显示 联网对战输入框 
# -----------------------------------------

# ---------------------------
# tag 55: TODO for shogi (日本将棋)
#shogi_gcfg=/usr/share/games/xboard/themes/conf/shogi"
#shogi_ucfg="$HOME/.xboard-shogi-rc"
#SHOGI_STR="-settingsFile $shogi_gcfg -saveSettingsFile $shogi_ucfg -saveSettingsOnExit true"
# ---------------------------
 
# for option --nologo
# 警告: 使用 -autoLogo [true | false] 选项时，请同时指定 -logoSize [数字] 选项。
#   否则出现的效果，可能与期望不符
AUTOLOGO_STR="-autoLogo true -logoSize 100"

# for option --board
XQBOARD=xqboard-9x10	#init

## 中国象棋棋盘图片的主文件名，不带扩展名。
#    如: xiangqi-9x10, 对应 xiangqi-9x10.png
# 说明: xboard 选项      ~~/themes/textures/${XQBOARD}.png
# = /usr/share/games/xboard/themes/textures/${XQBOARD}.png
# 注: 棋盘图片必须是 PNG 格式，宽:高 = 9:10. 默认为 441x490, 即 49x49 的倍数

## for option --theme
# 已适配的中国象棋的棋子-棋盘配对主题
declare -a xxq_theme
THEME_STR=
# xxq_theme=( wood mono redblack redblack2 ccbridge dpxq dpxq-cn dpxq-tw )
xxq_theme=( wood mono ccbridge dpxq dpxq-tw a9 redblack )
## 
# package 1: pgn-extract
# /usr/share/pgn-extract/eco.pgn
#
# package 2: gnome-chess
# /etc/gnome-chess/engines.conf
# [HoiChess]
# protocol=cecp
# binary=hoichess

### defines ###
# 象棋/中国象棋引擎相关
CUSTOM_XXQ_ENGINE=0	#optional: 0=使用默认方案；
#1=指定中国象棋引擎（如 -2, -m, -H; -fcp, -scp 选项）

FCP=maxqi; SCP=maxqi
## -fcp: Frist Chess Program,  1号象棋引擎
## -scp: Second Chess Program, 2号象棋引擎
#
# 可选的中国象棋程序(引擎):
# maxqi = /usr/games/maxqi (xboard 自带) 
# hoixiangqi = /usr/games/hoixiangqi (需要先安装软件包 hoichess) 
# sjaakii    = /usr/games/sjaakii (需要先安装软件包 sjaakii. 
# 	支持chess,shogi 日本将棋,xiangqi 等多种象棋变种。
# 	需要指定棋种 -variant xiangqi 和其它选项，如 -uci, -ucci)

# -----------
# 棋盘配色参考:
# 东萍棋盘粉底：#ecd2b4
# 东萍棋盘粗边灰：#646664

# xqboard-9x10.png 默认淡绿：#acf8f4
# -----------

## pid, Piece Image Directory, 棋子图片目录。默认为
# ~~/themes/xiangqi, 即
# /usr/share/games/xboard/themes/xiangqi
XXQ_PID=xiangqi

declare -i SIZE="49"	#default: 49
#如果 SIZE 数值小于47，可能导致因为宽度太小，导致程序顶部的菜单栏消失

## tag 160:
# for option --load-pgn & --load-fen, since ver 4.9.1-6
declare -i INDEX

_OPT=

TIMESTAMP=
_tmpfile=

FORMAT1=
FORMAT2=

declare -a samp_fen samp_pgn samp_fen_desc samp_pgn_desc 
declare -a samp_list	# for option --sample

declare -i index SAMP_ID
# SAMP_ID = index - 1

## Xboard Xiangqi PGN/FEN samples:
#  xxq-shiQingYaQu_2009-551-100p.pgn
#  xxq-shiQingYaQu_2009-551f.fen
#  xxq-tianTianXQ-cg360.pgn
#  xxq-tianTianXQ-cg360f.fen

# FEN / PGN sample files
samp_fen[0]=
samp_fen_desc[0]=
samp_pgn[0]=
samp_pgn_desc[0]=

##
#samp_fen[1]="xxq-shiQingYaQu_2009-551f.fen"
#samp_pgn[1]="xxq-shiQingYaQu_2009-551p.pgn"
#
samp_fen[1]="$global_sample_dir/xxq-shiQingYaQu_2009-551f.fen"
samp_fen_desc[1]="[FEN 局面]: 《适情雅趣》残局谱 551 局 (2009年李浭版)"
samp_pgn[1]="$global_sample_dir/xxq-shiQingYaQu_2009-551p.pgn"
samp_pgn_desc[1]="[PGN 棋谱]: 《适情雅趣》残局谱 551 局 (2009年李浭版)"


##
#samp_fen[2]="xxq-tianTianXQ-cg360f.fen"
#samp_pgn[2]="xxq-tianTianXQ-cg360p.pgn"
#
samp_fen[2]="$global_sample_dir/xxq-tianTianXQ-cg360f.fen"
samp_fen_desc[2]="[FEN 局面]: 腾迅天天象棋-残局闯关 (共360局)"
samp_pgn[2]="$global_sample_dir/xxq-tianTianXQ-cg360p.pgn"
samp_pgn_desc[2]="[PGN 棋谱]: 腾迅天天象棋-残局闯关 (共360局)"

## for option --load-fen, --load-pgn, --sample; -ttxq; -sqyq
SAMPLE_MODE=	# --sample, -ttxq, -sqyq 这3种选项，值为 1。即需要切换到样例目录下
_file=
DESC=
LOAD_STR=

# optional LOAD_MODE (3 total): FILE, INDEX; UNKNONW
LOAD_MODE=

# 从 PGN 提取 [xxx] 标签，转换生成的临时文件，后面扩展名统一为大写的 FEN
SUFFIX=FEN	

# PGN2FEN_MODE: 用于确定是否需要提取 PGN 的 [XXX] 标签，另存到临时文件.
# 主要用于确定把 PGN 对局/棋谱文件转成 FEN 局面数据文件时，使用的方式
# =2: 提取所有 [XXX] 标签，但不保留走法;
# =1 或者其它值: 只提取最简单的信息, 如: 9/9/9/.../9 w 0 1
PGN2FEN_MODE=1	#optional: 1, 2	
#	

## option defines end 
## ---------------------------

# function 0: disabled option
	_show_disabled_option () {
cat<<EOF
  _show_disabled_option
# v4.9.1-3, 2020-2-21, 
       $APPNAME -j    玩日本将棋 (shogi) 
EOF
}
       
# function 1.
	_usage_cn () {
cat<<EOF
用法:  $APPNAME     玩中国象棋 (优先选用棋力最高的中国象棋引擎: sjaakii) 
       $APPNAME -c  玩国际象棋 (默认引擎: fairymax) 

选项:
  象棋引擎相关
  -c, --chess       玩国际象棋 (默认引擎: fairymax) 

  -m, --maxqi       玩中国象棋 (引擎: maxqi) 
  -H, --hoixiangqi  玩中国象棋 (引擎: hoixiangqi. 需要先安装软件包 hoichess) 
  -sj, --sjaakii    玩中国象棋 (引擎: sjaakii. 需要先安装软件包 sjaakii) 
  -ee, --eleeye     玩中国象棋 (引擎: 象眼 eleeye_engine, 使用 UCCI 协议)。需要先
     安装软件包 eleeye。说明: 象眼引擎运行不稳定，中途可能报错、停止走棋。
     另外，使用 UCCI 协议的中国象棋引擎，需要使用额外选项 uci2wb, -fUCCI, -sUCCI,  
     以及 -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}
     
     用法示例:
       说明1: 以下4组命令，都需要在同一行输入!
       说明2: "-variant xiangqi" 代表玩中国象棋 (xiangqi), 而不是
              国际象棋 (chess);
       说明3: "uci2wb -x" 代表使用 UCCI 中国象棋协议;
       说明4: @xq 或者 @xiangqi, 代表加载特定目录下的中国象棋主题
              配置文件, 如 /usr/share/games/xboard/themes/conf/xq ;

       用法1:
        xboard -variant xiangqi -fcp "uci2wb -x eleeye_engine" -scp \
"uci2wb -x eleeye_engine"
       用法2:
        xboard @xiangqi -fcp "uci2wb -x eleeye_engine" -scp "uci2wb -x \
eleeye_engine"
       用法3:
        xboard @xiangqi -fcp {uci2wb -x eleeye_engine} -scp {uci2wb -x \
eleeye_engine}
       用法4:
        xboard @xiangqi -uxiAdapter {uci2wb -%variant "%fcp" "%fd"} \
-fcp eleeye_engine -fUCCI -scp eleeye_engine -sUCCI

  -2, --vs2    玩中国象棋 (1号引擎 maxqi, 2号引擎 hoixiangqi) 
  -e, --engine [maxqi | hoixiangqi | sjaakii]
          使用相同的 1 号/ 2 号象棋引擎 
  -fcp [maxqi | hoixiangqi | sjaakii]
          指定中国象棋的 1 号引擎 
  -scp [maxqi | hoixiangqi | sjaakii]
          指定中国象棋的 2 号引擎

 游戏界面显示相关          
  -s, -size [数字]  指定棋子像素大小。默认为 49。推荐范围为 47-65。
                    如果小于 47, XBoard 程序顶部菜单栏可能消失
  -t, --theme [棋子/棋盘主题]  
	使用指定的棋子/棋盘图片主题。不带参数，则显示可用的主题
  -sl, --showlogo    显示象棋引擎图标 (默认方案)
  -nl, --nologo    不显示象棋引擎图标
  -sm, --show-move-history      显示 走棋记录 (默认方案)
  -nm, --no-move-history      不显示 走棋记录
  -se, --show-engine-output     显示 引擎输出
  -ne, --no-engine-output     不显示 引擎输出 (默认方案)

 PGN 对局/棋谱、FEN 局面文件相关
  -lf, --load-fen [FEN文件] [数字序号]
    打开 FEN 局面文件中的指定棋局。如果未指定文件和数字，则打开棋例
  -lg, --load-pgn [PGN文件] [数字序号]
    打开 PGN 对局/棋谱文件中的指定棋局。如果未指定文件和数字，则打开棋例

  -sp, --sample [数字序号]
    指定棋例文件。如果未给出数字序号，则列出中国象棋棋例目录下的全部 PGN 
     (对局/棋谱) 和 FEN (局面) 文件。可用于挑战象棋残局，或者打谱。
    说明: 使用时，需要放在 -lf 或 -lg 选项之前

  -sqyq    使用《适情雅趣》残局551例的 PGN/FEN 棋例文件。
           使用时，需要放在 -lf 或 -lg 选项之前
  -ttxq    使用腾迅天天象棋，残局闯关360局的 PGN/FEN 棋例文件。
           使用时，需要放在 -lf 或 -lg 选项之前

 杂项
  -db, --debug     修正 Xboard 中国象棋的个人配置文件最后面一行的错误数据
  -x, --extra      显示附加功能选项
  --tips           显示 xboard 常用选项和参数 
  -v, --version    显示版本信息并退出
  -h, --help       显示帮助信息并退出

See also:
     命令: xboard, maxqi, hoixiangqi, fairymax; polyglot, uci2wb; pgn-extract

Bugs: 
 请发送缺陷报告给 Careone <emacslocale@126.com>. 

Homepage: (DEB) 
 https://sourceforge.net/projects/emacslocale/files/xiangqi/xboard-xiangqi/

Homepage: (Source) 
 https://gitee.com/atzlinux/xboard-xiangqi
EOF
}

# function 2.
	_show_extra_option () {
cat<<EOF
  $APPNAME 附加功能选项

 游戏界面显示相关  
  -b, --board [棋盘图片]   使用指定的棋盘图片 (如 xqboard-9x10 )。不带参数，
    则显示可用的棋盘图片名称。默认为 ~~/themes/xiangqi/textures/xqboard-9x10.png
    ~~ = $prefix/
  -p, -pid [棋子图片目录名]   使用指定的棋子图片目录 (如 xiangqi )。不带参数，
    则显示可用的棋子图片目录名。默认为 ~~/themes/xiangqi/
    ~~ = $prefix/
  -sc, --showCoords      在棋盘上  显示  棋子坐标 (默认方案)
  -nc, --no-showCoords   在棋盘上 不显示 棋子坐标
      
  --init      删除用户的 Xboard 中国象棋配置文件 ~/.xboard-xiangqi-rc 
    提示：如果无法正常启动 Xboard 中国象棋，可以使用此功能来修复某些问题

 PGN 对局/棋谱、FEN 局面文件相关
  -sd, --sample-dir   打开中国象棋棋例目录 (在文件管理器中打开)

 技巧：挑战中国象棋残局  
  -lf, --load-fen [棋局序号 1-551]
    加载棋例《适情雅趣》残局谱第 1-551 局的任意一个 FEN 局面（相当于挑战残局）
EOF
}

# function 3.
	_show_tested_xxq_engine () {
cat<<EOF
  已验证的 Xboard 中国象棋引擎: ${xxq_engine[*]} eleeye_engine
  * eleeye_engine (象眼): 棋力水平较高, 棋力大致相当于:
    腾迅天天象棋.业5-业7。使用 UCCI 引擎协议。
    已知缺陷: 象眼引擎运行不稳定，中途可能报错、停止走棋

  * sjaakii: 棋力水平较高, 棋力大致相当于:
    腾迅天天象棋.业5-业6
  * hoixiangqi: 棋力水平一般, 中局/残局棋力大致相当于:
    腾迅天天象棋.业3-业5。开局较弱
  * maxqi: 棋力水平一般, 中局/残局棋力大致相当于:
    腾迅天天象棋.业3-业4。开局较弱

EOF
}

## function 5:	
		_show_tips () {
cat<<EOF
 xboard 常用选项和参数
 1. -variant [象棋变种]   指定象棋变种。如 xiangqi (中国象棋)，shogi (日本将棋)
     如果是标准国际象棋 (chess), 则不需要选项 -variant;
     提示：如果想玩标准国际象棋以外的其它棋种，还需要同时使用其它选项和参数，如
       -fcp (指定1号象棋引擎), -lbft, -dbtf (指定白格、黑格背景图片), 
       -pid (指定棋子图片所在的目录)。另外，还可以使用 -size 来指定棋子尺寸
       
 2. -fcp [引擎程序]    指定1号象棋引擎。常见的中国象棋引擎: 
      maxqi (fairymax 软件包自带), hoixiangqi (需要先安装 hoichess 软件包)
      常见的国际象棋引擎: fairymax
 3. -scp [引擎程序]    指定2号象棋引擎。如果是'机器对战'，需要同时指定 2号引擎
 4. -showCoords true  显示棋格坐标。Xboard 默认为 false (不显示)。建议改为 
     true (显示)

 5. -lbtf ~~/themes/textures/xqboard-9x10.png  指定白格背景图片
     如 xqboard-9x10.png (中国象棋)，或者 wood_l.png (国际象棋)
 6. -dbtf ~~/themes/textures/xqboard-9x10.png  指定黑格背景图片
     如 xqboard-9x10.png (中国象棋)，或者 wood_d.png (国际象棋)
     说明: -lbtf 和 -dbtf 参数必须同时使用
 7. -overrideLineGap 0   指定棋格线条宽度。中国象棋 = 0；其它象棋 = 1
    
 8. -pid ~~/themes/xiangqi  指定棋子图片所在的目录。棋子图片必须是 SVG 格式
     说明: 5-7 项中， ~~ = /usr/share/games/xboard

 9. -size [数字]   指定棋子像素大小。默认为49。推荐范围为 47-65。
                   如果小于47, XBoard 程序顶部菜单栏可能消失
 10. -autoLogo true   显示象棋引擎 LOGO 图片
     默认 = false (不显示)。建议设为 true (显示)
 11. -logoSize [数字]   指定象棋引擎 LOGO 图片的尺寸。建议设为 100
        提示：-autoLogo 和 -logoSize 这两个选项，需要同时搭配使用。如:
        选项: '-autoLogo true -logoSize 100' = [显示] 引擎 LOGO
        选项: '-autoLogo false -logoSize 0' = [不显示] 引擎 LOGO
       
 21. -saveSettingsOnExit false  退出时是否自动保存个人用户的 xboard 参数设置
    默认为 true (自动保存) 。如果只是用来玩某一种象棋游戏（如中国象棋，或者
    国际象棋），建议设为 true (自动保存) 。如果需要玩多种象棋游戏（如中国象棋，
    或者国际象棋，日本将棋），建议改为 false (不自动保存)。这样可以运行
     xboard 玩国际象棋，或者运行 xboard-xiangqi 玩中国象棋，互不影响。
    见系统配置文件 /etc/xboard/xboard.conf, 或者个人配置文件 ~/.xboardrc
 
 22. -settingsFile "~/.xboardrc"      配置文件的名称
 23. -saveSettingsFile "~/.xboardrc"  保存配置文件
    说明: 22-23项中，文件名也可以改为 ~/.xboard-xiangqi-rc
    另外，可以参考中国象棋的配置文件 /usr/share/games/xboard/themes/conf/xq

 24. -moveHistoryUp true     显示 走棋记录
 25. -engineOutputUp true    显示 引擎输出
EOF
}
 
### useful commands:
## grep "\[FEN \"" shiqingyaqu551.fen | cut -d'"' -f2 | sed '/w - - 0 1/s//w 0 1/;/n/s//h/g;/N/s//H/g;/b/s//e/g;/B/s//E/g' > shiqingyaqu551-xboard.fen

### defines end ###

### HEAD ###

## function 11 (disabled):  
# 把 Xboard PGN 对局（或者标准中国象棋 PGN 对局）中的 FEN 数据提取出来并显示
#   源文件: $_file
#   例: 
 
	_pgn2fen () {
TIMESTAMP=`date '+%m%d-%H%M%S'`
grep "\[FEN \"" "$_file" 
}

### BODY ###

for option in "$@"; do

    	case "$option" in

    	 -h | --help)
	   _usage_cn
	   exit 0 ;;

# maxqi 是 xboard 自带的中国象棋引擎；
# hoixiangqi 是包含在软件包 hoichess 中的中国象棋引擎；	

# tag 380: 
# chess: 玩国际象棋，而不是 中国象棋
    	 -c | --chess) #default theme: wood
    	   FCP="fairymax"; SCP="fairymax"
  	   
    	   xboard $AUTOLOGO_STR -size "$SIZE" -fcp "$FCP" \
    	   -scp "$SCP" $MOVEHISTORY_STR $ENGINEOUTPUT_STR \
    	   $SHOWCOORDS_STR -ubt true -lbtf ~~/themes/textures/wood_l.png \
    	   -dbtf ~~/themes/textures/wood_d.png -pid "" \
    	   -hsc '#ffff00' -phc '#ff0000' -overrideLineGap 1 &
    	   
	exit 0 ;;
		
# tag 400: bugful and TODO
#
# shogi: 玩日本将棋，而不是 中国象棋
# 说明 xboard 4.9.1 中，日本将棋的支持似乎有缺陷，如：
# 1. 如果使用选项 -variant shoqi 指定棋种，但没有合适的日本将棋引擎可用;
# 2. 国际象棋 (chess) 的默认引擎 fairymax , 也不支持日本将棋;
# 3. 参照配置文件 /usr/share/games/xboard/themes/conf/shogi ，设置
#  引擎为 gnushogi, 也不能正常运行;
# 4. 总结：表面上看，显示的是日本将棋的棋子图片，但实际上，是当成国际象棋
#	的走棋规则来运行的。
# 11. 结合 1-4 项，可以考虑不使用 -variant shoqi 选项，即不指定棋种
# 999. 最终方案：禁用 -j 选项。  
    	 -j | --shogi)
    	 	echo " Error (E245): disabled option $1 ! exit" 1>&2
    	 	exit;
    	 	
    	   #VARIANT_STR="-variant shoqi"
    	   FCP="gnushogi"; SCP="gnushogi"
    	   
    	   VARIANT_STR=""
	   FCP="fariymax"; SCP="fariymax"
	     
	  xboard $VARIANT_STR $SHOGI_STR $AUTOLOGO_STR -size "$SIZE" -fcp "$FCP" -scp "$SCP" \
	  $SHOWCOORDS_STR -ubt true -lbtf ~~/themes/textures/wood_d.png \
	  -dbtf ~~/themes/textures/wood_d.png -pid ~~/themes/shogi \
	  -trueColors true -hsc '#ffff00' -phc '#0080ff' -overrideLineGap 1 &
	  
	exit 0 ;;

# 以下是 中国象棋 引擎相关的功能选项
    	 -2 | --vs2) # xiangqi 双引擎模式
    	   CUSTOM_XXQ_ENGINE=1	# =1: 指定中国象棋引擎
    	   if which hoixiangqi &>/dev/null; then
    	     SCP=hoixiangqi
  	   else :
  	   fi
    	   shift ;;

# tag 368:
    	 -m | --maxqi) # 默认的中国象棋 (Xiangqi) 引擎: maxqi
	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi

    	   CUSTOM_XXQ_ENGINE=1
      	   _CMD="maxqi"; _CMD0=maxqi
    	   _PKG="fariymax"
    	   FCP=maxqi; SCP=maxqi
	   shift ;;

# tag 369: hidden option
    	 -ed | --engine-debug) # 中国象棋 (Xiangqi) 引擎调试
    	  VARIANT_STR="-variant xiangqi"
      	  FCP="eleeye_engine -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"
    	  SCP="eleeye -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
    	  #FCP="haqikid"
    	  #SCP="haqikid"
    	  
    	  XXQ_CFG_STR=
    	  AUTOLOGO_STR="-autoLogo true -logoSize 100"
    	  SIZE=49
    	  MOVEHISTORY_STR="-moveHistoryUp true"
    	  ENGINEOUTPUT_STR="-engineOutputUp true"
    	  #XQBOARD=xqboard-a9-9x10
    	  XQBOARD=xqboard-9x10
    	  XXQ_PID=xiangqi
       	  LOAD_STR=
# 	  
 	  DEBUG=1
 	  if [ "$DEBUG" = 1 ]; then
 	    echo -e "   FCP: $FCP\n   SCP: $SCP"
 	  fi
 	  
#  xboard $XXQ_CFG_STR $VARIANT_STR -size $SIZE -fcp $FCP -scp $SCP \

  xboard @xiangqi $VARIANT_STR -size $SIZE -fcp $FCP -scp $SCP \
   $AUTOLOGO_STR $SHOWCOORDS_STR $MOVEHISTORY_STR $ENGINEOUTPUT_STR \
   -pid ~~/themes/"$XXQ_PID" -ubt true \
   -lbtf ~~/themes/textures/"$XQBOARD.png" \
   -dbtf ~~/themes/textures/"$XQBOARD.png" \
   -trueColors true -hsc '#ffff00' -phc '#ff0000' -overrideLineGap 0 $LOAD_STR &
  
  	 exit 0
		;;
# tag 370:
    	 -ee | --eleeye) # 中国象棋 (Xiangqi) 引擎: eleeye_engine
	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi

    	   CUSTOM_XXQ_ENGINE=1
    	   _CMD="eleeye_engine"; _CMD0=maxqi
    	   _PKG="eleeye"

           if which eleeye_engine &>/dev/null; then
             # _CMD=eleeye_engine; 
             echo "   找到中国象棋引擎 (象眼): `which eleeye_engine`"
     	     FCP="$_CMD -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"; 
    	     SCP="$_CMD -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
           elif which ELEEYE &>/dev/null; then
             _CMD=ELEEYE; 
             echo "   找到中国象棋引擎 (象眼): `which ELEEYE`"
             FCP="$_CMD -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"; 
    	     SCP="$_CMD -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
           elif which eleeye &>/dev/null; then
    	     echo "   找到中国象棋引擎 (象眼): `which eleeye`"
    	     _CMD=eleeye; 
    	     FCP="$_CMD -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"; 
    	     SCP="$_CMD -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"

  	   else 
  	     echo " 错误 (E120): 无法启动中国象棋程序(引擎) '$_CMD'! 请先安装软件包 '$_PKG'！" 1>&2
    	     echo "     强制使用默认的中国象棋程序(引擎) '$_CMD0'"
  	     FCP="$_CMD0"; SCP="$_CMD0"  
  	   fi
    	   shift ;;
	   
# tag 383:
    	 -e | --engine) # 同时指定中国象棋 (Xiangqi) 的1号和2号引擎
	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi

# usage: -e [maxqi | hoixiangqi | sjaakii]    	 
# 3 optional: maxqi, hoixiangqi; 
#	    sjaakii (需要附加棋种选项参数 -variant xiangqi)
    	   CUSTOM_XXQ_ENGINE=1
    	   _CMD0=maxqi
    	   _PKG="hoichess"
    	   
  if [ "$#" -eq 1 ]; then
    FCP="$_CMD0"; SCP="$_CMD0";
    shift;
  else _CMD="$2";    
# -----------------
    case "$_CMD" in
      -*) FCP="$_CMD0"; SCP="$_CMD0";
    	shift ;; 
       *) 
      	   if which $_CMD &>/dev/null; then
    	     FCP="$_CMD"; SCP="$_CMD"
    	     
    	     case "$_CMD" in
    	       eleeye_engine | ELEEYE | eleeye)
       	         FCP="$_CMD -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"; 
    	         SCP="$_CMD -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
    	      	;;
    	     esac

## 如果指定的象棋引擎叫 eleeye, 而实际上可执行的程序文件名
#  叫 eleeye_engine 或 ELEEYE；或者类似的情况，则查找可以替代的引擎程序名    	     
    	   elif [ "$_CMD" = eleeye_engine ] || [ "$_CMD" = ELEEYE ] || [ "$_CMD" = eleeye ]; then

    	        if which eleeye_engine &>/dev/null; then
    	          _CMD=eleeye_engine
    	        elif which eleeye_engine &>/dev/null; then
    	          _CMD=ELEEYE
    	        elif which eleeye &>/dev/null; then
    	          _CMD=eleeye
    	        else :
    	        fi
    	     
    	        echo "   找到中国象棋引擎 (象眼): `which $_CMD`"
       	     FCP="$_CMD -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"; 
    	     SCP="$_CMD -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
    	     
  	   else 
  	     echo " 错误 (E121): 无法启动中国象棋程序(引擎) '$_CMD'!" 1>&2
    	     echo "     强制使用默认的中国象棋程序(引擎) '$_CMD0'"
  	     FCP="$_CMD0"; SCP="$_CMD0"  
  	   fi

    	        shift 2 ;;
    esac
# -----------------    	        
  fi
    	   
	 ;;
    	   
# tag 408:
    	 -H | --hoixiangqi) # 可选的中国象棋 (Xiangqi) 引擎2: hoixiangqi

	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi

    	   CUSTOM_XXQ_ENGINE=1
    	   _CMD="hoixiangqi"; _CMD0=maxqi
    	   _PKG="hoichess"
    	   if which $_CMD &>/dev/null; then
    	     FCP="$_CMD"; SCP="$_CMD"
  	   else 
  	     echo " 错误 (E120): 无法启动中国象棋程序(引擎) '$_CMD'! 请先安装软件包 '$_PKG'！" 1>&2
    	     echo "     强制使用默认的中国象棋程序(引擎) '$_CMD0'"
  	     FCP="$_CMD0"; SCP="$_CMD0"  
  	   fi
    	   shift ;;

# tag 430:
# added in version 4.9.1-4
    	 -sj | --sjaakii) # 可选的中国象棋 (Xiangqi) 引擎3: sjaakii

	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi

    	   CUSTOM_XXQ_ENGINE=1
    	   _CMD="sjaakii"; _CMD0=maxqi
    	   _PKG="sjaakii"
    	   if which $_CMD &>/dev/null; then
    	     FCP="$_CMD"; SCP="$_CMD"
  	   else 
  	     echo " 错误 (E120): 无法启动中国象棋程序(引擎) '$_CMD'! 请先安装软件包 '$_PKG'！" 1>&2
    	     echo "     强制使用默认的中国象棋程序(引擎) '$_CMD0'"
  	     FCP="$_CMD0"; SCP="$_CMD0"  
  	   fi
    	   shift ;;
# add end ##
    	   
# 以下是 中国象棋 棋盘图，棋子图片，棋格尺寸相关的功能选项

    	-b | --board)
# usage: -b    显示可用的中国象棋棋盘图片（即 xqboard-*.png）
#	 -b xqboard-9x10  使用指定的中国象棋棋盘图片（即默认的 xqboard-9x10.png）

 	  if [ "$#" = 1 ];then
	    echo " 可用的 中国象棋 [棋盘] 图片..."

  	    echo -n " 目录-文件名格式: "
	    echo "/usr/share/games/xboard/themes/textures/xqboard*.png" | grep -i xqboard --color=auto

	    echo " 提示：请运行 '$APPNAME $1 [棋盘主文件名]' 来指定 [棋盘] 图片"
       	    echo -e "\t 示例: $APPNAME $1 xqboard-9x10"

	    ls /usr/share/games/xboard/themes/textures/ | grep -i xqboard | \
		grep .png | sed '/.png$/s///' | cat -n 1>&2
	    exit 1;
	  else
	    XQBOARD="$2" 
	    if [ ! -s "/usr/share/games/xboard/themes/textures/${XQBOARD}.png" ]; then
	      XQBOARD="xqboard-9x10"
	    fi
		shift 2
	  fi
	     ;;

#
# tag 452a:
    	-fcp)
# usage: -fcp [maxqi | hoixiangqi | sjaakii]
#	   指定中国象棋的 1 号引擎

	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi
	
 	  if [ "$#" = 1 ];then
		shift 

	  else
	    case "$2" in
	      "" | -*) shift ;;
		
  	      *)  
	    	if which $2 &>/dev/null; then
		  FCP="$2"; CUSTOM_XXQ_ENGINE=1
	  
		    case "$FCP" in
	    		eleeye_engine | ELEEYE | eleeye)
    	        	FCP="$FCP -fUCCI" ;;
    	  	    esac
		else 
	    	  echo " 错误: 指定目录下没有可用的象棋游戏引擎 /usr/games/$2 ！" 1>&2
	    	  echo "   强制使用默认的中国象棋引擎"
	        fi
		  shift 2
		;;
	    esac
		
	  fi

	     ;;


# tag 452b:
    	-scp)
# usage: -scp [maxqi | hoixiangqi | sjaakii]
#	   指定中国象棋的 2 号引擎
	if [ -z "$SHOW_TESTED_XXQ_ENGINE" ]; then
	  _show_tested_xxq_engine; 
# 如果有其它选项(通常是 -fcp, -scp)已经调用过 _show_tested_xxq_engine 
# 函数，则进行标识，后面不再重复调用
	  SHOW_TESTED_XXQ_ENGINE=false
	fi
	
 	  if [ "$#" = 1 ];then
		shift 

	  else
	    case "$2" in
	      "" | -*) shift ;;
		
  	      *)  
	    	if which $2 &>/dev/null; then
		  SCP="$2"; CUSTOM_XXQ_ENGINE=1
	 	    case "$SCP" in
	    		eleeye_engine | ELEEYE | eleeye)
    	        	SCP="$SCP -sUCCI" ;;
    	  	    esac
		else 
	    	  echo " 错误: 指定目录下没有可用的象棋游戏引擎 /usr/games/$2 ！" 1>&2
	    	  echo "   强制使用默认的中国象棋引擎"
	        fi
		  shift 2
		;;
	    esac
		
	  fi

	     ;;

# tag 478:
	
    	-p | -pid)
# usage: -p    显示可用的中国象棋棋子图片目录（即 xiangqi*/ ）
#	 -p xiangqi  使用指定的中国象棋棋子图片（即默认的目录 xiangqi/ ）

 	  if [ "$#" = 1 ];then
	    echo " 可用的 中国象棋 [棋子] 图片目录..."
  	    echo -n " 目录位置格式: "
	    echo "/usr/share/games/xboard/themes/xiangqi*/" | grep -i xiangqi --color=auto
	    echo " 提示：请运行 '$APPNAME $1 [棋子图片目录名]' 来指定 [棋子] 主题"
       	    echo -e "\t 示例: $APPNAME $1 xiangqi"

	    ls /usr/share/games/xboard/themes/ | grep -i xiangqi | cat -n 1>&2
		
	    exit 1;
	  else
		  XXQ_PID="$2" 
	  if [ ! -d "/usr/share/games/xboard/themes/$XXQ_PID" ]; then
	    XXQ_PID="xiangqi"
	  fi
		shift 2
	  fi
	     ;;
	     
	  -s | -size)
	  SIZE="$2" 
	  # 如果数值小于 19, 或者大于 129, 强制改用默认值 49.
	  # 推荐范围为 47-65。如果小于 47, 可能导致顶部菜单栏消失
	  if [ "$SIZE" -lt 19 ] || [ "$SIZE" -gt 129 ] ; then
	    echo " 错误 (E140): 棋格大小超范围 (12-129)! 强制使用默认值 49" 1>&2;
	    SIZE=49
	  fi
	  shift 2
	     ;;

# tag 320:
    	 --tips)
	   _show_tips
	   exit 0 ;;
	   
## tag 325: 
    	 -nl | --nologo)
# 提示：如果系统配置文件 /etc/xboard/xboard.conf 或者个人用户的配置文件
# ~/.xboardrc 中，强行指定了 "-autoLogo true" 选项，则选项 
# '-autoLogo false' 不会显示象棋引擎图标，但还是留着图标的空框位置。因此，
# 后面必须补充 '-logoSize 0' 选项，才能取消图标的空框。
# 另外，在调用 AUTOLOGO_STR 变量时，变量外面不能加双引号----会被错误地当成1个字段
# 来解析，而不是当成3个字段
    	   AUTOLOGO_STR="-autoLogo false -logoSize 0"    	  
	   shift ;;

    	 -sl | --showlogo)
    	   AUTOLOGO_STR="-autoLogo true -logoSize 100"    	  
	   shift ;;

#
    	 -nc | --no-showCoords)
    	   SHOWCOORDS_STR="-showCoords false"    	  
	   shift ;;

    	 -sc | --showCoords)
    	   SHOWCOORDS_STR="-showCoords true"    	  
	   shift ;;	   
	   
# tag 980:
    	 -t | --theme)
# usage: -t THEME_STR
# 重要提示：中国象棋的棋盘图片文件名，推荐为 xqboard-XXX-9x10.png 命名格式。
# 且后面必须带有 -9x10 字样，这样可以传递给 xboard 主程序，这个图片是整张棋盘图片，
# 而不是国际象棋风格的单个棋格背景图片。如果没有 -9x10 字样(即代表中国象棋的9列10行)，
# 则使用 -size 选项缩放棋盘大小时，九宫斜线中间可能出现断点和双栏错位。详见 xboard
# 官方 MAN 手册 中，"use Board Textures" 章节中的相关说明

	if [ "$#" -le 1 ]; then
	  echo -e " 可用的中国象棋配套主题（同时指定棋子和棋盘）:\n ${xxq_theme[*]}"
 	  echo " 用法示例: $APPNAME $1 wood"
	  exit
	fi
		THEME_STR="$2"

	   case "$THEME_STR" in	     
	    dpxq | mono | wood) SHOWCOORDS_STR="-showCoords false" 
	       XQBOARD=xqboard-${THEME_STR}-9x10 ; 
	       XXQ_PID=xiangqi-${THEME_STR} ;;

#
	     dpxq-cn) SHOWCOORDS_STR="-showCoords false" 
	       XQBOARD=xqboard-dpxq-9x10 ; XXQ_PID=xiangqi-dpxq ;;
	     dpxq-tw) SHOWCOORDS_STR="-showCoords false" 
	       XQBOARD=xqboard-dpxq-9x10 ; XXQ_PID=xiangqi-dpxq-tw ;;
	     
# tag 770:
	     redblack | redblack2) SHOWCOORDS_STR="-showCoords false" 
	       XQBOARD="xqboard-${THEME_STR}"
	       if [ -s "$global_board_dir/${XQBOARD}-9x10.png" ]; then
	     	 XQBOARD="xqboard-${THEME_STR}-9x10"
	       elif [ -s "$global_board_dir/${XQBOARD}.png" ]; then
	         :
	       else
	         XQBOARD=xqboard-mono-9x10 ;
	       fi
	          
	       XXQ_PID=xiangqi-${THEME_STR}
	       	 ;;
	       
	     a9) SHOWCOORDS_STR="-showCoords false" 
	         XQBOARD=xqboard-${THEME_STR}-9x10 ;
	       
	         if [ -d "$global_theme_dir/xiangqi-${THEME_STR}" ]; then
	       	   XXQ_PID="xiangqi-${THEME_STR}"
	         elif [ -d "$global_theme_dir/xiangqi-redblack" ]; then
	       	   XXQ_PID="xiangqi-redblack"
	       	 else XXQ_PID=xiangqi
	       	 fi	
	        ;;
	
	     *) 
		# 1. check for Board picture: xqboard-XX.png
		XQBOARD="xqboard-${THEME_STR}"; 
		
		if [ -s "$global_board_dir/${XQBOARD}-9x10.png" ]; then
		  XQBOARD="xqboard-${THEME_STR}-9x10"
		  _pic="$global_board_dir/${XQBOARD}.png"
		  echo " * 找到 [棋盘图片]: $_pic" | grep "$THEME_STR" --color=auto
		elif [ -s "$$global_board_dir/${XQBOARD}.png" ]; then
		  _pic="$global_board_dir/${XQBOARD}.png"
		  echo " * 找到 [棋盘图片]: $_pic" | grep "$THEME_STR" --color=auto
		  
		else 
		  _pic="$global_board_dir/${XQBOARD}-9x10.png"
		  
		  echo " * 错误 (E350): 棋盘图片缺失!"
		  echo "   ($_pic)" | grep "$THEME_STR" --color=auto
		  XQBOARD=xqboard-9x10
		  echo -e "   使用默认 [棋盘图片]:\n    $global_board_dir/${XQBOARD}.png"
		fi

## 2. 检测 指定的棋子图片目录 是否存在
#  /usr/share/games/xboard/themes/xiangqi-XXX/

		XXQ_PID="xiangqi-$THEME_STR"
		_dir="$global_theme_dir/${XXQ_PID}"
		 

		if [ -d "$_dir" ]; then
		  echo " * 找到 [棋子图片目录]: $_dir/" | grep "$THEME_STR" --color=auto
		else XXQ_PID=xiangqi
		  echo " * 错误 (E360): 无效的棋子图片目录 $_dir/ !" | grep "$THEME_STR" --color=auto
		  #echo "   ($global_theme_dir/$XXQ_PID/)" | grep "$THEME_STR" --color=auto
		  echo -e "   使用默认的 [棋子图片目录]:\n    $global_theme_dir/$XXQ_PID/"
		fi
		 ;;
	   esac
	   shift 2;;

# tag 480:
    	-sm | --show-move-history)
	  MOVEHISTORY_STR="-moveHistoryUp true"
	  shift ;;

    	-nm | --no-move-history)
	  MOVEHISTORY_STR="-moveHistoryUp false"
	  shift ;;

    	-se | --show-engine-output)
	  ENGINEOUTPUT_STR="-engineOutputUp true"
	  shift ;;
	  
    	-ne | --no-engine-output)
	  ENGINEOUTPUT_STR="-engineOutputUp false"
	  shift ;;
	  
##

    	-sd | --sample-dir)
	  echo " Xboard 中国象棋棋例目录: $global_sample_dir/"
	  if [ -d "$global_sample_dir" ]; then
	    xdg-open "$global_sample_dir/" &
	    sleep 1
	  else echo " 错误 (E705): 找不到棋例目录 '$global_sample_dir/' !" 1>&2    
	  fi
	  
	  shift ;;

# tag 765:
    	-sp | --sample)
    	  SAMPLE_MODE=1
	  cd "$global_sample_dir"
	  
    	# 支持的棋例文件扩展名： PGN/FEN/EPD/POS
    	  echo " 查看可用的 Xboard 中国象棋 PGN/FEN/EPD/POS 棋例文件..."
	  echo "   棋例目录: $global_sample_dir/"
	  
	  if [ ! -d "$global_sample_dir" ]; then
	    echo " 错误 (E705B): 找不到棋例目录 '$global_sample_dir/' 。退出" 1>&2
	    exit 0  
	  else
	    shift
	    
	    #cd "$global_sample_dir"
	    samp_list=( `ls *.[efpEFP][egopEGOP][dnsDNS]* | grep -i -E "pgn||fen||epd||pos"` ) 
	    
	    if [ "$#" -le 0 ]; then
	      ls -1 *.[efpEFP][egopEGOP][dnsDNS]* | grep -i -E "pgn||fen||epd||pos" | cat -n | grep --color=auto -i -E "pgn||fen||epd||pos"	
	      exit 0
	    else # [ "$#" -ge 1 ]; then
	      case "$1" in
	        -*) continue ;;
	        *) index="$1"
	        
	          if [ "$index" = 0 ]; then
	            index=1;
	          elif [ "$index" -gt "${#samp_list[@]}" ]; then
	            echo " 警告 (W815): 错误的棋例文件编号 $index ( 有效值: 1 - ${#samp_list[@]} ) !" 1>&2
	            index=1; sleep 1;  
	          else :   
	          fi
	          
	          let "SAMP_ID = index - 1"
	          samp_pgn[0]="${samp_list[SAMP_ID]}"
	          
	          case "${samp_pgn[0]}" in
	            *.[fF][eE][nN]) samp_pgn_desc[0]="FEN 局面" ;;
	            *.[pP][gG][nN]) samp_pgn_desc[0]="PGN 对局/棋谱" ;;
	            *.[eE][pP][dD]) samp_pgn_desc[0]="EPD 局面" ;;
	            *.[pP][oO][sS]) samp_pgn_desc[0]="POS 局面" ;;
	            *) : ;;
	          esac
	          
	          # 也有可能是和 -lp 选项同时使用，则调用的是 FEN 样例文件；
	          samp_fen[0]="${samp_pgn[0]}"
	          samp_fen_desc[0]="${samp_pgn_desc[0]}"
	          
	          
	          echo " 指定棋例文件:"
	          echo -e "   ${index}* ${samp_pgn[0]} (${samp_pgn_desc[0]})" | grep -i -E --color=auto "fen|pgn"
	          echo
	          shift
	         ;;
	      esac
	      
	    fi   

# tag 885d:
#	    cd - &>/dev/null
	  fi
	   ;;
	  
# tag 735:
    	-lg | --load-pgn | -lf | --load-fen)
# usage: $1 _file
#  	 $1 INDEX
#  	 $1 _file INDEX

# =======================
# tag 869a:
	    
## sample 1: FEN strings in Xboard *.PGN file: 
# [FEN "2r6/4akH2/C3P2c1/1C4P2/7r1/8R/9/5p3/4p4/5K3 w 0 1"]
#
# sample 2: FEN strings in Standard Xiangqi *.PGN file: 
# [FEN "C3kab2/4a4/n3c1n2/3Np1p2/1R4P2/1R7/4P4/4B4/1pCp1p3/1crAK1N2 w - - 0 1"]
#
# sample 3: FEN strings in Xboard *.FEN file: 
# 2eaka3/3P3H1/eH7/7hc/9/4C1P2/P5h1P/E3R3E/4Apr2/2RAK3c w 0 1

# 兼容功能：自动转换标准 PGN 中国象棋棋谱文件中 FEN 局面数据中4种棋子代码：
#  红马/黑马(n/N）、 黑象/红相的棋子代码(b/B)，
# 转换为 Xboard 中国象棋 FEN 代码:
# 红马/黑马(h/H）、 黑象/红相的棋子代码(e/E)
#
# 经测试，如果直接把 [标准中国象棋 PGN 棋谱文件] 中的 FEN 局面数据，直接另存为 *.fen 
# 不用修改 n/N, b/B 棋子代码，也不用去掉后面多余的 " - - ",
# 也可以在 Xboard 4.9.1 中正常识别和打开
#-------------------

## steps: 
# 1. 检测参数类型
# 2. 读取文件内容，并确认文件类型(PGN/FEN)
# 3. 快捷功能：如果后面只有一个数字，并且不存在这个文件，则自动使用默认的棋例文件，
#	把数字当作这个棋例文件中的棋局序号。支持的棋例数字范围为 1-9999
# *4. (忽略) 容错性检查：如果棋例文件中，没有对应的棋例序号（如数字大于总棋局数），
#	不进行处理，移交 Xboard 主程序来处理和报错
# 5. 如果强行使用 --load-fen 选项加载某个 PGN 对局文件的第X个棋局，则先从 PGN 中提取
#	FEN 数据，并另存到临时文件，再加载这个临时文件。
#  TODO: 如果是标准开局，则可能找不到 FEN 数据，需要使用默认开局 FEN。

## step 1:
	_OPT="$1"; shift;

#  if [ "SAMPLE_MODE" = 1 ]; then
#    cd "$global_sample_dir"
#  fi
  
## step 2:
# tag 880: 
# 根据用户的选项，初次指定棋例文件和备注文字	
	case "$_OPT" in

    	  -lf | --load-fen)
    	    FORMAT1="FEN"
    	    if [ -z "$_file" ]; then
		if [ -n "${samp_fen[0]}" ]; then
	    	      _file="${samp_fen[0]}"
	    	      DESC="${samp_fen_desc[0]}"
		elif [ -n "${samp_fen[1]}" ]; then
	    	      _file="${samp_fen[1]}"
	    	      DESC="${samp_fen_desc[1]}"		
		else
	    	      _file="${samp_fen[2]}"
	    	      DESC="${samp_fen_desc[2]}"
		fi
    	    fi
    	    ;;
    	    
    	 -lg | --load-pgn)
    	    FORMAT1="PGN"
    	    if [ -z "$_file" ]; then
		if [ -n "${samp_pgn[0]}" ]; then
	    	      _file="${samp_pgn[0]}"
	    	      DESC="${samp_pgn_desc[0]}"
		elif [ -n "${samp_pgn[1]}" ]; then
	    	      _file="${samp_pgn[1]}"
	    	      DESC="${samp_pgn_desc[1]}"		
		else
	    	      _file="${samp_pgn[2]}"
	    	      DESC="${samp_pgn_desc[2]}"
		fi
    	    fi
    	    ;;
    	      
    	  *)
    	    FORMAT1="UNKNOWN"
    	    echo " 错误 (E760): 未知的选项 $_OPT " 1>&2; continue
    	     ;;  
    	esac    
# tag 880 end ##

## step 3:
	  echo " 加载 Xboard 中国象棋 [ $FORMAT1 ] 文件..." | grep --color=auto " $FORMAT1 "
	  echo "   用法: $_OPT [文件]"
	  echo "         $_OPT [数字序号]"
	  echo "         $_OPT [文件] [数字序号]"
	  echo "     (或者在 $_OPT 选项前，使用选项 -sqyq, -ttxq, -sp 来指定棋例文件)"
	
	  echo " Xboard 中国象棋棋例目录: $global_sample_dir/"

## step 4a: 
# 如果 -lf, -lp 后面没有更多参数

	if [ "$#" -eq 0 ]; then
	  LOAD_MODE=FILE
	  
# step 4b:
# 如果 -lf, -lp 后面有一个，或两个，或更多个参数
# 如果 -lf, -lp 后面有一个数字，并且不存在这个文件，则自动使用默认的棋例文件，
#	把数字当作这个棋例文件中的棋局序号。

	else # [ "$#" -ge 1 ];

	      case "$1" in
	        -*) LOAD_MODE=FILE; continue ;;

	        *[^0-9]*)

		   if [ -s "$1" ]; then

		     if [ "$2" = "" ]; then
	               _file="$1"
             	       LOAD_MODE="FILE"; shift
		     else
	               _file="$1"; INDEX="$2"
             	       LOAD_MODE="INDEX"; shift 2
		     fi

	           else LOAD_MODE="UNKNOWN"; shift
	           fi
	         	 ;;
	        *) # 如果参数是纯数字，则当成 索引号 来识别
		   INDEX="$1"
             	   LOAD_MODE="INDEX"; shift
	           	 ;;
	       esac


# step 4.999
	fi

# step 5:
# 检测文件 _file 的实际格式 (PGN/FEN)。
# 必要时，修正加载棋例文件时调用的 Xboard 相关选项: -lgf 还是 -lpf, -lgi 还是 -lpi

	  if [ -s "$_file" ]; then

## 对于某些特殊文件名命名规则的中国象棋棋例文件 (如以 xq_ 开头，扩展名为 fen 的棋例)
#  这类文件内容带有 PGN 格式的 [Event], [FEN] 等标签，但并不包含走法。 
#  这类文件也会判定为 PGN 格式。
#  区别：
# * 如果使用 -lg 选项加载 PGN 文件，则会显示文件中包含的全部棋局清单。也可以在
#	清单中选择任意一局。如果 PGN 文件中包含走法，则加载某一局后，会自动走棋演示；
#	缺点：不能按 Shift + 上翻页键/上翻页键 快速移动到上一局/下一局；
# * 如果使用 -lf 选项加载 PGN 文件，如果没有指定棋局数字索引号，则默认直接加载第一局.
#  也可以在按 Shift + 上翻页键/上翻页键 快速移动到上一局/下一局；

	    if grep -E "\[Event \"|\[FEN \"" "$_file" &>/dev/null; then
	      FORMAT2="PGN"
	    elif grep -i "[abcehknpr1-9] [wbr] 0 [0-9]" "$_file" &>/dev/null; then  
	        FORMAT2="FEN"
	    elif grep -i "[abcehknpr1-9] [wbr] - - 0 [0-9]" "$_file" &>/dev/null; then  
	        FORMAT2="FEN"
	    else FORMAT2="$FORMAT1"
	    fi

	      echo -e "\n * 检测文件:\n   $_file"
	      echo "   文件格式判定: $FORMAT2" | grep --color=auto "$FORMAT2"


	  else echo -e " 错误 (E999): 无效的象棋棋例文件:\n   $_file" 1>&2
		LOAD_MODE=UNKNOWN
	  fi	  

## * step 5.5 (optional):
# 如果文件内容是 Xboard PGN 格式 (即 FORMAT2 = PGN)，
# 则有必要核对 PGN 棋局文件中的 Event 和 FEN 数量
	if [ "$FORMAT2" = PGN ]; then
	    COUNT_EVENT=`grep -i "\[Event \"" "$_file" | wc -l`
	    COUNT_FEN=`grep "\[FEN \"" "$_file" | wc -l`
	     
	    echo " * 核对 PGN 棋局文件中的 Event 和 FEN 数量..."
	    echo "   [Event \"\"] 计数: $COUNT_EVENT"
	    echo "   [FEN \"\"]   计数: $COUNT_FEN"    
	fi
	
## step 6: 
# 针对 FEN-PGN 模式 (即以 FEN 方式，加载 PGN 格式的文件)，进行必要的文件
# 转换（只提取 PGN 的[XXX]标签，不提取走法和花括号里的注释信息）;
#
# 需要变通处理的几种情况：
# 1. 以 PGN 对局文件方式，加载 FEN 文件时，强制改为以 FEN 方式加载;
# 2. 以 FEN 局面文件方式，加载 Xboard 格式的 PGN 文件时，先提取所有 [Event],
#    [FEN], 以及其它标签（但不提取走棋数据），另存为主文件名相同的临时文件
#    /tmp/xxx.FEN , 再改为“以 PGN 方式”加载。好处：如果未指定 索引号，可以
#    以列表的形式，显示每个棋局的 Event 名称，最终胜负结果，以及其它信息，
#    同时也可以更方便地快速选择某个棋局;
# 3. 以 PGN 对局方式，加载 标签中国象棋格式的 PGN 文件。说明：这类 PGN 文件
#    的第一行内容，通常是 [Chinese Chess]。且每个 PGN 文件，通常只记录一个
#    棋局
#
# 导出生成 PGN/FEN 临时文件。临时文件保存在 /tmp/ 目录下，且以原文件的名称为主，在
#   后面添加“月日-时分秒”，以及大写的扩展名 PGN/FEN。因为是临时文件，可以忽略年份
 	
	 if [ "${FORMAT1}-${FORMAT2}" = "FEN-PGN" ]; then

	    TIMESTAMP="`date '+%m%d-%H%M%S'`"	
	    BASENAME="`basename "${_file}"`_${TIMESTAMP}.$SUFFIX"
	    _tmpfile="/tmp/$BASENAME"
	    echo -e " * 从 PGN 对局/棋谱文件中提取 FEN 局面数据, 另存为\n    $_tmpfile"       

# tag 939c: 提取标准 PGN/FEN 中国象棋对局/局面文件中的所有整行 [FEN ""] 标签，
# 另存 Xboard 中国象棋的一组或者多组 FEN 局面数据到 临时文件 

	  if [ "$PGN2FEN_MODE"  = 1 ]; then
	    grep "\[FEN \"" "$_file" | cut -d '"' -f2 > "$_tmpfile"
	  elif [ "$PGN2FEN_MODE"  = 2 ]; then
	    grep "\[[A-Z]" "$_file" | sed '/\[Event/s//--\n&/' > "$_tmpfile"
          else # same as =1
	    grep "\[FEN \"" "$_file" | cut -d '"' -f2 > "$_tmpfile"
	  fi

	    if [ "$COUNT_EVENT" != "$COUNT_FEN" ]; then
	      echo "   警告 (W909c): Event 和 FEN 数量不配对 (如: 部分 FEN 数据缺失)" | grep --color=auto "警告" 1>&2
	      echo "     [Event] =$COUNT_EVENT 个  [FEN] =$COUNT_FEN 个" 1>&2
	    fi

	    _file="$_tmpfile"
	    echo " * 转换为临时棋例文件: $_file"
	 
       fi
# ---------- step 6 end ---------- ## 

## step 7:


## step 8:
# 根据参数指定的文件类型 FORMAT1 ，结合文件实际类型 FORMAT2, 
# 以及 LOAD_MODE
# 确定最终的加载方式，是 -lpf  (以 FEN 局面文件方式加载) 
# 还是 -lgf (以 PGN 对局文件方式加载)

	      case "${LOAD_MODE}-${FORMAT1}-${FORMAT2}" in

		FILE-FEN-FEN) LOAD_STR="-lpf '$_file'" ;;
		INDEX-FEN-FEN) LOAD_STR="-lpf '$_file' -lpi $INDEX" ;;

	        FILE-PGN-PGN) LOAD_STR="-lgf '$_file'" ;;
	        INDEX-PGN-PGN) LOAD_STR="-lgf '$_file' -lgi $INDEX" ;;

	        FILE-FEN-PGN | FILE-PGN-FEN) LOAD_STR="-lpf '$_file'" ;;
		INDEX-FEN-PGN | INDEX-PGN-FEN) LOAD_STR="-lpf '$_file' -lpi $INDEX" ;;

	        UNKNOWN* | *) LOAD_STR= ;;
	      esac

	echo " 加载文件..."
	;;


## option --load-fen, --load-pgn end #	   


# tag 910:
# --init      
    	--init)
	  echo " 删除用户的 Xboard 中国象棋配置文件 ~/.xboard-xiangqi-rc ..." 
    	  echo "   提示：如果无法正常启动 Xboard 中国象棋，可以使用此功能来修复某些问题"
    	  if [ -s "$xxq_ucfg" ]; then
    	    rm -v "$xxq_ucfg"
    	  fi
	  exit 0 ;;

# tag 1021:
    	 -sqyq) # 强制指定默认的棋例文件，为《适情雅趣》的551局残局棋例
    	   samp_fen[0]="${samp_fen[1]}"
	   samp_fen_desc[0]="${samp_fen_desc[1]}"
	   
	   samp_pgn[0]="${samp_pgn[1]}"
	   samp_pgn_desc[0]="${samp_pgn_desc[1]}"

	   shift ;;

    	 -ttxq) # 强制指定默认的棋例文件，为腾迅天天象棋，残局闯关的360局残局棋例
    	   
	   samp_fen[0]="${samp_fen[2]}"
	   samp_fen_desc[0]="${samp_fen_desc[2]}"
	   
	   samp_pgn[0]="${samp_pgn[2]}"
	   samp_pgn_desc[0]="${samp_pgn_desc[2]}"
	   
	   shift ;;	   
	      
#
    	-db | --debug)
    	  n=5
	  echo " 修正 Xboard 中国象棋的个人配置文件 $xxq_ucfg ..."
	  if [ -s "$xxq_ucfg" ]; then
	    echo -e "   显示文件最后 $n 行:"
	    echo " -------------- "
	    tail -n $n "$xxq_ucfg"
	    echo " -------------- "
	    
	    LINE_ID=`wc -l $xxq_ucfg | cut -d' ' -f1`
	    # 读取最后一行的内容，保存为变量
	    STR="`sed -n "${LINE_ID}p" $xxq_ucfg`"
	    case "$STR" in
	     -* | \;*) echo "   忽略以连字符 (-) 开头的参数行，以及以分号 (;) 开头的注释行...退出"
	        exit 0;
	     	;;
	     *) echo "   更新/修复 配置文件 $xxq_ucfg ..." 
	       sed -i "${LINE_ID}c; $STR" "$xxq_ucfg"
	       ## 使用 sed '行号d' 来删除指定的行
	       #sed -i "${LINE_ID}d" "$xxq_ucfg"
	       	    echo -e "   显示更新后的最后 $n 行:"
	    echo " -------------- "
	    tail -n $n "$xxq_ucfg"
	    echo " -------------- "
	    
	    if [ "$?" = 0 ]; then
	      echo "  OK."
	    fi
	     	;;	
	    esac
	  else
	    echo " 提示: Xboard 中国象棋的个人配置文件 $xxq_ucfg 不存在！退出" 1>&2  
	  fi
	  
	  exit 0 ;;
	  
    	-x | --extra)
	  _show_extra_option
	  exit 0 ;;

    	-v | --version)
	  echo "  $APPNAME $APPVER"
	  exit 0 ;;

    	-*)
	  echo "Unrecognized option \`$option'" 1>&2
	  exit 1 ;;	
	esac
	
done

# tag 415: ---
## 检查象棋引擎是否已经用特定选项 -2, --maxqi, --hoixiangqi 
# 或者 -fcp, -scp 进行了强行指定。
#  如果未指定 ( CUSTOM_XXQ_ENGINE=0 ), 则默认中国象棋的引擎优先顺序为：
#  第一选择：棋力最强的 sjaakii (软件包 sjaakii 自带） 
#  第二选择：棋力一般的 maxqi (软件包 fairymax 自带。通常默认已安装）
#  第三选择：棋力一般的 hoixiangqi 引擎 (软件包 hoichess 自带）
#
# 默认情况下，不会自动使用 EleEye 引擎，因为该引擎不稳定，经常中途报错、停止运行

if [ "$CUSTOM_XXQ_ENGINE" = 0 ]; then
  echo " 查找可用的中国象棋引擎... "
    for e in "${xxq_engine[@]}"; do
      if which $e &>/dev/null; then
        echo " * 找到 $e (`which $e`)"
    	FCP="$e"; SCP="$e"

# tag 1380a: 容错功能:
# 如果用户强行删除了其它中国象棋引擎，只保留了 eleeye 系列引擎，
# 则有必要强制指定 eleely 使用 UCCI 协议   	  
    	  case "$e" in
	    eleeye_engine | ELEEYE | eleeye)
     	  	FCP="$e -fUCCI -uxiAdapter {uci2wb -%variant "%fcp" "%fd"}"
    	  	SCP="$e -sUCCI -uxiAdapter {uci2wb -%variant "%scp" "%sd"}"
    	      		;;
    	  esac
    	  
        break  
      fi
    done
    
    echo

#
    for e in "${eng_eleeye[@]}"; do
      if which $e &>/dev/null; then
        echo " * 找到 中国象棋引擎 象眼 (EleEye): $e (`which $e`)"
      fi
    done    
fi

## tag 460: launch XBoard Xiangqi now!
echo
  if [ -s "$xxq_gcfg_dir/${xxq_gcfg[1]}" ]; then
    echo " * [找到] 中国象棋主题的配置文件: $xxq_gcfg_dir/${xxq_gcfg[1]}"
	XXQ_THEME_CONF="${xxq_gcfg[1]}" #file: xiangqi
  else  
    echo " * [使用] 中国象棋主题的配置文件: $xxq_gcfg_dir/${xxq_gcfg[0]}"
    XXQ_THEME_CONF="${xxq_gcfg[0]}"	#file: xq
  fi
  
VARIANT_STR="-variant xiangqi"
  
## XXQ_CFG_STR 的作用: 读取默认的配置文件，并指定保存到某个配置文件。
# 这个变量必须放最前面加载，后面的其它变量设置可以替换新值。 
#
# Command samples:
#  xboard $XXQ_CFG_STR $VARIANT_STR -size $SIZE -fcp $FCP -scp $SCP \
#   xboard @xq -size $SIZE -fcp $FCP -scp $SCP \
# xboard @xiangqi $VARIANT_STR -size $SIZE -fcp $FCP -scp $SCP \

xboard @"$XXQ_THEME_CONF" $VARIANT_STR -size $SIZE -fcp $FCP -scp $SCP \
   $AUTOLOGO_STR $SHOWCOORDS_STR $MOVEHISTORY_STR $ENGINEOUTPUT_STR \
   -pid ~~/themes/"$XXQ_PID" -ubt true \
   -lbtf ~~/themes/textures/"$XQBOARD.png" \
   -dbtf ~~/themes/textures/"$XQBOARD.png" \
   -trueColors true -hsc '#ffff00' -phc '#ff0000' -overrideLineGap 0 $LOAD_STR &
  
### BODY end ###

exit 0;
