diff --git a/src-ui/changes.html b/src-ui/changes.html index 6e29f205c..e1fb9e5e7 100644 --- a/src-ui/changes.html +++ b/src-ui/changes.html @@ -33,13 +33,13 @@
Latest types (all types)
diff --git a/src-ui/list.html b/src-ui/list.html index be750a4a4..a088e0337 100644 --- a/src-ui/list.html +++ b/src-ui/list.html @@ -159,6 +159,7 @@

パズルの種類のリスト
  • +
  • diff --git a/src/pzpr/variety.js b/src/pzpr/variety.js index 42733270c..c9ff48b35 100755 --- a/src/pzpr/variety.js +++ b/src/pzpr/variety.js @@ -148,6 +148,7 @@ easyasabc: [0, 0, "ABCプレース", "Easy as ABC"], evolmino: [0, 0, "シンカミノ", "Evolmino"], factors: [0, 0, "因子の部屋", "Rooms of Factors"], + fakearrow: [0, 0, "フェイクアロー", "Fake Arrow", "nagare"], familyphoto: [0, 0, "家族写真", "Family Photo"], fillmat: [1, 0, "フィルマット", "Fillmat", "fillmat"], fillomino: [ diff --git a/src/res/failcode.en.json b/src/res/failcode.en.json index fda76ba78..a807379a1 100644 --- a/src/res/failcode.en.json +++ b/src/res/failcode.en.json @@ -164,6 +164,7 @@ "bkNoSC.dosufuwa": "An area has no iron ball.", "bkNoShade.shimaguni": "A marine area has no shaded cells.", "bkNoShade": "A room has no shaded cell.", + "bkNoShade.fakearrow": "A room has no shaded arrow.", "bkNoStar.tentaisho": "An area has no stars.", "bkNotAllMSPassed.moonsun": "A line doesn't pass all of the marks of the moon.", "bkNotAllMUPassed.moonsun": "A line doesn't pass all of the marks of the sun.", @@ -235,6 +236,7 @@ "bkShadeDivide.invlitso": "Unshaded cells are divided in a room.", "bkShadeDivide.shimaguni": "The shaded cells in a marine area are divided.", "bkShadeDivide": "Shaded cells are divided in a room.", + "bkShadeGe2.fakearrow": "A room has more than one shaded arrow.", "bkShadeGt2": "A room has three or more shaded cells.", "bkShadeGt4.invlitso": "A room has three or less unshaded cells.", "bkShadeGt4.lits": "A room has five or more shaded cells.", @@ -603,6 +605,7 @@ "lrAcrossArrow.nagare": "The line passes across an arrow.", "lrAcrossWind.nagare": "The line passes across the wind.", "lrAgainstArrow.nagare": "The line passes against an arrow.", + "lrFollowsFake.fakearrow": "The line follows a shaded arrow.", "lrAgainstWind.nagare": "The line passes against the wind.", "lrDeadEnd.icebarn": "There is a dead-end line.", "lrOffField.icebarn": "A line is not reached out the 'OUT' arrow.", diff --git a/src/variety-common/Graphic.js b/src/variety-common/Graphic.js index 57290e31b..f3d54a63b 100644 --- a/src/variety-common/Graphic.js +++ b/src/variety-common/Graphic.js @@ -246,7 +246,7 @@ pzpr.classmgr.makeCommon({ //--------------------------------------------------------------------------- // pc.drawCellArrows() 矢印だけをCanvasに書き込む //--------------------------------------------------------------------------- - drawCellArrows: function(wide, outline) { + drawCellArrows: function(wide) { var g = this.vinc("cell_arrow", "auto"); var al, aw, tl, tw; @@ -255,6 +255,12 @@ pzpr.classmgr.makeCommon({ aw = this.cw * 0.03; // ArrowWidth tl = this.cw * 0.16; // 矢じりの長さの座標(中心-長さ) tw = this.cw * 0.16; // 矢じりの幅 + } else if (wide === 0.5) { + /* 太い矢印 */ + al = this.cw * 0.35; // ArrowLength + aw = this.cw * 0.1; // ArrowWidth + tl = 0; // 矢じりの長さの座標(中心-長さ) + tw = this.cw * 0.27; // 矢じりの幅 } else { /* 太い矢印 */ al = this.cw * 0.35; // ArrowLength @@ -266,114 +272,123 @@ pzpr.classmgr.makeCommon({ tw = tw >= 5 ? tw : 5; var clist = this.range.cells; - for (var i = 0; i < clist.length; i++) { - var cell = clist[i], - dir = !cell.numberAsObject ? cell.qdir : cell.getNum(); - var color = dir >= 1 && dir <= 4 ? this.getCellArrowColor(cell) : null; + for (var item = 0; item < 2; item++) { + var func = + item === 1 ? this.getCellArrowOutline : this.getCellArrowColor; + if (!func) { + continue; + } - g.vid = "c_arrow_" + cell.id; - if (!!color) { - g.lineWidth = 1.5; - g.strokeStyle = g.fillStyle = color; - g.beginPath(); - var px = cell.bx * this.bw, - py = cell.by * this.bh; - switch (dir) { - case cell.UP: - g.setOffsetLinePath( - px, - py, - 0, - -al, - -tw, - -tl, - -aw, - -tl, - -aw, - al, - aw, - al, - aw, - -tl, - tw, - -tl, - true - ); - break; - case cell.DN: - g.setOffsetLinePath( - px, - py, - 0, - al, - -tw, - tl, - -aw, - tl, - -aw, - -al, - aw, - -al, - aw, - tl, - tw, - tl, - true - ); - break; - case cell.LT: - g.setOffsetLinePath( - px, - py, - -al, - 0, - -tl, - -tw, - -tl, - -aw, - al, - -aw, - al, - aw, - -tl, - aw, - -tl, - tw, - true - ); - break; - case cell.RT: - g.setOffsetLinePath( - px, - py, - al, - 0, - tl, - -tw, - tl, - -aw, - -al, - -aw, - -al, - aw, - tl, - aw, - tl, - tw, - true - ); - break; - } - if (outline) { - g.stroke(); + for (var i = 0; i < clist.length; i++) { + var cell = clist[i], + dir = !cell.numberAsObject ? cell.qdir : cell.getNum(); + var color = dir >= 1 && dir <= 4 ? func.call(this, cell) : null; + + g.vid = "c_arrow_" + item + "_" + cell.id; + if (!!color) { + g.lineWidth = 1.5; + g.strokeStyle = g.fillStyle = color; + g.beginPath(); + var px = cell.bx * this.bw, + py = cell.by * this.bh; + switch (dir) { + case cell.UP: + g.setOffsetLinePath( + px, + py, + 0, + -al, + -tw, + -tl, + -aw, + -tl, + -aw, + al, + aw, + al, + aw, + -tl, + tw, + -tl, + true + ); + break; + case cell.DN: + g.setOffsetLinePath( + px, + py, + 0, + al, + -tw, + tl, + -aw, + tl, + -aw, + -al, + aw, + -al, + aw, + tl, + tw, + tl, + true + ); + break; + case cell.LT: + g.setOffsetLinePath( + px, + py, + -al, + 0, + -tl, + -tw, + -tl, + -aw, + al, + -aw, + al, + aw, + -tl, + aw, + -tl, + tw, + true + ); + break; + case cell.RT: + g.setOffsetLinePath( + px, + py, + al, + 0, + tl, + -tw, + tl, + -aw, + -al, + -aw, + -al, + aw, + tl, + aw, + tl, + tw, + true + ); + break; + } + if (item === 1) { + g.stroke(); + } else { + g.fill(); + } } else { - g.fill(); + g.vhide(); } - } else { - g.vhide(); } } }, + getCellArrowOutline: null, getCellArrowColor: function(cell) { var dir = !cell.numberAsObject ? cell.qdir : cell.getNum(); if (dir >= 1 && dir <= 4) { diff --git a/src/variety/guidearrow.js b/src/variety/guidearrow.js index ec507112c..7a59f068b 100644 --- a/src/variety/guidearrow.js +++ b/src/variety/guidearrow.js @@ -254,12 +254,16 @@ this.drawShadedCells(); this.drawGoalStar(); - this.drawCellArrows(true, true); + this.drawCellArrows(true); this.drawHatenas(); this.drawChassis(); this.drawTarget(); }, + getCellArrowColor: null, + getCellArrowOutline: function(cell) { + return cell.qnum !== -1 ? this.quescolor : null; + }, drawGoalStar: function() { var g = this.vinc("cell_sg", "auto"); diff --git a/src/variety/nagare.js b/src/variety/nagare.js index 72f4c5a60..116b683fb 100644 --- a/src/variety/nagare.js +++ b/src/variety/nagare.js @@ -7,10 +7,42 @@ } else { pzpr.classmgr.makeCustom(pidlist, classbase); } -})(["nagare"], { +})(["nagare", "fakearrow"], { //--------------------------------------------------------- // マウス入力系 MouseEvent: { + mouseinput_other: function() { + if (this.inputMode === "diraux") { + if (this.mousestart || this.mousemove) { + this.inputdiraux_mousemove(); + } else if (this.mouseend && this.notInputted()) { + this.clickdiraux(); + } + } + }, + // オーバーライド + inputarrow_cell_main: function(cell, dir) { + cell.setQdir(cell.qdir !== dir ? dir : 0); + }, + inputShadeCell: function() { + var cell = this.getcell(); + if (cell.isnull || cell === this.mouseCell) { + return; + } + + if ( + cell !== this.cursor.getc() && + this.puzzle.getConfig("cursor") && + this.inputMode === "auto" + ) { + this.setcursor(cell); + } else { + cell.setQues(cell.ques === 1 ? 0 : 1); + cell.drawaround(); + } + } + }, + "MouseEvent@nagare": { inputModes: { edit: ["shade", "arrow", "info-line"], play: ["line", "peke", "diraux", "info-line"] @@ -25,14 +57,34 @@ this.common.mouseinput.call(this); } }, - mouseinput_other: function() { - if (this.inputMode === "diraux") { - if (this.mousestart || this.mousemove) { + mouseinput_auto: function() { + if (this.puzzle.playmode && this.btn === "right") { + if (this.mousestart) { + this.inputdiraux_mousedown(); + } else if (this.inputData === 2 || this.inputData === 3) { + this.inputpeke(); + } else if (this.mousemove) { this.inputdiraux_mousemove(); + } + } else if (this.puzzle.playmode && this.btn === "left") { + if (this.mousestart || this.mousemove) { + this.inputLine(); } else if (this.mouseend && this.notInputted()) { this.clickdiraux(); } + } else if (this.puzzle.editmode) { + if (this.mousestart || this.mousemove) { + this.inputarrow_cell(); + } else if (this.mouseend && this.notInputted()) { + this.inputShadeCell(); + } } + } + }, + "MouseEvent@fakearrow": { + inputModes: { + edit: ["border", "arrow", "empty", "info-line"], + play: ["line", "peke", "diraux", "shade", "info-line"] }, mouseinput_auto: function() { if (this.puzzle.playmode && this.btn === "right") { @@ -47,36 +99,23 @@ if (this.mousestart || this.mousemove) { this.inputLine(); } else if (this.mouseend && this.notInputted()) { - this.clickdiraux(); + if (this.getcell().qdir > 0) { + this.inputShade(); + } else { + this.clickdiraux(); + } } } else if (this.puzzle.editmode) { if (this.mousestart || this.mousemove) { - this.inputarrow_cell(); + if (this.isBorderMode()) { + this.inputborder(); + } else { + this.inputarrow_cell(); + } } else if (this.mouseend && this.notInputted()) { - this.inputShadeCell(); + this.inputqnum(); } } - }, - // オーバーライド - inputarrow_cell_main: function(cell, dir) { - cell.setQdir(cell.qdir !== dir ? dir : 0); - }, - inputShadeCell: function() { - var cell = this.getcell(); - if (cell.isnull || cell === this.mouseCell) { - return; - } - - if ( - cell !== this.cursor.getc() && - this.puzzle.getConfig("cursor") && - this.inputMode === "auto" - ) { - this.setcursor(cell); - } else { - cell.setQues(cell.ques === 1 ? 0 : 1); - cell.drawaround(); - } } }, @@ -98,9 +137,11 @@ this.key_inputques_nagare(ca); }, key_inputques_nagare: function(ca) { + var wall = this.pid === "nagare" ? 1 : 7; + if (ca === "q" || ca === "w") { var cell = this.cursor.getc(); - cell.setQues(cell.ques !== 1 ? 1 : 0); + cell.setQues(cell.ques !== wall ? wall : 0); cell.drawaround(); } } @@ -108,7 +149,32 @@ //--------------------------------------------------------- // 盤面管理系 - Cell: { + "Cell@fakearrow": { + allowShade: function() { + return this.qdir > 0; + }, + allowUnshade: function() { + return false; + }, + noLP: function() { + return this.isEmpty(); + }, + posthook: { + ques: function(num) { + if (num) { + this.setQdir(this.NDIR); + } + }, + qdir: function(num) { + if (num === this.NDIR) { + this.setQans(0); + } else { + this.setQues(0); + } + } + } + }, + "Cell@nagare": { windbase: 0 /* このセルから風が吹いているか(1,2,4,8) or 風をガードしているか(16) */, wind: 0 /* セルに風が吹いているかどうか判定するためのパラメータ (qdir値とは別) */, /* 0-15:2進数の4桁がそれぞれ風の吹いてくる向きを表す 4方向から風が吹くと15 */ @@ -279,8 +345,9 @@ enableLineNG: true }, Board: { - hasborder: 1, - + hasborder: 1 + }, + "Board@nagare": { rebuildInfo: function() { this.initWind(); this.common.rebuildInfo.call(this); @@ -307,6 +374,9 @@ LineGraph: { enabled: true }, + "AreaRoomGraph@fakearrow": { + enabled: true + }, BoardExec: { adjustBoardData: function(key, d) { @@ -339,7 +409,11 @@ this.drawDashedGrid(); this.drawQuesCells(); - this.drawCellArrows(true); + if (this.pid === "fakearrow") { + this.drawBorders(); + } + + this.drawCellArrows(this.pid === "fakearrow" ? 0.5 : true); this.drawLines(); this.drawPekes(); @@ -432,10 +506,34 @@ } } }, + "Graphic@fakearrow": { + getBorderColor: function(border) { + var cell1 = border.sidecell[0], + cell2 = border.sidecell[1]; + if ( + border.inside && + !cell1.isnull && + !cell2.isnull && + (cell1.isEmpty() || cell2.isEmpty()) + ) { + return "black"; + } + return this.getBorderColor_ques(border); + }, + getBGCellColor: function(cell) { + return cell.ques === 7 ? "black" : this.getBGCellColor_error1(cell); + }, + getCellArrowOutline: function(cell) { + return this.quescolor; + }, + getCellArrowColor: function(cell) { + return cell.isShade() ? this.quescolor : null; + } + }, //--------------------------------------------------------- // URLエンコード/デコード処理 - Encode: { + "Encode@nagare": { decodePzpr: function(type) { this.decodeNagare(); }, @@ -497,6 +595,30 @@ this.outbstr += cm; } }, + "Encode@fakearrow": { + decodePzpr: function() { + this.decodeBorder(); + + var bd = this.board; + this.genericDecodeNumber16(bd.cell.length, function(c, val) { + var cell = bd.cell[c]; + if (val === 5) { + cell.setValid(7); + } else if (val >= 0) { + cell.qdir = val; + } + }); + }, + encodePzpr: function() { + this.encodeBorder(); + + var bd = this.board; + this.genericEncodeNumber16(bd.cell.length, function(c) { + var cell = bd.cell[c]; + return cell.isEmpty() ? 5 : cell.qdir || -1; + }); + } + }, //--------------------------------------------------------- FileIO: { decodeData: function() { @@ -525,6 +647,28 @@ this.encodeBorderArrowAns(); } }, + "FileIO@fakearrow": { + decodeData: function() { + this.decodeBorderQues(); + this.decodeCell(function(cell, ca) { + if (ca === "#") { + cell.ques = 7; + } else if (+ca > 0) { + cell.qdir = +ca; + } + }); + this.decodeBorderArrowAns(); + this.decodeCellQanssub(); + }, + encodeData: function() { + this.encodeBorderQues(); + this.encodeCell(function(cell) { + return cell.isEmpty() ? "# " : cell.qdir ? cell.qdir + " " : ". "; + }); + this.encodeBorderArrowAns(); + this.encodeCellQanssub(); + } + }, //--------------------------------------------------------- // 正解判定処理実行部 AnsCheck: { @@ -548,7 +692,7 @@ for (var i = 0; i < boardcell.length; i++) { var cell = boardcell[i], arwind = cell.wind & (15 ^ [0, 1, 2, 4, 8][cell.qdir]); - if (cell.qdir === 0 || cell.ques === 1 || !arwind) { + if (cell.qdir === 0 || cell.ques === 1 || cell.isShade() || !arwind) { continue; } @@ -582,6 +726,9 @@ checkAcrossArrow: function() { this.checkAllCell(function(cell) { var adb = cell.adjborder; + if (cell.isShade()) { + return false; + } return ( ((cell.qdir === 1 || cell.qdir === 2) && (adb.left.isLine() || adb.right.isLine())) || @@ -592,7 +739,9 @@ }, checkAllArrow: function() { this.checkAllCell(function(cell) { - return cell.ques === 0 && cell.qdir > 0 && cell.lcnt === 0; + return ( + !cell.isShade() && cell.ques === 0 && cell.qdir > 0 && cell.lcnt === 0 + ); }, "arNoLine"); }, @@ -616,14 +765,20 @@ } }, checkLineArrowDirection: function() { + return this.checkLineArrowDirectionGeneric(null, "lrAgainstArrow"); + }, + checkLineArrowDirectionGeneric: function(filter, code) { var traces = this.getTraceInfo(); for (var i = 0; i < traces.length; i++) { var clist = traces[i].clist; + if (filter) { + clist = clist.filter(filter); + } if (clist.length === 0) { continue; } - this.failcode.add("lrAgainstArrow"); + this.failcode.add(code); if (this.checkOnly) { break; } @@ -758,8 +913,15 @@ break; } // 一周して戻ってきた - if (cell.qdir !== cell.NDIR) { - if (cell.qdir === dir) { + var celldir = cell.qdir; + if (cell.isShade()) { + celldir = cell.isLineStraight() + ? [0, cell.DN, cell.UP, cell.RT, cell.LT][celldir] + : cell.NDIR; + } + + if (celldir !== cell.NDIR) { + if (celldir === dir) { clist1.push(cell); } else { clist2.push(cell); @@ -813,5 +975,57 @@ return info; } + }, + "AnsCheck@fakearrow": { + checklist: [ + "checkAdjacentShadeCell", + "checkOverShadeArrow", + "checkLineExist+", + "checkCrossLine+", + "checkBranchLine+", + "checkAcrossArrow", + "checkLineArrowDirectionUnshade", + "checkLineArrowDirectionShade", + "checkNoShadeArrow", + "checkAllArrow", + "checkDeadendLine++", + "checkOneLoop" + ], + + checkOverShadeArrow: function() { + this.checkAllBlock( + this.board.roommgr, + function(cell) { + return cell.qans === 1; + }, + function(w, h, a, n) { + return a <= 1; + }, + "bkShadeGe2" + ); + }, + checkNoShadeArrow: function() { + this.checkAllBlock( + this.board.roommgr, + function(cell) { + return cell.qans === 1; + }, + function(w, h, a, n) { + return a >= 1; + }, + "bkNoShade" + ); + }, + + checkLineArrowDirectionUnshade: function() { + this.checkLineArrowDirectionGeneric(function(cell) { + return !cell.isShade(); + }, "lrAgainstArrow"); + }, + checkLineArrowDirectionShade: function() { + this.checkLineArrowDirectionGeneric(function(cell) { + return cell.isShade(); + }, "lrFollowsFake"); + } } }); diff --git a/test/script/fakearrow.js b/test/script/fakearrow.js new file mode 100644 index 000000000..a32122bac --- /dev/null +++ b/test/script/fakearrow.js @@ -0,0 +1,87 @@ +/* fakearrow.js */ + +ui.debug.addDebugData("fakearrow", { + url: "4/4/idg0s043h2g312g41g4h", + failcheck: [ + [ + "brNoLine", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /0 0 0 /0 0 0 /0 0 0 /0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /. . . . /. . . . /. . . . /. . . . /" + ], + [ + "csAdjacent", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 1 /0 0 0 /0 1 0 /1 0 1 /1 0 0 1 /1 0 0 1 /1 1 1 1 /1 . . . /. . 1 . /. . 1 . /. 1 . . /" + ], + [ + "bkShadeGe2", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 1 /0 0 0 /1 1 1 /0 0 0 /1 0 0 1 /1 0 0 1 /0 0 0 0 /1 . . . /. . 1 . /1 . . 1 /. 1 . . /" + ], + [ + "lrAcrossArrow", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 0 /0 0 1 /0 1 1 /1 0 0 /1 0 1 0 /1 0 0 1 /1 1 0 0 /1 . . . /. . . 1 /. . . . /. 1 . . /" + ], + [ + "lrAgainstArrow", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 0 /0 1 0 /0 1 1 /1 1 1 /1 0 1 0 /1 1 0 0 /1 0 0 1 /1 . . . /. . 1 . /. . . 1 /. . . . /" + ], + [ + "lrFollowsFake", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . . 1 /2 . 4 1 /. 4 . . /1 1 0 /0 0 1 /0 0 0 /1 1 1 /1 0 1 0 /1 0 0 1 /1 0 0 1 /1 . . . /. . . 1 /. . 1 . /. 1 . . /" + ], + [ + "arNoLine", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 0 /0 1 0 /0 0 0 /1 0 0 /1 0 1 0 /1 1 0 0 /1 1 0 0 /1 . . . /. . 1 . /. . . 1 /. 1 . . /" + ], + [ + "bkNoShade", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 . . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 0 0 /0 1 1 /0 0 0 /1 1 1 /1 1 0 0 /1 0 0 1 /1 0 0 1 /1 . . . /. . . 1 /. . 1 . /. . . . /" + ], + [ + "lnCross", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /0 0 0 /1 1 0 /0 0 0 /0 0 0 /0 1 0 0 /0 1 0 0 /0 0 0 0 /. . . . /. . . . /. . . . /. . . . /" + ], + [ + "lnBranch", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /0 0 0 /0 0 0 /0 0 0 /1 1 1 /0 0 0 0 /0 0 0 0 /0 0 1 0 /. . . . /. . . . /. . 1 . /. . . . /" + ], + [ + "lnPlLoop", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 . /2 . . 1 /. 4 . . /1 1 0 /0 1 0 /0 0 1 /1 0 1 /1 0 1 0 /1 1 0 0 /1 1 1 1 /1 . . . /. . 1 . /. . . 1 /. 1 . . /" + ], + [ + "lnDeadEnd", + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 1 /0 0 0 /0 1 1 /0 0 0 /1 0 0 1 /1 0 0 1 /1 0 0 0 /1 . . . /. . 1 . /. . . 1 /. 1 . . /" + ], + [ + null, + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 4 . /2 . . 1 /2 . 4 1 /. 4 . . /1 1 1 /0 0 0 /0 1 1 /1 0 0 /1 0 0 1 /1 0 0 1 /1 1 0 0 /1 . 1 . /. . . . /. . . 1 /. 1 . . /", + { skiprules: true } + ], + [ + null, + "pzprv3/fakearrow/4/4/1 0 0 /1 0 0 /1 1 0 /1 1 0 /0 0 0 0 /0 1 1 1 /0 0 0 0 /4 3 . . /2 . 3 1 /2 . 4 1 /. 4 . . /1 1 1 /0 0 0 /0 1 1 /1 0 0 /1 0 0 1 /1 0 0 1 /1 1 0 0 /1 . . . /. . 1 . /. . . 1 /. 1 . . /" + ] + ], + inputs: [ + { input: ["setconfig,cursor,false", "newboard,3,2", "editmode"] }, + { + input: [ + "mouse,left,3,1,5,1", + "mouse,left,2,2,4,2", + "mouse,left,3,3,1,3", + "mouse,left,5,1" + ], + result: + "pzprv3/fakearrow/2/3/0 0 /0 0 /0 1 0 /. 4 . /. 3 . /0 0 /0 0 /0 0 0 /. . . /. . . /" + }, + { + input: ["playmode", "mouse,left,3,1", "mouse,left,5,1"], + result: + "pzprv3/fakearrow/2/3/0 0 /0 0 /0 1 0 /. 4 . /. 3 . /0 0 /0 0 /0 0 0 /. 1 . /. . . /" + }, + { + input: ["mouse,leftx2,1,2", "mouse,right,5,1,5,3", "mouse,right,2,1"], + result: + "pzprv3/fakearrow/2/3/0 0 /0 0 /0 1 0 /. 4 . /. 3 . /-1 0 /0 0 /u 0 d /. 1 . /. . . /" + } + ] +});