diff --git a/src-ui/changes.html b/src-ui/changes.html index cd1827415..abcf063e4 100644 --- a/src-ui/changes.html +++ b/src-ui/changes.html @@ -33,13 +33,13 @@
Latest types (all types)
diff --git a/src-ui/img/firewalk.png b/src-ui/img/firewalk.png new file mode 100644 index 000000000..b486248fc Binary files /dev/null and b/src-ui/img/firewalk.png differ diff --git a/src-ui/js/ui/KeyPopup.js b/src-ui/js/ui/KeyPopup.js index 83a1a08b4..d99f6dcf6 100644 --- a/src-ui/js/ui/KeyPopup.js +++ b/src-ui/js/ui/KeyPopup.js @@ -203,7 +203,8 @@ ui.keypopup = { bosnianroad: [80, 0], sananko: [10, 113], zabajaba: [80, 0], - batten: [10, 0] + batten: [10, 0], + firewalk: [10, 0] }, //--------------------------------------------------------------------------- @@ -465,13 +466,19 @@ ui.keypopup = { pid === "icelom2" || pid === "icewalk" || pid === "waterwalk" || + pid === "firewalk" || pid === "dbchoco" ) { itemlist.push([ "q", { text: "■", - color: pid === "dbchoco" ? "rgb(204,204,204)" : "rgb(192,224,255)" + color: + pid === "dbchoco" + ? "rgb(204,204,204)" + : pid === "firewalk" + ? "rgb(255,192,192)" + : "rgb(192,224,255)" } ]); } diff --git a/src-ui/js/ui/Misc.js b/src-ui/js/ui/Misc.js index f0bd9535c..2e2a831c7 100755 --- a/src-ui/js/ui/Misc.js +++ b/src-ui/js/ui/Misc.js @@ -137,6 +137,7 @@ function toBGimage(pid) { "doubleback", "easyasabc", "evolmino", + "firewalk", "geradeweg", "heteromino", "heyapin", diff --git a/src-ui/list.html b/src-ui/list.html index d9fecf037..62b2e01a1 100644 --- a/src-ui/list.html +++ b/src-ui/list.html @@ -157,6 +157,7 @@

パズルの種類のリスト
  • +
  • diff --git a/src-ui/p.html b/src-ui/p.html index 9b18f2e10..a9e649c67 100644 --- a/src-ui/p.html +++ b/src-ui/p.html @@ -156,6 +156,7 @@

    読み込み中です...

    __inputmode.empty__
    __inputmode.ice__
    __inputmode.water__
    +
    __inputmode.fire__
    __inputmode.nabe__
    __inputmode.box__
    __inputmode.pin__
    diff --git a/src-ui/res/p.en.json b/src-ui/res/p.en.json index 63c2c9559..176dae622 100644 --- a/src-ui/res/p.en.json +++ b/src-ui/res/p.en.json @@ -104,6 +104,7 @@ "inputmode.empty": "Invalid cells", "inputmode.ice": "Icebarns", "inputmode.water": "Water hazard", + "inputmode.fire": "Fire", "inputmode.nabe": "Crocks", "inputmode.box": "Boxes", "inputmode.pin": "Pins", diff --git a/src/puzzle/LineManager.js b/src/puzzle/LineManager.js index 93c755839..fbe5c9dd9 100644 --- a/src/puzzle/LineManager.js +++ b/src/puzzle/LineManager.js @@ -248,6 +248,10 @@ pzpr.classmgr.makeCommon({ // linegraph.createNodeIfEmpty() 指定されたオブジェクトの場所にNodeを生成する // linegraph.deleteNodeIfEmpty() 指定されたオブジェクトの場所からNodeを除去する //--------------------------------------------------------------------------- + usesSecondNode: function(cell, other) { + return cell.getvert(other, 2); + }, + createNodeIfEmpty: function(cell) { var nodes = this.getObjNodeList(cell); @@ -265,8 +269,8 @@ pzpr.classmgr.makeCommon({ // 上下/左右の線が1本ずつだった場合は左右の線をnodes[1]に付加し直します var nbnodes = nodes[0].nodes; var isvert = [ - cell.getvert(nbnodes[0].obj, 2), - cell.getvert(nbnodes[1].obj, 2) + this.usesSecondNode(cell, nbnodes[0].obj), + this.usesSecondNode(cell, nbnodes[1].obj) ]; if (isvert[0] !== isvert[1]) { // breaking up a corner; we create two new nodes to ensure diff --git a/src/pzpr/variety.js b/src/pzpr/variety.js index 085efe6b7..7bbdd135b 100755 --- a/src/pzpr/variety.js +++ b/src/pzpr/variety.js @@ -159,6 +159,7 @@ { kanpen2: "fillomino01" } ], firefly: [1, 0, "ホタルビーム", "Hotaru Beam"], + firewalk: [1, 0, "Fire Walk", "Fire Walk", "icewalk"], fivecells: [0, 0, "ファイブセルズ", "FiveCells", "nawabari"], fourcells: [0, 0, "フォーセルズ", "FourCells", "nawabari"], fracdiv: [0, 0, "分数分割", "Fractional Division"], diff --git a/src/res/failcode.en.json b/src/res/failcode.en.json index 5e8d8afa4..4d9fc63ad 100644 --- a/src/res/failcode.en.json +++ b/src/res/failcode.en.json @@ -499,6 +499,7 @@ "lcCurveNe.firefly": "The number of curves is different from a firefly's number.", "lcDeadEnd": "There is a dead-end line.", "lcDivided": "All lines and numbers are not connected to each other.", + "lnDoubleTurn.firewalk": "A cell with double turns has its center outside of the loop.", "lcGrayGt.coffeemilk": "A group has more than one gray circle.", "lcInvalid.coffeemilk": "A white and black circle are connected directly.", "lcInvalid.kusabi": "The types of connected circles don't match.", @@ -588,6 +589,7 @@ "lnRightAngle.kouchoku": "Segments don't intersect at a right angle.", "lnSnLine.lither": "There is only one tree.", "lnStarNe.starbattle": "The number of stars in a line is wrong.", + "lnStraightOnIce.firewalk": "A line goes straight through fire.", "lnWrongAngle.kouchoku": "Some segments meet at the wrong angle.", "lookairBC.lookair": "Two squares of the same size can see each other.", "lpNoNum.onsen": "A loop has no numbers.", diff --git a/src/variety/icewalk.js b/src/variety/icewalk.js index 79c690c92..e6b94fe29 100644 --- a/src/variety/icewalk.js +++ b/src/variety/icewalk.js @@ -4,7 +4,7 @@ } else { pzpr.classmgr.makeCustom(pidlist, classbase); } -})(["icewalk", "waterwalk"], { +})(["icewalk", "waterwalk", "firewalk"], { MouseEvent: { inputModes: { edit: ["ice", "number", "clear", "info-line"], @@ -25,6 +25,13 @@ ) { this.inputpeke(); } + if (this.pid === "firewalk" && this.mouseend && this.notInputted()) { + this.prevPos.reset(); + this.inputdot(); + if (this.notInputted()) { + this.toggleArcs(); + } + } } else if (this.puzzle.editmode) { var cell = this.getcell(); if ( @@ -50,6 +57,101 @@ } } }, + "MouseEvent@firewalk": { + inputModes: { + edit: ["fire", "number", "clear", "info-line"], + play: ["line", "peke", "dot", "info-line"] + }, + mouseinput_other: function() { + if (this.inputMode === "fire") { + this.inputIcebarn(); + } else if (this.inputMode === "dot") { + this.inputdot(); + } + }, + inputdot: function() { + var pos = this.getpos(0.25); + if (this.prevPos.equals(pos)) { + return; + } + + var dot = pos.getDot(); + this.prevPos = pos; + if (dot === null) { + return; + } + + if (this.inputData === null) { + if (this.btn === "left") { + this.inputData = { 0: 1, 1: 2, 2: 0 }[dot.getDot()]; + } else if (this.btn === "right") { + this.inputData = { 0: 2, 1: 0, 2: 1 }[dot.getDot()]; + } else { + return; + } + } + dot.setDot(this.inputData); + dot.draw(); + }, + toggleArcs: function() { + var cell = this.getcell(); + if (cell.isnull || !cell.ice() || cell.lcnt < 3) { + return; + } + cell.setQans(cell.qans !== 1 ? 1 : 2); + cell.drawaround(); + }, + inputLine: function() { + var cell = this.getcell(); + this.initFirstCell(cell); + + var pos = this.getpos(0); + if (this.prevPos.equals(pos)) { + return; + } + var border = this.prevPos.getnb(pos); + + if (!border.isnull) { + if (this.inputData === null) { + this.inputData = border.isLine() ? 0 : 1; + } + if (this.inputData === 1) { + border.setLine(); + if ( + this.prevborder && + Math.abs(this.prevborder.bx - border.bx) === 1 && + Math.abs(this.prevborder.by - border.by) === 1 + ) { + var horz = border.isVert() ? this.prevborder : border; + var vert = border.isVert() ? border : this.prevborder; + + var cell = this.board.cellinside( + Math.min(horz.bx, vert.bx), + Math.min(horz.by, vert.by), + Math.max(horz.bx, vert.bx), + Math.max(horz.by, vert.by) + )[0]; + if (cell && !cell.isnull && cell.ice() && cell.lcnt >= 3) { + var newQans = + (cell.adjborder.top === horz) === + (cell.adjborder.left === vert); + cell.setQans(newQans ? 1 : 2); + } + } + + this.prevborder = border; + } else if (this.inputData === 0) { + border.removeLine(); + } + border.draw(); + } + this.prevPos = pos; + }, + mousereset: function() { + this.common.mousereset.call(this); + this.prevborder = null; + } + }, KeyEvent: { enablemake: true, @@ -70,12 +172,18 @@ return !this.inside; }, posthook: { - line: function() { + line: function(val) { + this.board.scanResult = null; this.board.roommgr.isStale = true; + for (var sc = 0; sc <= 1; sc++) { + var cell = this.sidecell[sc]; + cell.updateFireQans(); + } } } }, Cell: { + updateFireQans: function() {}, posthook: { qnum: function(val) { if (val !== -1 && this.ques === 6) { @@ -84,9 +192,10 @@ }, ques: function(val) { this.board.roommgr.isStale = true; - if (val === 6 && this.qnum !== -1) { + if (val === 6) { this.setQnum(-1); } + this.updateFireQans(); } }, maxnum: function() { @@ -96,11 +205,87 @@ return this.isnull || this.ques === 6; } }, + "Cell@firewalk": { + updateFireQans: function() { + if (this.ice() && this.isLineCurve()) { + var newQans = + this.adjborder.top.isLine() === this.adjborder.left.isLine(); + this.setQans(newQans ? 1 : 2); + } else if (!this.ice() || this.lcnt < 2 || this.isLineStraight()) { + this.setQans(0); + } + } + }, Cross: { l2cnt: 0 }, + "Dot@firewalk": { + getDot: function() { + if (this.piece.group === "cross") { + return this.piece.qsub; + } + return 0; + }, + setDot: function(val) { + if (this.piece.group !== "cross") { + return; + } + this.puzzle.opemgr.disCombine = true; + this.piece.setQsub(val); + this.puzzle.opemgr.disCombine = false; + }, + getTrial: function() { + return this.piece.trial; + } + }, Board: { - hasborder: 2 + hasborder: 2, + scanResult: null, + scanInside: function() { + if (this.scanResult !== null) { + return this.scanResult; + } + + if ( + this.cell.some(function(cell) { + return cell.lcnt === 1 && cell.lcnt === 3; + }) + ) { + this.scanResult = false; + return false; + } + + for (var y = 2; y < this.maxby; y += 2) { + var inside = false; + for (var x = 1; x < this.maxbx; x += 2) { + if (this.getb(x, y).isLine()) { + inside ^= true; + } + this.getx(x + 1, y).inside = inside; + } + } + + this.scanResult = true; + return true; + }, + rebuildInfo: function() { + this.scanResult = null; + this.common.rebuildInfo.call(this); + } + }, + "Board@firewalk": { + hasdots: 1 + }, + "BoardExec@firewalk": { + adjustBoardData: function(key, d) { + if (key & this.TURNFLIP) { + var clist = this.board.cell; + for (var i = 0; i < clist.length; i++) { + var cell = clist[i]; + cell.qans = { 0: 0, 1: 2, 2: 1 }[cell.qans]; + } + } + } }, Graphic: { irowake: true, @@ -112,9 +297,14 @@ this.drawBorders(); this.drawLines(); + this.drawPekes(); this.drawQuesNumbers(); + if (this.pid === "firewalk") { + this.drawDots(); + } + this.drawTarget(); }, getBorderColor: function(border) { @@ -129,12 +319,227 @@ "Graphic@waterwalk": { icecolor: "rgb(163, 216, 255)" }, + "Graphic@firewalk": { + icecolor: "rgb(255, 192, 192)", + + getDotFillColor: function(dot) { + if (dot.getDot() === 1) { + return dot.getTrial() ? this.trialcolor : this.pekecolor; + } else if (dot.getDot() === 2) { + return "white"; + } + return null; + }, + getDotOutlineColor: function(dot) { + if (dot.getDot() === 2) { + return dot.getTrial() ? this.trialcolor : this.pekecolor; + } + return null; + }, + getDotRadius: function(dot) { + return 0.15; + }, + + drawLines: function() { + /* This function may be called outside of calls to paint() */ + this.common.drawLines.call(this); + this.drawArcBackground(); + this.drawArcCorners(); + }, + + drawArcBackground: function() { + var g = this.vinc("arc_back", "crispEdges"); + var clist = this.range.borders.cellinside(); + var pad = this.lw, + bigpad = this.bw / 2; + for (var i = 0; i < clist.length; i++) { + var cell = clist[i], + color = cell.qans ? this.getBGCellColor(cell) : null; + g.vid = "c_arc_bg_" + cell.id; + if (!!color) { + g.fillStyle = color; + + if (cell.lcnt === 4) { + g.fillRectCenter( + cell.bx * this.bw, + cell.by * this.bh, + this.bw - pad, + this.bh - pad + ); + } else { + var adj = cell.adjborder; + var ox, oy; + if ( + (cell.qans === 1 && adj.top.isLine() && adj.left.isLine()) || + (cell.qans === 2 && adj.bottom.isLine() && adj.left.isLine()) + ) { + ox = (cell.bx - 1) * this.bw - pad + bigpad; + } else { + ox = cell.bx * this.bw + pad - bigpad; + } + if ( + (cell.qans === 1 && adj.left.isLine() && adj.top.isLine()) || + (cell.qans === 2 && adj.right.isLine() && adj.top.isLine()) + ) { + oy = (cell.by - 1) * this.bh - pad + bigpad; + } else { + oy = cell.by * this.bh + pad - bigpad; + } + + var w = this.bw + bigpad - pad * 2; + var h = this.bw + bigpad - pad * 2; + g.fillRect(ox, oy, w, h); + } + } else { + g.vhide(); + } + } + }, + drawArcCorners: function() { + var g = this.vinc("arcs", "auto", true); + g.lineWidth = this.lm * 2; + var rsize = this.bw; + var clist = this.range.borders.cellinside(); + for (var i = 0; i < clist.length; i++) { + var cell = clist[i]; + var px1 = (cell.bx - 1) * this.bw, + py1 = (cell.by - 1) * this.bh, + px2 = (cell.bx + 1) * this.bw, + py2 = (cell.by + 1) * this.bh; + + var adj = cell.adjborder; + + for (var arc = 0; arc < 4; arc++) { + var showArc = false; + var color = null; + switch (arc) { + case 0: + showArc = + cell.qans === 1 && adj.top.isLine() && adj.left.isLine(); + color = showArc ? this.getLineColor(adj.top) : null; + break; + case 1: + showArc = + cell.qans === 2 && adj.top.isLine() && adj.right.isLine(); + color = showArc ? this.getLineColor(adj.top) : null; + break; + case 2: + showArc = + cell.qans === 1 && adj.bottom.isLine() && adj.right.isLine(); + color = showArc ? this.getLineColor(adj.bottom) : null; + break; + case 3: + showArc = + cell.qans === 2 && adj.bottom.isLine() && adj.left.isLine(); + color = showArc ? this.getLineColor(adj.bottom) : null; + break; + } + + g.vid = "c_arc_" + arc + "_" + cell.id; + if (!!color) { + g.beginPath(); + g.strokeStyle = color; + + switch (arc) { + case 0: + g.arc(px1, py1, rsize, 0, Math.PI / 2); + break; + case 1: + g.arc(px2, py1, rsize, Math.PI / 2, Math.PI); + break; + case 2: + g.arc(px2, py2, rsize, Math.PI, Math.PI * 1.5); + break; + case 3: + g.arc(px1, py2, rsize, Math.PI * 1.5, Math.PI * 2); + break; + } + g.stroke(); + } else { + g.vhide(); + } + } + } + } + }, LineGraph: { enabled: true }, "LineGraph@icewalk": { isLineCross: true }, + "LineGraph@firewalk": { + relation: { "border.line": "link", "cell.qans": "arcs" }, + isLineCross: true, + + modifyOtherInfo: function(cell, relation) { + var nodes = this.getObjNodeList(cell); + if (nodes.length !== 2) { + return; + } + + var reusenodes = {}; + + for (var i = 0; i < nodes.length; i++) { + while (nodes[i].nodes.length > 0) { + var subnode = nodes[i].nodes[0]; + this.removeEdge(nodes[i], subnode); + var dir = cell.getdir(subnode.obj, 2); + reusenodes[dir] = subnode; + } + } + + var otherdir = [cell.DN, cell.LT, cell.RT][cell.qans]; + + for (var dir = 1; dir <= 4; dir++) { + if (!reusenodes[dir]) { + continue; + } + + if (dir === cell.UP || dir === otherdir) { + this.addEdge(nodes[0], reusenodes[dir]); + } else { + this.addEdge(nodes[1], reusenodes[dir]); + } + } + }, + getSideNodesByLinkObj: function(border) { + var sidenodes = [], + sidenodeobj = this.getSideObjByLinkObj(border); + for (var i = 0; i < sidenodeobj.length; i++) { + var cell = sidenodeobj[i], + nodes = this.getObjNodeList(cell), + node = nodes[0]; + if (!!nodes[1]) { + var dir = cell.getdir(border, 1); + switch (cell.qans) { + case 1: + if (dir === border.DN || dir === border.RT) { + node = nodes[1]; + } + break; + case 2: + if (dir === border.DN || dir === border.LT) { + node = nodes[1]; + } + break; + default: + if (border.isvert) { + node = nodes[1]; + } + break; + } + } + sidenodes.push(node); + } + return sidenodes; + }, + usesSecondNode: function(cell, other) { + var otherdir = [cell.DN, cell.LT, cell.RT][cell.qans]; + var dir = cell.getdir(other, 2); + return dir === cell.UP || dir === otherdir; + } + }, AreaRoomGraph: { countprop: "l2cnt", enabled: true, @@ -162,7 +567,13 @@ FileIO: { decodeData: function() { this.decodeCell(function(cell, ca) { - if (ca === "#") { + if (ca === "A") { + cell.ques = 6; + cell.qans = 1; + } else if (ca === "B") { + cell.ques = 6; + cell.qans = 2; + } else if (ca === "#") { cell.ques = 6; } else if (ca === "-") { cell.qnum = -2; @@ -171,10 +582,19 @@ } }); this.decodeBorderLine(); + if (this.pid === "firewalk") { + this.decodeCross(function(cross, ca) { + cross.qsub = +ca; + }); + } }, encodeData: function() { this.encodeCell(function(cell) { - if (cell.ques === 6) { + if (cell.qans === 1) { + return "A "; + } else if (cell.qans === 2) { + return "B "; + } else if (cell.ques === 6) { return "# "; } else if (cell.qnum === -2) { return "- "; @@ -185,19 +605,31 @@ } }); this.encodeBorderLine(); + if ( + this.pid === "firewalk" && + this.board.cross.some(function(cross) { + return cross.qsub; + }) + ) { + this.encodeCross(function(cross) { + return cross.qsub + " "; + }); + } } }, AnsCheck: { checklist: [ "checkBranchLine", - "checkCrossLine@waterwalk", + "checkCrossLine@waterwalk,firewalk", "checkCrossOutOfIce@icewalk", "checkIceLines@icewalk", "checkWaterWalk@waterwalk", + "checkStraightOnFire@firewalk", "checkLessWalk", "checkOverWalk", "checkOneLoop", + "checkDoubleTurnOutside@firewalk", "checkNoLineOnNum", "checkDeadendLine+" ], @@ -264,5 +696,39 @@ return cell.qnum !== -1 && cell.lcnt === 0; }, "lnIsolate"); } + }, + "AnsCheck@firewalk": { + checkBranchLine: function() { + this.checkAllCell(function(cell) { + return cell.lcnt === 3 && cell.qans === 0; + }, "lnBranch"); + }, + checkCrossLine: function() { + this.checkAllCell(function(cell) { + return cell.lcnt === 4 && cell.qans === 0; + }, "lnCross"); + }, + checkDeadendLine: function() { + this.checkAllCell(function(cell) { + return cell.lcnt === 1 || (cell.lcnt === 3 && cell.qans > 0); + }, "lnDeadEnd"); + }, + checkStraightOnFire: function() { + this.checkAllCell(function(cell) { + return cell.lcnt >= 2 && cell.ice() && cell.qans === 0; + }, "lnStraightOnIce"); + }, + checkDoubleTurnOutside: function() { + if (!this.board.scanInside()) { + return; + } + this.checkAllCell(function(cell) { + return ( + cell.lcnt === 4 && + ((cell.qans === 1 && cell.relcross(-1, -1).inside) || + (cell.qans === 2 && cell.relcross(1, -1).inside)) + ); + }, "lnDoubleTurn"); + } } }); diff --git a/test/script/firewalk.js b/test/script/firewalk.js new file mode 100644 index 000000000..ccb9921e4 --- /dev/null +++ b/test/script/firewalk.js @@ -0,0 +1,88 @@ +/* firewalk.js */ + +ui.debug.addDebugData("firewalk", { + url: "5/5/06601gbg3t2gbgbh", + failcheck: [ + [ + "lnBranch", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . # # . /. . # # . /. . . 2 . /11 . 11 . # /0 0 0 0 0 0 /0 0 0 0 0 0 /0 0 0 0 0 0 /0 0 0 0 0 0 /0 1 1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 1 0 0 0 /0 1 0 0 0 /0 1 0 0 0 /0 0 0 0 0 /" + ], + [ + "lnCross", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A # . /. . # # . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ], + [ + "lnStraightOnIce", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A # . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 0 0 0 /0 0 0 0 1 0 /0 1 1 1 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 0 1 0 /1 0 0 0 1 /0 0 0 0 0 /" + ], + [ + "lnDoubleTurn", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A A . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 1 0 /0 0 0 1 0 0 /0 1 1 1 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 1 /1 0 0 0 1 /0 0 0 0 0 /" + ], + [ + "lnIsolate", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A A . /. . . 2 . /11 . 11 . # /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 0 0 /0 0 0 0 0 0 /0 1 1 0 0 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 0 0 /1 0 1 0 0 /0 0 0 0 0 /" + ], + [ + "bkSizeLt", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . B A . /. . A B . /. . . 2 . /11 . 11 . A /0 1 1 0 1 0 /0 0 0 1 1 0 /0 0 0 1 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 0 1 1 1 /1 0 0 1 0 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ], + [ + "bkSizeGt", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A B . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 0 0 /0 0 1 1 0 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ], + [ + "lnPlLoop", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . B B . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ], + [ + "lnDeadEnd", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A B . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 0 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ], + [ + "lnDeadEnd", + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A B . /. . . 2 . /11 . 11 . # /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 0 /1 0 1 1 0 /0 0 0 0 0 /" + ], + [ + null, + "pzprv3/firewalk/5/5/. 11 . 3 . /. . A A . /. . A B . /. . . 2 . /11 . 11 . A /0 1 0 0 1 0 /0 0 0 1 1 0 /0 0 1 1 1 0 /0 0 0 0 0 0 /0 1 1 0 1 0 /0 0 0 0 0 /1 1 0 1 1 /1 1 1 1 0 /1 0 1 1 1 /1 0 1 1 1 /0 0 0 0 0 /" + ] + ], + inputs: [ + { + input: ["newboard,3,3", "editmode,fire", "mouse,left,3,3"], + result: + "pzprv3/firewalk/3/3/. . . /. # . /. . . /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 /0 0 0 /0 0 0 /0 0 0 /" + }, + { + input: ["playmode", "mouse,left,1,3,3,3,3,1,5,1"], + result: + "pzprv3/firewalk/3/3/. . . /. A . /. . . /0 0 1 0 /0 1 0 0 /0 0 0 0 /0 0 0 /0 1 0 /0 0 0 /0 0 0 /" + }, + { + input: ["mouse,left,3,5,3,3,5,3"], + result: + "pzprv3/firewalk/3/3/. . . /. A . /. . . /0 0 1 0 /0 1 1 0 /0 0 0 0 /0 0 0 /0 1 0 /0 1 0 /0 0 0 /" + }, + { + input: ["mouse,left,1,5,3,5,3,3,1,3"], + result: + "pzprv3/firewalk/3/3/. . . /. B . /. . . /0 0 1 0 /0 1 1 0 /0 1 0 0 /0 0 0 /0 1 0 /0 1 0 /0 0 0 /" + }, + { + input: ["mouse,left,3,3"], + result: + "pzprv3/firewalk/3/3/. . . /. A . /. . . /0 0 1 0 /0 1 1 0 /0 1 0 0 /0 0 0 /0 1 0 /0 1 0 /0 0 0 /" + }, + { + input: ["mouse,left,1,3,5,3"], + result: + "pzprv3/firewalk/3/3/. . . /. # . /. . . /0 0 1 0 /0 0 0 0 /0 1 0 0 /0 0 0 /0 1 0 /0 1 0 /0 0 0 /" + }, + { + input: ["mouse,left,2,2", "mouse,right,4,2"], + result: + "pzprv3/firewalk/3/3/. . . /. # . /. . . /0 0 1 0 /0 0 0 0 /0 1 0 0 /0 0 0 /0 1 0 /0 1 0 /0 0 0 /0 0 0 0 /0 1 2 0 /0 0 0 0 /0 0 0 0 /" + } + ] +});