diff --git a/src-ui/js/list.js b/src-ui/js/list.js
index ff20c042a..793eff91f 100644
--- a/src-ui/js/list.js
+++ b/src-ui/js/list.js
@@ -233,6 +233,7 @@
"kakuro",
"sudoku",
"fillomino",
+ "symmarea",
"ripple",
"akari",
"shakashaka"
diff --git a/src-ui/js/ui/KeyPopup.js b/src-ui/js/ui/KeyPopup.js
index b955ec442..c20d5904e 100644
--- a/src-ui/js/ui/KeyPopup.js
+++ b/src-ui/js/ui/KeyPopup.js
@@ -73,6 +73,7 @@ ui.keypopup = {
tateyoko: [10, 0],
factors: [10, 10],
fillomino: [10, 10],
+ symmarea: [10, 10],
renban: [10, 10],
ripple: [10, 10],
cojun: [10, 10],
diff --git a/src-ui/list.html b/src-ui/list.html
index ed2940444..971f1019d 100644
--- a/src-ui/list.html
+++ b/src-ui/list.html
@@ -228,6 +228,7 @@
パズルの種類のリスト
+
diff --git a/src/puzzle/Config.js b/src/puzzle/Config.js
index 94dd04f0a..4122585e2 100644
--- a/src/puzzle/Config.js
+++ b/src/puzzle/Config.js
@@ -357,7 +357,7 @@
exec = pid === "mashu";
break;
case "forceallcell":
- exec = pid === "fillomino";
+ exec = pid === "fillomino" || pid === "symmarea";
break;
case "dontpassallcell":
exec = pid === "arukone";
diff --git a/src/pzpr/variety.js b/src/pzpr/variety.js
index 73db9c0e2..6f4dbf0fa 100755
--- a/src/pzpr/variety.js
+++ b/src/pzpr/variety.js
@@ -286,6 +286,7 @@
sudoku: [0, 1, "数独", "Sudoku"],
sukoro: [1, 0, "数コロ", "Sukoro", "sukoro"],
sukororoom: [0, 0, "数コロ部屋", "Sukoro-room", "sukoro"],
+ symmarea: [0, 0, "シンメトリーエリア", "Symmetry Area", "fillomino"],
tapa: [0, 0, "Tapa", "Tapa"],
tasquare: [0, 0, "たすくえあ", "Tasquare"],
tatamibari: [1, 0, "タタミバリ", "Tatamibari"],
diff --git a/src/variety/fillomino.js b/src/variety/fillomino.js
index 6768930df..4f874181b 100644
--- a/src/variety/fillomino.js
+++ b/src/variety/fillomino.js
@@ -7,7 +7,7 @@
} else {
pzpr.classmgr.makeCustom(pidlist, classbase);
}
-})(["fillomino"], {
+})(["fillomino", "symmarea"], {
//---------------------------------------------------------
// マウス入力系
MouseEvent: {
@@ -336,6 +336,7 @@
"checkSideAreaNumberSize",
"checkLargeArea",
"checkNumKinds",
+ "checkRoomSymm@symmarea",
"checkNoNumArea",
"checkNoNumCell_fillomino+"
],
@@ -370,6 +371,23 @@
return area.numkind >= 1;
}, "bkNoNum");
},
+ checkRoomSymm: function() {
+ var board = this.board;
+ this.checkAllErrorRoom(function(area) {
+ var clist = area.clist,
+ d = clist.getRectSize();
+ var sx = d.x1 + d.x2,
+ sy = d.y1 + d.y2;
+ for (var i = 0; i < clist.length; i++) {
+ var cell = clist[i],
+ cell2 = board.getc(sx - cell.bx, sy - cell.by);
+ if (cell2.nblk !== area) {
+ return false;
+ }
+ }
+ return true;
+ }, "bkNotSymmRoom");
+ },
checkAllErrorRoom: function(evalfunc, code) {
var rooms = this.board.numblkgraph.components;
for (var id = 0; id < rooms.length; id++) {
@@ -405,11 +423,15 @@
],
bkMixedNum: [
"1つのブロックに2種類以上の数字が入っています。",
- "A room has two or more kinds of numbers."
+ "A block has two or more kinds of numbers."
],
bsSameNum: [
"同じ数字のブロックが辺を共有しています。",
"Adjacent blocks have the same number."
+ ],
+ bkNotSymmRoom: [
+ "部屋の形が点対称ではありません。",
+ "The block is not point symmetric."
]
}
});
diff --git a/test/script/symmarea.js b/test/script/symmarea.js
new file mode 100644
index 000000000..d8cbf51d6
--- /dev/null
+++ b/test/script/symmarea.js
@@ -0,0 +1,64 @@
+/* symmarea.js */
+
+ui.debug.addDebugData("symmarea", {
+ url: "6/6/g1i1g6i82p53i5g1i4g",
+ failcheck: [
+ [
+ "bkSizeLt",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 1 8 /2 1 6 2 5 . /. 3 3 2 . 5 /. 4 4 4 . 1 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 1 0 /0 0 1 1 0 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 1 1 /1 1 1 0 0 0 /1 1 1 1 1 1 /"
+ ],
+ [
+ "bsSameNum",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 1 /. 1 4 4 . 4 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 1 0 0 0 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 1 /"
+ ],
+ [
+ "bkSizeGt",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 2 5 . /. 3 3 2 . 5 /. 4 4 4 . 5 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 1 0 /0 0 1 1 0 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 0 0 0 /1 1 1 1 1 0 /"
+ ],
+ [
+ "bkMixedNum",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 . 1 . 2 /. . 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 0 0 1 1 0 /"
+ ],
+ [
+ "bkNoNum",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . . /. 4 4 4 . . /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 0 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /"
+ ],
+ [
+ "ceNoNum",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . . . . . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /"
+ ],
+ [
+ "bkNotSymmRoom",
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 8 8 . /6 . 1 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 0 0 1 /0 1 1 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 1 0 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /"
+ ],
+ [
+ null,
+ "pzprv3/symmarea/6/6/. 1 . . . 1 /. 6 . . . 8 /2 . . . . . /. . . . . 5 /3 . . . 5 . /1 . . . 4 . /6 . 8 1 8 . /6 . 8 8 8 . /. 6 6 8 5 8 /2 1 6 5 5 . /. 3 3 1 . 2 /. 4 4 4 . 2 /1 1 1 1 1 /0 1 0 0 0 /1 0 1 1 1 /1 1 1 0 0 /0 0 1 1 1 /1 0 0 0 1 /0 1 0 1 0 1 /1 0 1 0 1 0 /0 1 0 1 0 1 /1 1 1 1 0 1 /1 1 1 1 1 0 /"
+ ]
+ ],
+ inputs: [
+ /* 問題入力はbosanowaと同じなので省略 */
+ /* 回答入力テスト */
+ { input: ["newboard,4,2", "editmode", "cursor,1,1", "key,3", "playmode"] },
+ {
+ input: ["mouse,right, 1,1, 5,1"],
+ result:
+ "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /"
+ },
+ {
+ input: ["mouse,left, 1,1, 5,1"],
+ result:
+ "pzprv3/symmarea/2/4/3 . . . /. . . . /. 3 3 . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /"
+ },
+ {
+ input: ["mouse,left, 7,1, 1,1"],
+ result:
+ "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /-1 -1 0 /0 0 0 /0 0 0 0 /"
+ },
+ {
+ input: ["mouse,left, 2,0, 2,2, 0,2"],
+ result:
+ "pzprv3/symmarea/2/4/3 . . . /. . . . /. . . . /. . . . /2 -1 0 /0 0 0 /1 0 0 0 /"
+ }
+ ]
+});