svg/eo_Analyzing.svg svg/eo_Black.svg \
svg/eo_Clear.svg svg/eo_Ponder.svg \
svg/eo_Thinking.svg svg/eo_Unknown.svg \
- svg/eo_White.svg
+ svg/eo_White.svg svg/WhiteDucky.svg
shogidir = $(gamedatadir)/themes/shogi
dist_shogi_DATA = \
case VariantLion: /* should work */
case VariantChuChess: /* should work */
case VariantJanggi:
+ case VariantDuck:
break;
}
}
int lastLoadGameUseList = FALSE;
char lastLoadGameTitle[MSG_SIZ], lastLoadPositionTitle[MSG_SIZ];
ChessMove lastLoadGameStart = EndOfFile;
-int doubleClick;
+int doubleClick, doDuck = -1, duckX, duckY;
Boolean addToBookFlag;
static Board rightsBoard, nullBoard;
UserMoveEvent (int fromX, int fromY, int toX, int toY, int promoChar)
{
ChessMove moveType;
- ChessSquare pup;
+ ChessSquare pup = boards[currentMove][fromY][fromX];
int ff=fromX, rf=fromY, ft=toX, rt=toY;
/* Check if the user is playing in turn. This is complicated because we
case AnalyzeMode:
case Training:
if(fromY == DROP_RANK) break; // [HGM] drop moves (entered through move type-in) are automatically assigned to side-to-move
- if ((int) boards[currentMove][fromY][fromX] >= (int) BlackPawn &&
- (int) boards[currentMove][fromY][fromX] < (int) EmptySquare) {
+ if ((int) pup >= (int) BlackPawn &&
+ (int) pup < (int) EmptySquare) {
/* User is moving for Black */
if (WhiteOnMove(currentMove)) {
DisplayMoveError(_("It is White's turn"));
return;
}
- } else {
+ } else if(pup < (int) BlackPawn) {
/* User is moving for White */
if (!WhiteOnMove(currentMove)) {
DisplayMoveError(_("It is Black's turn"));
ClearMap();
+ if(gameInfo.variant == VariantDuck) {
+ if(doDuck < 0) { // Duck move not yet indicated
+ Board testBoard;
+ CopyBoard(testBoard, boards[forwardMostMove]); // do the move without Duck
+ ApplyMove(fromX, fromY, toX, toY, promoChar, testBoard);
+ DrawPosition(TRUE, testBoard);
+ duckX = fromX; duckY = fromY; doDuck = promoChar; // remember promotion
+ return 1;
+ }
+ }
+
/* If we need the chess program but it's dead, restart it */
ResurrectChessProgram();
x = BOARD_WIDTH - 1 - x;
}
+ saveAnimate = appData.animate;
+ if(clickType == Press && doDuck >= 0) { // extra click for Duck placement
+ if(boards[currentMove][y][x] != EmptySquare && (x != duckX || y != duckY)) return; // ignore clicks on occupied square
+ killX = x; killY = y;
+ appData.animate = FALSE;
+ UserMoveEvent(duckX, duckY, toX, toY, doDuck); // promoChoice remembered in doDuck
+ fromX = fromY = killX = killY = -1;
+ appData.animate = saveAnimate;
+ doDuck = -1;
+ return;
+ }
+
if(gameMode == EditPosition && fromX < 0 && selectedType != EmptySquare &&
(boards[currentMove][y][x] == EmptySquare || x == createX && y == createY)) { // placement click
if(clickType == Press) {
piece = boards[currentMove][fromY][fromX];
- saveAnimate = appData.animate;
if (clickType == Press) {
if(gameInfo.variant == VariantChuChess && piece != WhitePawn && piece != BlackPawn) defaultPromoChoice = piece;
if(gameMode == EditPosition && boards[currentMove][fromY][fromX] == EmptySquare) {
if(q) legs = 2, p = q; else legs = 1; // with 3-leg move we clipof first two legs!
safeStrCpy(machineMove, firstLeg + (p - machineMove) + 1, 20);
}
- if(firstLeg[0]) { // there was a previous leg;
+ if(firstLeg[0]) { // there was a previous leg
+ char buf[20], *p = machineMove+1, *q = buf+1, f;
+ if(gameInfo.variant == VariantDuck) { // Duck Chess: 1st leg is FIDE move, 2nd is Duck
+ sscanf(machineMove, "%c%d%c%d", &f, &killY, &f, &killY); killX = f - AAA; killY -= ONE - '0';
+ safeStrCpy(machineMove, firstLeg, 20);
+ } else {
// only support case where same piece makes two step
- char buf[20], *p = machineMove+1, *q = buf+1, f;
safeStrCpy(buf, machineMove, 20);
while(isdigit(*q)) q++; // find start of to-square
safeStrCpy(machineMove, firstLeg, 20);
else if(*p == *buf) // if first-leg to not equal to second-leg from first leg says unmodified (assume it is King move of castling)
safeStrCpy(p, q, 20); // glue to-square of second leg to from-square of first, to process over-all move
sscanf(buf, "%c%d", &f, &killY); killX = f - AAA; killY -= ONE - '0'; // pass intermediate square to MakeMove in global
- firstLeg[0] = NULLCHAR; legs = 0;
+ }
+ firstLeg[0] = NULLCHAR; legs = 0;
}
if (!ParseOneMove(machineMove, forwardMostMove, &moveType,
if( killX >= 0 && killY >= 0 ) { // [HGM] lion: Lion trampled over something
// victim = board[killY][killX],
+ if(gameInfo.variant == VariantDuck) { // killXY used to indicate Duck move
+ int r, f;
+ for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) if(board[r][f] == DarkSquare) board[r][f] = EmptySquare;
+ board[killY][killX] = DarkSquare;
+ } else {
killed = board[killY][killX],
board[killY][killX] = EmptySquare,
board[EP_STATUS] = EP_CAPTURE;
killed2 = board[kill2Y][kill2X], board[kill2Y][kill2X] = EmptySquare;
if(killed == EmptySquare) // [HGM] unload: kill-square also used for push destination
board[killY][killX] = board[toY][toX], board[EP_STATUS] = EP_NONE;
+ }
}
if( board[toY][toX] != EmptySquare ) {
// forwardMostMove++; // [HGM] bare: moved downstream
diceRoll[0] = NULLCHAR; // [HGM] dice: consumed by this move
+ if(gameInfo.variant != VariantDuck) {
if(kill2X >= 0) x = kill2X, y = kill2Y; else
if(killX >= 0 && killY >= 0) x = killX, y = killY; // [HGM] lion: make SAN move to intermediate square, if there is one
+ }
(void) CoordsToAlgebraic(boards[forwardMostMove],
PosFlags(forwardMostMove),
fromY, fromX, y, x, (killX < 0)*promoChar,
s);
if(kill2X >= 0 && kill2Y >= 0)
sprintf(s + strlen(s), "x%c%d", killX + AAA, killY + ONE - '0'); // 2nd leg of 3-leg move is always capture
- if(killX >= 0 && killY >= 0)
+ if(killX >= 0 && killY >= 0) {
+ if(gameInfo.variant == VariantDuck) {
+ if(promoChar) sprintf(s + strlen(s), "=%c,%c%d", ToUpper(promoChar), killX + AAA, killY + ONE - '0');
+ else sprintf(s + strlen(s), ",%c%d", killX + AAA, killY + ONE - '0');
+ } else
sprintf(s + strlen(s), "%c%c%d%c", p == EmptySquare || toX == fromX && toY == fromY || toX== kill2X && toY == kill2Y ? '-' : 'x',
toX + AAA, toY + ONE - '0', promoChar);
+ }
if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting (should be separate routine, really) */
int timeLeft; static int lastLoadFlag=0; int king, piece;
if (piece >= EmptySquare) return;
if(x2 >= 0) toX = kill2X, toY = kill2Y; else
- if(killX >= 0) toX = killX, toY = killY; // [HGM] lion: first to kill square
+ if(killX >= 0 && gameInfo.variant != VariantDuck) toX = killX, toY = killY; // [HGM] lion: first to kill square
again:
snprintf(tString, 3, "%d", piece);
align = 4; // holdings count in upper-left corner
}
- if(piece == DarkSquare) square_color = 2;
+ if(piece == DarkSquare) square_color = (gameInfo.variant == VariantDuck ? 3 : 2);
if(square_color == 2 || appData.blindfold) piece = EmptySquare;
if (do_flash && piece != EmptySquare && appData.flashCount > 0) {
VariantLion,
VariantChuChess,
VariantJanggi,
+ VariantDuck,
VariantUnknown /* Catchall for other unknown variants */
} VariantClass;
"lion",\
"elven",\
"janggi",\
+ "duck",\
"unknown" \
}
{ VariantJanggi, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFFF", NULL, Button, N_("Janggi (9x10)")}, // dummy, to have good alignment
{ VariantChuChess, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("elven chess (10x10)")},
{ VariantCourier, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("courier (12x8)")},
-{ -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
+{ VariantDuck, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("Duck Chess")},
+//{ -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
{ VariantChu, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("chu shogi (12x12)")},
// optional buttons for engine-defined variants
{ 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" },
Boolean cairoAnimate;
Option *currBoard;
cairo_surface_t *csBoardWindow;
-static cairo_surface_t *pngPieceImages[2][(int)BlackPawn]; // png 256 x 256 images
-static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn]; // scaled pieces as used
-static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn]; // scaled pieces in store
-static RsvgHandle *svgPieces[2][(int)BlackPawn]; // vector pieces in store
+static cairo_surface_t *pngPieceImages[2][(int)BlackPawn+1]; // png 256 x 256 images
+static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn+1]; // scaled pieces as used
+static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn+1]; // scaled pieces in store
+static RsvgHandle *svgPieces[2][(int)BlackPawn+1]; // vector pieces in store
static cairo_surface_t *pngBoardBitmap[2], *pngOriginalBoardBitmap[2];
int useTexture, textureW[2], textureH[2];
int i;
for(i=0; i<2; i++) {
int p;
- for(p=0; p<=(int)WhiteKing; p++)
+ for(p=0; p<=(int)WhiteKing+1; p++)
pngPieceBitmaps[i][p] = pngPieceBitmaps2[i][p]; // defaults
if(v == VariantShogi && BOARD_HEIGHT != 7) { // no exceptions in Tori Shogi
pngPieceBitmaps[i][(int)WhiteCannon] = pngPieceBitmaps2[i][(int)WhiteTokin];
"LShield", "Pegasus", "Wizard", "Copper", "Iron", "Viking", "Flag", "Axe", "Dolphin", "Leopard", "Claw",
"Left", "Butterfly", "PromoBishop", "PromoRook", "HCrown", "RShield", "Prince", "Phoenix", "Kylin", "Drunk", "Right",
"GoldPawn", "GoldKnight", "PromoHorse", "PromoDragon", "GoldLance", "GoldSilver", "HSword", "PromoSword", "PromoHSword", "Princess", "King",
- NULL
+ "Ducky", NULL
};
char *backupPiece[] = { // pieces that map on other in default theme ("Crown" - "Drunk")
int p;
for(p=0; pngPieceNames[p]; p++) {
ScaleOnePiece(0, p, pieceDir);
+ if(p == BlackPawn) break; // no black Duck
ScaleOnePiece(1, p, pieceDir);
}
SelectPieces(gameInfo.variant);
case 0: col = appData.darkSquareColor; break;
case 1: col = appData.lightSquareColor; break;
case 2: col = "#000000"; break;
+ case 3: col = "#6080C0"; break;
default: col = "#808080"; break; // cannot happen
}
SetPen(cr, 2.0, col, 0);
}
if(piece == WhiteKing && kind == appData.jewelled) piece = WhiteZebra;
if(appData.upsideDown && flipView) kind = 1 - kind; // swap white and black pieces
+ if(square_color == 3) piece = BlackPawn, kind = 0; // Ducky
BlankSquare(dest, x, y, square_color, piece, 1); // erase previous contents with background
cr = cairo_create (dest);
cairo_set_source_surface (cr, pngPieceBitmaps[kind][piece], x, y);
fromY = (currentMoveString[1] = coord[1] + '0') - ONE;
currentMoveString[4] = cl.promoCharIn = PromoSuffix(p);
currentMoveString[5] = NULLCHAR;
+ if(**p == ',' && gameInfo.variant == VariantDuck) { // Duck square follows
+ currentMoveString[7] = currentMoveString[4];
+ currentMoveString[4] = ';';
+ currentMoveString[5] = *++*p; killX = **p - AAA;
+ currentMoveString[6] = *++*p; killY = *(*p)++ - ONE;
+ currentMoveString[8] = NULLCHAR;
+ }
if(**p == 'x' && !cl.promoCharIn) { // other leg follows
char *q = *p;
int x = *++*p, y;
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ width="100"
+ height="100"
+ sodipodi:docname="WhiteDuck.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective3614"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638-9"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638-0"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638-96"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3638-19"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3625"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3647"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3669"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1124"
+ inkscape:window-height="802"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="2"
+ inkscape:cx="193"
+ inkscape:cy="94"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <g
+ id="g3637">
+ <g
+ id="g3616">
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;stroke:#a2b1fa;stroke-width:3.59820843000000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3613"
+ sodipodi:cx="199.25"
+ sodipodi:cy="202.5"
+ sodipodi:rx="32.75"
+ sodipodi:ry="10"
+ d="m 232,202.5 a 32.75,10 0 1 1 -65.5,0 32.75,10 0 1 1 65.5,0 z"
+ transform="matrix(1.0050764,0,0,0.69162518,-149.51147,-59.804098)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;stroke:#a2b1fa;stroke-width:2.31191682999999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3613-4"
+ sodipodi:cx="199.25"
+ sodipodi:cy="202.5"
+ sodipodi:rx="32.75"
+ sodipodi:ry="10"
+ d="m 232,202.5 a 32.75,10 0 1 1 -65.5,0 32.75,10 0 1 1 65.5,0 z"
+ transform="matrix(1.3922046,0,0,1.2094699,-225.89676,-164.41765)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;stroke:#a2b1fa;stroke-width:1.72233140000000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3613-4-7"
+ sodipodi:cx="199.25"
+ sodipodi:cy="202.5"
+ sodipodi:rx="32.75"
+ sodipodi:ry="10"
+ d="m 232,202.5 a 32.75,10 0 1 1 -65.5,0 32.75,10 0 1 1 65.5,0 z"
+ transform="matrix(1.7505717,0,0,1.7331222,-298.05141,-269.70724)" />
+ </g>
+ <g
+ id="g3628">
+ <path
+ style="fill:#f5e016;fill-opacity:1;stroke:#000000;stroke-width:2.20000004999999987;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 50.10422,39.31099 C 62.98639,22.18929 46.67998,9.48478 37.17546,9.49568 25.28834,10.88793 19.86873,16.72659 19.23351,25.85452 c 5.37616,0.31504 8.87072,1.88449 10.02638,5.01319 -0.52127,4.44955 -3.00742,6.44301 -6.33245,7.38787 l 3.43008,3.95778 c -4.63103,3.8642 -8.32649,9.2487 -7.38786,22.16359 2.9658,12.66059 12.61804,15.59547 23.21899,17.15039 14.34165,1.81151 25.5867,-1.0219 34.3008,-7.65171 12.80354,-11.42796 12.49244,-39.20106 9.48962,-36.66517 -4.92718,4.16103 -30.64579,7.08709 -35.611,1.83667"
+ id="path2822"
+ sodipodi:nodetypes="cccccccccsc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 43.50792,63.58539 c 9.78278,3.05149 19.79904,4.7799 31.66226,-3.95778 4.65312,-3.3093 5.15886,-7.14208 -2.90237,-5.01319 3.6299,-1.42009 2.71518,-7.76065 -3.95778,-3.69394 3.05525,-4.93585 -1.51841,-7.69981 -14.24802,-2.11081 l 0,0"
+ id="path2824"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ style="fill:#e38100;fill-opacity:1;stroke:#000000;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 19.23351,26.38223 c 6.01739,0.15753 8.15356,2.25567 10.02638,4.48548 -1.23478,6.59234 -6.84509,8.18408 -12.92876,9.23483 -4.74654,-0.61705 -8.97975,-1.75462 -6.86015,-5.80475 l 7.38786,-5.54089 2.37467,-2.37467 z"
+ id="path2826"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:8.3380003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path2828"
+ sodipodi:cx="140.5"
+ sodipodi:cy="88.5"
+ sodipodi:rx="13.5"
+ sodipodi:ry="13.5"
+ d="m 154,88.5 a 13.5,13.5 0 1 1 -27,0 13.5,13.5 0 1 1 27,0 z"
+ transform="matrix(0.26385224,0,0,0.26385224,-1.61082,2.89938)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffcc;stroke-width:8.3380003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3602"
+ sodipodi:cx="141"
+ sodipodi:cy="83.5"
+ sodipodi:rx="4"
+ sodipodi:ry="5.5"
+ d="m 145,83.5 a 4,5.5 0 1 1 -8,0 4,5.5 0 1 1 8,0 z"
+ transform="matrix(0.26385224,0,0,0.26385224,-1.61082,2.89938)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8.3380003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3604"
+ sodipodi:cx="51.5"
+ sodipodi:cy="123.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 54,123.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(0.26385224,0,0,0.26385224,1.81926,4.48249)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8.3380003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3604-2"
+ sodipodi:cx="51.5"
+ sodipodi:cy="123.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 54,123.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(0.26385224,0,0,0.26385224,-2.5343,2.76745)" />
+ </g>
+ </g>
+</svg>