├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .hgignore ├── .hgtags ├── .npmignore ├── .prettierignore ├── Changelog.md ├── Gruntfile.js ├── LICENSE.txt ├── Makefile ├── README.md ├── docs ├── Config.md ├── InputModes.md ├── Notes.md ├── PublicAPI.md ├── Puzzle.md ├── PuzzleSubObject.md └── pzpr.md ├── flake.lock ├── flake.nix ├── git-hash.sh ├── index.js ├── nix └── pzprjs.nix ├── package-lock.json ├── package.json ├── sample ├── .eslintrc.json ├── exec.js ├── html │ ├── api_test.html │ └── failcodes.html ├── node.js ├── node2.js ├── node3.js └── node4.js ├── src-ui ├── changes.html ├── css │ ├── list.css │ └── ui.css ├── img │ ├── akichi.png │ ├── alter.png │ ├── angleloop.png │ ├── aquapelago.png │ ├── aquarium.png │ ├── araf.png │ ├── archipelago.png │ ├── balance.png │ ├── balloon.png │ ├── batten.png │ ├── battleship.png │ ├── bdwalk.png │ ├── bosnianroad.png │ ├── brownies.png │ ├── castle.png │ ├── cbanana.png │ ├── chainedb.png │ ├── circlesquare.png │ ├── cocktail.png │ ├── coffeemilk.png │ ├── compass.png │ ├── coral.png │ ├── cts.png │ ├── curvedata.png │ ├── curving.png │ ├── dbchoco.png │ ├── detour.png │ ├── dominion.png │ ├── doppelblock.png │ ├── dotchi.png │ ├── dotchi2.png │ ├── doubleback.png │ ├── easyasabc.png │ ├── evolmino.png │ ├── fakearrow.png │ ├── firewalk.png │ ├── forestwalk.png │ ├── geradeweg.png │ ├── heteromino.png │ ├── heyapin.png │ ├── icewalk.png │ ├── invlitso.png │ ├── island.png │ ├── kaidan.png │ ├── kaisu.png │ ├── kissing.png │ ├── kropki.png │ ├── kuroclone.png │ ├── kuromenbun.png │ ├── ladders.png │ ├── lixloop.png │ ├── lollipops.png │ ├── magnets.png │ ├── mannequin.png │ ├── martini.png │ ├── maxi.png │ ├── midloop.png │ ├── mintonette.png │ ├── mirrorbk.png │ ├── moonsun.png │ ├── mrtile.png │ ├── mukkonn.png │ ├── nanameguri.png │ ├── nibunnogo.png │ ├── nondango.png │ ├── nonogram.png │ ├── norinuri.png │ ├── nothing.png │ ├── nurimisaki.png │ ├── nuritwin.png │ ├── nuriuzu.png │ ├── oneroom.png │ ├── orbital.png │ ├── ovotovata.png │ ├── oyakodori.png │ ├── patchwork.png │ ├── pencils.png │ ├── pentatouch.png │ ├── pentopia.png │ ├── pmemory.png │ ├── portal.png │ ├── ququ.png │ ├── rassi.png │ ├── recoil.png │ ├── regional-poly.png │ ├── remlen.png │ ├── retroships.png │ ├── retsurin.png │ ├── roundtrip.png │ ├── sananko.png │ ├── sashikazune.png │ ├── satogaeri.png │ ├── scrin.png │ ├── simplegako.png │ ├── simpleloop.png │ ├── skyscrapers.png │ ├── slashpack.png │ ├── smullyan.png │ ├── snake.png │ ├── snakeegg.png │ ├── squarejam.png │ ├── starbattle.png │ ├── statuepark.png │ ├── subomino.png │ ├── swslither.png │ ├── symmarea.png │ ├── tachibk.png │ ├── tajmahal.png │ ├── takoyaki.png │ ├── tapaloop.png │ ├── tents.png │ ├── teri.png │ ├── tetrochain.png │ ├── tetrominous.png │ ├── tilecity.png │ ├── timebomb.png │ ├── tjunction.png │ ├── tontonbeya.png │ ├── trainstations.png │ ├── tslither.png │ ├── turnaround.png │ ├── voxas.png │ ├── vslither.png │ ├── wafusuma.png │ ├── walllogic.png │ ├── wataridori.png │ ├── waterwalk.png │ ├── wittgen.png │ ├── yinyang.png │ └── zabajaba.png ├── js │ ├── common │ │ ├── intro.js │ │ ├── langs.js │ │ └── outro.js │ ├── list.js │ ├── pzpr-ui.js │ └── ui │ │ ├── AuxEditor.js │ │ ├── Boot.js │ │ ├── Event.js │ │ ├── KeyPopup.js │ │ ├── Listener.js │ │ ├── MenuArea.js │ │ ├── MenuConfig.js │ │ ├── Misc.js │ │ ├── Network.js │ │ ├── Notify.js │ │ ├── PopupMenu.js │ │ ├── Timer.js │ │ ├── ToolArea.js │ │ ├── UI.js │ │ └── UrlConfig.js ├── list.html ├── p.html ├── res │ ├── history.en.yaml │ ├── history.ja.yaml │ ├── p.en.json │ ├── p.ja.json │ ├── rules.en.yaml │ └── rules.ja.yaml └── rules.html ├── src ├── .eslintrc.json ├── common │ ├── banner_full.js │ ├── banner_min.js │ ├── intro.js │ ├── langs.js │ └── outro.js ├── lib │ ├── candle-intro.js │ └── candle-outro.js ├── puzzle │ ├── Address.js │ ├── Answer.js │ ├── AreaManager.js │ ├── Bank.js │ ├── Board.js │ ├── BoardExec.js │ ├── Config.js │ ├── Encode.js │ ├── FileData.js │ ├── GraphBase.js │ ├── Graphic.js │ ├── KeyInput.js │ ├── LineManager.js │ ├── MouseInput.js │ ├── Operation.js │ ├── Piece.js │ ├── PieceList.js │ └── Puzzle.js ├── pzpr.js ├── pzpr │ ├── classmgr.js │ ├── core.js │ ├── env.js │ ├── event.js │ ├── metadata.js │ ├── parser.js │ ├── util.js │ └── variety.js ├── res │ ├── failcode.en.json │ └── failcode.ja.json ├── variety-common │ ├── Answer.js │ ├── BoardExec.js │ ├── Encode.js │ ├── FileData.js │ ├── Graphic.js │ ├── KeyInput.js │ ├── MouseInput.js │ ├── Operation.js │ └── Piece.js └── variety │ ├── amibo.js │ ├── anglers.js │ ├── aqre.js │ ├── aquapelago.js │ ├── aquarium.js │ ├── araf.js │ ├── balance.js │ ├── balloon.js │ ├── barns.js │ ├── batten.js │ ├── bdblock.js │ ├── bonsan.js │ ├── bosanowa.js │ ├── bosnianroad.js │ ├── box.js │ ├── castle.js │ ├── cbanana.js │ ├── cbblock.js │ ├── chainedb.js │ ├── circlesquare.js │ ├── compass.js │ ├── context.js │ ├── country.js │ ├── creek.js │ ├── crossstitch.js │ ├── curvedata.js │ ├── curving.js │ ├── dominion.js │ ├── doppelblock.js │ ├── dosufuwa.js │ ├── easyasabc.js │ ├── evolmino.js │ ├── factors.js │ ├── familyphoto.js │ ├── fillmat.js │ ├── fillomino.js │ ├── firefly.js │ ├── fracdiv.js │ ├── geradeweg.js │ ├── goishi.js │ ├── gokigen.js │ ├── guidearrow.js │ ├── haisu.js │ ├── hakoiri.js │ ├── hanare.js │ ├── hashikake.js │ ├── hebi.js │ ├── herugolf.js │ ├── heyapin.js │ ├── heyawake.js │ ├── hitori.js │ ├── icebarn.js │ ├── icewalk.js │ ├── ichimaga.js │ ├── interbd.js │ ├── japanesesums.js │ ├── juosan.js │ ├── kaero.js │ ├── kaidan.js │ ├── kakuro.js │ ├── kakuru.js │ ├── kazunori.js │ ├── kinkonkan.js │ ├── kouchoku.js │ ├── kramma.js │ ├── kurochute.js │ ├── kuroclone.js │ ├── kurodoko.js │ ├── kuromenbun.js │ ├── kurotto.js │ ├── kusabi.js │ ├── ladders.js │ ├── lapaz.js │ ├── lightshadow.js │ ├── lightup.js │ ├── lineofsight.js │ ├── lither.js │ ├── lits.js │ ├── lohkous.js │ ├── lollipops.js │ ├── lookair.js │ ├── loute.js │ ├── magnets.js │ ├── makaro.js │ ├── mannequin.js │ ├── mashu.js │ ├── mejilink.js │ ├── midloop.js │ ├── minarism.js │ ├── myopia.js │ ├── nagare.js │ ├── nagenawa.js │ ├── nanameguri.js │ ├── nanro.js │ ├── nawabari.js │ ├── nondango.js │ ├── nonogram.js │ ├── nothree.js │ ├── numlin.js │ ├── nurikabe.js │ ├── nurimaze.js │ ├── paintarea.js │ ├── parquet.js │ ├── patchwork.js │ ├── pencils.js │ ├── pipelink.js │ ├── pmemory.js │ ├── portal.js │ ├── ququ.js │ ├── railpool.js │ ├── recoil.js │ ├── reflect.js │ ├── renban.js │ ├── ripple.js │ ├── roma.js │ ├── roundtrip.js │ ├── scrin.js │ ├── shakashaka.js │ ├── shikaku.js │ ├── shimaguni.js │ ├── shugaku.js │ ├── simplegako.js │ ├── skyscrapers.js │ ├── slalom.js │ ├── slashpack.js │ ├── slither.js │ ├── snake.js │ ├── snakeegg.js │ ├── squarejam.js │ ├── starbattle.js │ ├── statuepark.js │ ├── sudoku.js │ ├── sukoro.js │ ├── tachibk.js │ ├── tapa.js │ ├── tapaloop.js │ ├── tasquare.js │ ├── tatamibari.js │ ├── tateyoko.js │ ├── tawa.js │ ├── tentaisho.js │ ├── tents.js │ ├── tetrochain.js │ ├── tilecity.js │ ├── tilepaint.js │ ├── toichika.js │ ├── tontti.js │ ├── trainstations.js │ ├── tren.js │ ├── triplace.js │ ├── turnaround.js │ ├── usoone.js │ ├── voxas.js │ ├── vslither.js │ ├── walllogic.js │ ├── wblink.js │ ├── yajikazu.js │ ├── yajilin.js │ ├── yajitatami.js │ ├── yinyang.js │ └── yosenabe.js ├── test ├── .eslintrc.json ├── load_testdata.js ├── puzzle │ ├── answer_test.js │ ├── boardexec_test.js │ ├── config_test.js │ ├── encode_test.js │ ├── filedata_test.js │ ├── input_test.js │ ├── operation_test.js │ └── render_test.js ├── pzpr │ └── parser_test.js ├── script │ ├── aho.js │ ├── akichi.js │ ├── alter.js │ ├── amibo.js │ ├── angleloop.js │ ├── anglers.js │ ├── antmill.js │ ├── aqre.js │ ├── aquapelago.js │ ├── aquarium.js │ ├── araf.js │ ├── archipelago.js │ ├── armyants.js │ ├── arrowflow.js │ ├── arukone.js │ ├── ayeheya.js │ ├── balance.js │ ├── balloon.js │ ├── barns.js │ ├── batten.js │ ├── battleship.js │ ├── bdblock.js │ ├── bdwalk.js │ ├── bonsan.js │ ├── bosanowa.js │ ├── bosnianroad.js │ ├── box.js │ ├── brownies.js │ ├── canal.js │ ├── castle.js │ ├── cave.js │ ├── cbanana.js │ ├── cbblock.js │ ├── chainedb.js │ ├── chocona.js │ ├── circlesquare.js │ ├── cocktail.js │ ├── coffeemilk.js │ ├── cojun.js │ ├── compass.js │ ├── context.js │ ├── coral.js │ ├── country.js │ ├── creek.js │ ├── crossstitch.js │ ├── cts.js │ ├── curvedata-aux.js │ ├── curvedata.js │ ├── curving.js │ ├── dbchoco.js │ ├── detour.js │ ├── disloop.js │ ├── dominion.js │ ├── doppelblock.js │ ├── dosufuwa.js │ ├── dotchi.js │ ├── dotchi2.js │ ├── doubleback.js │ ├── easyasabc.js │ ├── evolmino.js │ ├── factors.js │ ├── fakearrow.js │ ├── familyphoto.js │ ├── fillmat.js │ ├── fillomino.js │ ├── firefly.js │ ├── firewalk.js │ ├── fivecells.js │ ├── forestwalk.js │ ├── fourcells.js │ ├── fracdiv.js │ ├── geradeweg.js │ ├── goishi.js │ ├── gokigen.js │ ├── guidearrow.js │ ├── haisu.js │ ├── hakoiri.js │ ├── hanare.js │ ├── hashikake.js │ ├── hebi.js │ ├── herugolf.js │ ├── heteromino.js │ ├── heyablock.js │ ├── heyabon.js │ ├── heyapin.js │ ├── heyawake.js │ ├── hinge.js │ ├── hitori.js │ ├── icebarn.js │ ├── icelom.js │ ├── icelom2.js │ ├── icewalk.js │ ├── ichimaga.js │ ├── ichimagam.js │ ├── ichimagax.js │ ├── interbd.js │ ├── invlitso.js │ ├── island.js │ ├── japanesesums.js │ ├── juosan.js │ ├── kaero.js │ ├── kaidan.js │ ├── kaisu.js │ ├── kakuro.js │ ├── kakuru.js │ ├── kazunori.js │ ├── kinkonkan.js │ ├── kissing.js │ ├── koburin.js │ ├── kouchoku.js │ ├── kramma.js │ ├── kramman.js │ ├── kropki.js │ ├── kurochute.js │ ├── kuroclone.js │ ├── kurodoko.js │ ├── kuromenbun.js │ ├── kurotto.js │ ├── kusabi.js │ ├── ladders.js │ ├── lapaz.js │ ├── lightshadow.js │ ├── lightup.js │ ├── lineofsight.js │ ├── lither.js │ ├── lits.js │ ├── lixloop.js │ ├── lohkous.js │ ├── lollipops.js │ ├── lookair.js │ ├── loopsp.js │ ├── loute.js │ ├── magnets.js │ ├── makaro.js │ ├── mannequin.js │ ├── martini.js │ ├── mashu.js │ ├── maxi.js │ ├── meander.js │ ├── meidjuluk.js │ ├── mejilink.js │ ├── midloop.js │ ├── minarism.js │ ├── mines.js │ ├── mintonette.js │ ├── mirrorbk.js │ ├── mochikoro.js │ ├── mochinyoro.js │ ├── moonsun.js │ ├── mrtile.js │ ├── mukkonn.js │ ├── myopia.js │ ├── nagare.js │ ├── nagenawa.js │ ├── nanameguri.js │ ├── nanro.js │ ├── nawabari.js │ ├── news.js │ ├── nibunnogo.js │ ├── nikoji.js │ ├── nondango.js │ ├── nonogram.js │ ├── norinori.js │ ├── norinuri.js │ ├── nothing.js │ ├── nothree.js │ ├── numlin.js │ ├── numrope.js │ ├── nuribou.js │ ├── nurikabe.js │ ├── nurimaze.js │ ├── nurimisaki.js │ ├── nuritwin.js │ ├── nuriuzu.js │ ├── oneroom.js │ ├── onsen.js │ ├── orbital.js │ ├── outofsight.js │ ├── ovotovata.js │ ├── oyakodori.js │ ├── paintarea.js │ ├── parquet.js │ ├── patchwork.js │ ├── pencils.js │ ├── pentatouch.js │ ├── pentominous.js │ ├── pentopia.js │ ├── pipelink.js │ ├── pipelinkr.js │ ├── pmemory.js │ ├── portal.js │ ├── putteria.js │ ├── ququ.js │ ├── railpool.js │ ├── rassi.js │ ├── recoil.js │ ├── rectslider.js │ ├── reflect.js │ ├── regional-poly.js │ ├── remlen.js │ ├── renban.js │ ├── retroships.js │ ├── retsurin.js │ ├── ringring.js │ ├── ripple.js │ ├── roma.js │ ├── roundtrip.js │ ├── sananko.js │ ├── sashigane.js │ ├── sashikazune.js │ ├── satogaeri.js │ ├── scrin.js │ ├── shakashaka.js │ ├── shikaku.js │ ├── shimaguni.js │ ├── shugaku.js │ ├── shwolf.js │ ├── simplegako.js │ ├── simpleloop.js │ ├── skyscrapers.js │ ├── slalom.js │ ├── slashpack.js │ ├── slither.js │ ├── smullyan.js │ ├── snake.js │ ├── snakeegg.js │ ├── snakepit.js │ ├── squarejam.js │ ├── starbattle.js │ ├── statuepark-aux.js │ ├── statuepark.js │ ├── stostone.js │ ├── subomino.js │ ├── sudoku.js │ ├── sukoro.js │ ├── sukororoom.js │ ├── swslither.js │ ├── symmarea.js │ ├── tachibk.js │ ├── tajmahal.js │ ├── takoyaki.js │ ├── tapa.js │ ├── tapaloop.js │ ├── tasquare.js │ ├── tatamibari.js │ ├── tateyoko.js │ ├── tawa.js │ ├── tentaisho.js │ ├── tents.js │ ├── teri.js │ ├── tetrochain.js │ ├── tetrominous.js │ ├── tilecity.js │ ├── tilepaint.js │ ├── timebomb.js │ ├── tjunction.js │ ├── toichika.js │ ├── toichika2.js │ ├── tontonbeya.js │ ├── tontti.js │ ├── trainstations.js │ ├── tren.js │ ├── triplace.js │ ├── tslither.js │ ├── turnaround.js │ ├── turnrun.js │ ├── twinarea.js │ ├── usoone.js │ ├── usotatami.js │ ├── view.js │ ├── voxas.js │ ├── vslither.js │ ├── wafusuma.js │ ├── wagiri.js │ ├── walllogic.js │ ├── wataridori.js │ ├── waterwalk.js │ ├── wblink.js │ ├── wittgen.js │ ├── yajikazu.js │ ├── yajilin-regions.js │ ├── yajilin.js │ ├── yajirushi.js │ ├── yajirushi2.js │ ├── yajisoko.js │ ├── yajitatami.js │ ├── yinyang.js │ ├── yosenabe.js │ └── zabajaba.js └── variety │ ├── aho_test.js │ ├── amibo_test.js │ ├── ayeheya_test.js │ ├── bosanowa_test.js │ ├── cbblock_test.js │ ├── compass_test.js │ ├── curvedata_test.js │ ├── evolmino_test.js │ ├── fillomino_test.js │ ├── fivecells_test.js │ ├── gokigen_test.js │ ├── herugolf_test.js │ ├── lits_test.js │ ├── myopia_test.js │ ├── onsen_test.js │ ├── parquet_test.js │ ├── pipelink_test.js │ ├── pmemory_test.js │ ├── railpool_test.js │ ├── ringring_test.js │ ├── shwolf_test.js │ ├── slalom_test.js │ ├── slither_test.js │ ├── statuepark_test.js │ ├── tapa_test.js │ ├── tentaisho_test.js │ ├── tontti_test.js │ └── yajilin_test.js └── vercel.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # see https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | insert_final_newline = true 8 | 9 | [*.js] 10 | indent_style = tab 11 | 12 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | src/lib/*.js 2 | src/common/*.js 3 | src-ui/js/common/*.js 4 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true // Allow to use browser defined variable (not console, alert etc.) 4 | }, 5 | "parserOptions": { 6 | "ecmaVersion": 5 7 | }, 8 | "globals": { 9 | "pzpr": "readonly", 10 | "ui": "readonly" 11 | }, 12 | "extends": "eslint:recommended", // Implement recommended rules 13 | "rules": { 14 | "curly": ["error", "all"], // Error for no curly brancket in loop or conditions 15 | "no-unused-vars": // Error for unused variables, not detect arguments 16 | ["error", {"args": "none"}], 17 | "no-undef": "error", // Error for unused variable (that will become global variable) 18 | "new-cap": "error", // Error for lowercase first letter or constructor call as function 19 | "eqeqeq": ["error", "always"], // Error for ==, != to compare 20 | "no-use-before-define": // Error for using variable before definition 21 | ["error", {"functions":false, "classes":false}], 22 | "comma-dangle": ["error", "never"], // Error for trailing comma 23 | "no-redeclare": "error", // Error for redefine variable 24 | //"block-scoped-var": "warn", // Warn var declaration inside block scope 25 | "no-empty": "off", // Allow empty block statements 26 | "no-useless-escape": "off", // Allow unnessesary escape charactors 27 | "no-extra-boolean-cast": "off", // Allow to use boolean cast for boolean value 28 | "dot-notation": "off", // Allow object access via obj["name"] 29 | "no-loop-func": "off" // Allow function definition in loop 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js eol=lf 2 | *.css eol=lf 3 | *.html eol=lf 4 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | on: 2 | workflow_dispatch 3 | 4 | jobs: 5 | deployment: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v2.4.0 9 | - uses: cachix/install-nix-action@v17 10 | - name: bump pzprjs input in puzzlink flake 11 | env: 12 | CONFIG_PUSH_KEY: ${{ secrets.CONFIG_PUSH_KEY }} 13 | BRANCH: main 14 | INPUT: pzprjs 15 | run: | 16 | eval $(ssh-agent -s) 17 | ssh-add - <<< "$CONFIG_PUSH_KEY" 18 | git config --global user.name "deploy bot" 19 | git clone git@github.com:robx/puzzlink-config.git 20 | cd puzzlink-config 21 | git checkout $BRANCH 22 | nix flake lock --override-input "$INPUT" github:robx/pzprjs/"$GITHUB_SHA" --commit-lock-file 23 | echo "CONFIG_REV=$(git rev-parse HEAD)" >> $GITHUB_ENV 24 | git push origin $BRANCH 25 | - name: deploy 26 | env: 27 | NIXY_DEPLOY_KEY: ${{ secrets.NIXY_DEPLOY_KEY }} 28 | NIXY_HOST: "116.202.108.63" 29 | SSH_KNOWN_HOSTS: ${{ secrets.SSH_KNOWN_HOSTS }} 30 | run: | 31 | eval $(ssh-agent -s) 32 | ssh-add - <<< "$NIXY_DEPLOY_KEY" 33 | mkdir -p ~/.ssh 34 | echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts 35 | ssh -p 2323 deploy@"$NIXY_HOST" sudo deploy ${{ env.CONFIG_REV }} 36 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | on: 2 | pull_request: 3 | push: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v3 13 | with: 14 | node-version: 20 15 | - run: npm install 16 | - run: npm run-script check-format 17 | - run: npm run-script build 18 | - run: npm run-script lint 19 | - run: npm run-script coverage 20 | - uses: codecov/codecov-action@v3 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store 4 | .eslintcache 5 | git.json 6 | 7 | .vercel 8 | .nyc_output 9 | coverage 10 | -------------------------------------------------------------------------------- /.hgignore: -------------------------------------------------------------------------------- 1 | dist 2 | pzpr-* 3 | node_modules 4 | .DS_Store 5 | .eslintcache 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .git* 2 | .hg* 3 | .DS_Store 4 | 5 | /.vscode 6 | /Gruntfile.js 7 | /docs 8 | /src 9 | *.concat.js 10 | 11 | .jshintrc 12 | .eslintrc.json 13 | .eslintignore 14 | .eslintcache 15 | /sample 16 | /test 17 | yarn.lock 18 | paclage-lock.json 19 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *intro.js 2 | *outro.js 3 | src/common/langs.js 4 | src-ui/js/common/langs.js 5 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2011, 2014 Kobayashi, Daisuke (sabo2) 4 | Copyright (c) 2019 Vollmert, Robert and contibutors 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build test serve format 2 | 3 | build: 4 | npm run-script build 5 | 6 | test: 7 | npm test 8 | 9 | serve: 10 | cd dist && python3 -m http.server -b localhost 11 | 12 | serve-all: 13 | cd dist && python3 -m http.server 14 | 15 | format: 16 | npm run-script format 17 | -------------------------------------------------------------------------------- /docs/Notes.md: -------------------------------------------------------------------------------- 1 | Some notes on pzprjs from an "outside" perspective. 2 | 3 | ### Japanese terms 4 | 5 | hatena: "question"; particularly, whether blank and/or question mark 6 | clues are enabled (qnum == -2) 7 | 8 | -------------------------------------------------------------------------------- /docs/PublicAPI.md: -------------------------------------------------------------------------------- 1 | # pzpr.js API 2 | 3 | pzpr.js can be used under either browser environment or node.js. 4 | 5 | ## usage 6 | 7 | on browser 8 | 9 | ```html 10 | 11 | 12 | 13 | 14 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | ``` 29 | 30 | on node.js 31 | 32 | ```js 33 | var pzpr = require('pzpr'); 34 | var puzzle = new pzpr.Puzzle({type:'player'}).open('nurikabe/5/5/g5k2o1k3g'); 35 | 36 | puzzle.mouse.inputPath(3,3, 3,9, 1,9, 5,9); 37 | puzzle.mouse.inputPath(5,1, 9,1, 9,5, 5,5, 7,7); 38 | console.log(puzzle.check().text); 39 | // -> 'Complete!' 40 | ``` 41 | 42 | ## List of document 43 | 44 | * [pzpr object](pzpr.md) 45 | * [Puzzle object](Puzzle.md) 46 | * [List of puzzle config](Config.md) 47 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "locked": { 5 | "lastModified": 1652776076, 6 | "narHash": "sha256-gzTw/v1vj4dOVbpBSJX4J0DwUR6LIyXo7/SuuTJp1kM=", 7 | "owner": "numtide", 8 | "repo": "flake-utils", 9 | "rev": "04c1b180862888302ddfb2e3ad9eaa63afc60cf8", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "numtide", 14 | "repo": "flake-utils", 15 | "type": "github" 16 | } 17 | }, 18 | "nixpkgs": { 19 | "locked": { 20 | "lastModified": 1662099760, 21 | "narHash": "sha256-MdZLCTJPeHi/9fg6R9fiunyDwP3XHJqDd51zWWz9px0=", 22 | "owner": "NixOS", 23 | "repo": "nixpkgs", 24 | "rev": "67e45078141102f45eff1589a831aeaa3182b41e", 25 | "type": "github" 26 | }, 27 | "original": { 28 | "owner": "NixOS", 29 | "ref": "nixos-22.05", 30 | "repo": "nixpkgs", 31 | "type": "github" 32 | } 33 | }, 34 | "npmlock2nix-repo": { 35 | "flake": false, 36 | "locked": { 37 | "lastModified": 1648735462, 38 | "narHash": "sha256-G22WBttdFoWp7E/YvGfePOc+W+ZsQGw+IwpFbAwJNeI=", 39 | "owner": "tweag", 40 | "repo": "npmlock2nix", 41 | "rev": "dd2897c3a6e404446704a63f40b9a29fa0acf752", 42 | "type": "github" 43 | }, 44 | "original": { 45 | "owner": "tweag", 46 | "repo": "npmlock2nix", 47 | "type": "github" 48 | } 49 | }, 50 | "root": { 51 | "inputs": { 52 | "flake-utils": "flake-utils", 53 | "nixpkgs": "nixpkgs", 54 | "npmlock2nix-repo": "npmlock2nix-repo" 55 | } 56 | } 57 | }, 58 | "root": "root", 59 | "version": 7 60 | } 61 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "pzprjs"; 3 | 4 | inputs.flake-utils.url = "github:numtide/flake-utils"; 5 | inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-22.05; 6 | inputs.npmlock2nix-repo = { 7 | url = "github:tweag/npmlock2nix"; 8 | flake = false; 9 | }; 10 | 11 | outputs = { 12 | self, 13 | flake-utils, 14 | nixpkgs, 15 | npmlock2nix-repo, 16 | }: 17 | flake-utils.lib.eachDefaultSystem ( 18 | system: let 19 | pkgs = import nixpkgs {inherit system;}; 20 | in { 21 | defaultPackage = pkgs.callPackage ./nix/pzprjs.nix { 22 | git-hash = if self ? rev then self.rev else "dirty"; 23 | npmlock2nix = import npmlock2nix-repo {inherit pkgs;}; 24 | }; 25 | } 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /git-hash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ -z "$GIT_HASH" ]; then 4 | GIT_HASH=$(git rev-parse --short HEAD) 5 | fi 6 | 7 | cat > git.json <= 14.0" 22 | }, 23 | "scripts": { 24 | "build": "eslint --cache --quiet src src-ui && \"./git-hash.sh\" && grunt default", 25 | "release": "npm run clean && eslint --cache --quiet src && grunt release", 26 | "clean": "del dist/* pzpr-*.{zip,tar.gz,tar.bz2,tgz}", 27 | "format": "prettier --write \"{src,src-ui,test}/**/*.{js,css}\"", 28 | "check-format": "prettier --check \"{src,src-ui,test}/**/*.{js,css}\"", 29 | "lint": "eslint src src-ui test sample", 30 | "test": "mocha -r source-map-support/register -R progress --recursive test", 31 | "coverage": "nyc --reporter=lcov npm run test", 32 | "prepublishOnly": "npm test" 33 | }, 34 | "devDependencies": { 35 | "del-cli": "^4.0.1", 36 | "eslint": "^8.43.0", 37 | "grunt": "^1.5.3", 38 | "grunt-contrib-concat": "^1.0.1", 39 | "grunt-contrib-copy": "^1.0.0", 40 | "grunt-contrib-uglify": "^5.2.1", 41 | "mocha": "^10.0.0", 42 | "nyc": "^15.1.0", 43 | "prettier": "^1.19.1" 44 | }, 45 | "dependencies": { 46 | "pzpr-canvas": "0.8.2", 47 | "source-map-support": "^0.5.21" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /sample/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true // Allow to use node defined variable (require, process etc.) 4 | }, 5 | "parserOptions": { 6 | "ecmaVersion": 6 // Allow es.next features 7 | }, 8 | "extends": "eslint:recommended", // Implement recommended rules 9 | "rules": { 10 | "curly": ["error", "all"], // Error for no curly brancket in loop or conditions 11 | "no-unused-vars": // Error for unused variables, not detect arguments 12 | ["error", {"args": "none"}], 13 | "no-undef": "error", // Error for unused variable (that will become global variable) 14 | "new-cap": "error", // Error for lowercase first letter or constructor call as function 15 | "eqeqeq": ["error", "always"], // Error for ==, != to compare 16 | "no-use-before-define": // Error for using variable before definition 17 | ["error", {"functions":false, "classes":false}], 18 | "comma-dangle": ["error", "never"], // Error for trailing comma 19 | "no-redeclare": "error", // Error for redefine variable 20 | //"block-scoped-var": "warn", // Warn var declaration inside block scope 21 | "no-empty": "off", // Allow empty block statements 22 | "no-console": "off", // Allow to use console 23 | "no-useless-escape": "off", // Allow unnessesary escape charactors 24 | "no-extra-boolean-cast": "off", // Allow to use boolean cast for boolean value 25 | "no-mixed-spaces-and-tabs": "off", // Allow to use spaces and tabs for indent 26 | "dot-notation": "off", // Allow object access via obj["name"] 27 | "no-loop-func": "off" // Allow function definition in loop 28 | } 29 | } -------------------------------------------------------------------------------- /sample/exec.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | var pzpr = require('../'); 4 | var puzzle = new pzpr.Puzzle(); 5 | 6 | puzzle.open('?nurikabe/5/5'); 7 | 8 | puzzle.board.getc(1,1).setQnum(1); 9 | puzzle.board.getc(3,1).setQans(1); 10 | puzzle.board.getc(5,1).setQans(1); 11 | puzzle.board.getc(1,3).setQans(1); 12 | puzzle.board.getc(3,3).setQans(1); 13 | 14 | console.log(puzzle.check().text); 15 | 16 | try{ console.log(puzzle.getURL(1));}catch(e){} 17 | try{ console.log(puzzle.getURL(2));}catch(e){} 18 | try{ console.log(puzzle.getURL(3));}catch(e){} 19 | try{ console.log(puzzle.getURL(4));}catch(e){} 20 | try{ console.log(puzzle.getURL(5));}catch(e){} 21 | try{ console.log(puzzle.getFileData(1));}catch(e){} 22 | try{ console.log(puzzle.getFileData(2));}catch(e){} 23 | try{ console.log(puzzle.getFileData(3));}catch(e){} 24 | -------------------------------------------------------------------------------- /sample/html/api_test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 18 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 |
29 |
30 |
31 | 32 | 33 | 34 |
35 | 36 | 37 | -------------------------------------------------------------------------------- /sample/node.js: -------------------------------------------------------------------------------- 1 | 2 | var pzpr = require('../dist/js/pzpr.js'); 3 | 4 | console.log(pzpr.version); 5 | 6 | var puzzle = new pzpr.Puzzle(); 7 | 8 | puzzle.open('?nurikabe/5/5'); 9 | 10 | puzzle.board.cell[0].setQnum(1); 11 | 12 | console.log(puzzle.check().text); 13 | 14 | try{ console.log(puzzle.getURL(1));}catch(e){} 15 | try{ console.log(puzzle.getURL(2));}catch(e){} 16 | try{ console.log(puzzle.getURL(3));}catch(e){} 17 | try{ console.log(puzzle.getURL(4));}catch(e){} 18 | try{ console.log(puzzle.getURL(5));}catch(e){} 19 | try{ console.log(puzzle.getFileData(1,{history:true}));}catch(e){} 20 | try{ console.log(puzzle.getFileData(2));}catch(e){} 21 | try{ console.log(puzzle.getFileData(3));}catch(e){} 22 | -------------------------------------------------------------------------------- /sample/node2.js: -------------------------------------------------------------------------------- 1 | 2 | var pzpr = require('../index.js'); 3 | 4 | var puzzle = new pzpr.Puzzle().open('mashu/3/3'); 5 | 6 | console.log(puzzle.toDataURL(19)); 7 | -------------------------------------------------------------------------------- /sample/node3.js: -------------------------------------------------------------------------------- 1 | var pzpr = require('../dist/js/pzpr.js'); 2 | 3 | var puzzle = new pzpr.Puzzle({height:200,width:200,config:{cursor:false}}); 4 | puzzle.open('nurikabe/5/5/g5k2o1k3g'); 5 | puzzle.board.cell[0].qans = 1; 6 | console.log(puzzle.toDataURL()); 7 | console.log(puzzle.toBuffer(16)); 8 | // console.log(puzzle.canvas.innerHTML); 9 | // console.log(puzzle.getURL()); 10 | // console.log(puzzle.getFileData()); 11 | -------------------------------------------------------------------------------- /sample/node4.js: -------------------------------------------------------------------------------- 1 | var pzpr = require('../dist/js/pzpr.js'); 2 | 3 | new pzpr.Puzzle().open('nurikabe/5/5/g5k2o1k3g', function(puzzle){ 4 | puzzle.board.cell[0].qans = 1; 5 | console.log(puzzle.toDataURL()); 6 | // console.log(puzzle.canvas.innerHTML); 7 | // console.log(puzzle.getURL()); 8 | // console.log(puzzle.getFileData()); 9 | }); 10 | -------------------------------------------------------------------------------- /src-ui/changes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 19 | 20 | pzprjs changes 21 | 31 | 32 | 33 |
34 |
Latest types (all types)
35 | 44 |
45 | 46 | -------------------------------------------------------------------------------- /src-ui/img/akichi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/akichi.png -------------------------------------------------------------------------------- /src-ui/img/alter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/alter.png -------------------------------------------------------------------------------- /src-ui/img/angleloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/angleloop.png -------------------------------------------------------------------------------- /src-ui/img/aquapelago.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/aquapelago.png -------------------------------------------------------------------------------- /src-ui/img/aquarium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/aquarium.png -------------------------------------------------------------------------------- /src-ui/img/araf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/araf.png -------------------------------------------------------------------------------- /src-ui/img/archipelago.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/archipelago.png -------------------------------------------------------------------------------- /src-ui/img/balance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/balance.png -------------------------------------------------------------------------------- /src-ui/img/balloon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/balloon.png -------------------------------------------------------------------------------- /src-ui/img/batten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/batten.png -------------------------------------------------------------------------------- /src-ui/img/battleship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/battleship.png -------------------------------------------------------------------------------- /src-ui/img/bdwalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/bdwalk.png -------------------------------------------------------------------------------- /src-ui/img/bosnianroad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/bosnianroad.png -------------------------------------------------------------------------------- /src-ui/img/brownies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/brownies.png -------------------------------------------------------------------------------- /src-ui/img/castle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/castle.png -------------------------------------------------------------------------------- /src-ui/img/cbanana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/cbanana.png -------------------------------------------------------------------------------- /src-ui/img/chainedb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/chainedb.png -------------------------------------------------------------------------------- /src-ui/img/circlesquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/circlesquare.png -------------------------------------------------------------------------------- /src-ui/img/cocktail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/cocktail.png -------------------------------------------------------------------------------- /src-ui/img/coffeemilk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/coffeemilk.png -------------------------------------------------------------------------------- /src-ui/img/compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/compass.png -------------------------------------------------------------------------------- /src-ui/img/coral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/coral.png -------------------------------------------------------------------------------- /src-ui/img/cts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/cts.png -------------------------------------------------------------------------------- /src-ui/img/curvedata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/curvedata.png -------------------------------------------------------------------------------- /src-ui/img/curving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/curving.png -------------------------------------------------------------------------------- /src-ui/img/dbchoco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/dbchoco.png -------------------------------------------------------------------------------- /src-ui/img/detour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/detour.png -------------------------------------------------------------------------------- /src-ui/img/dominion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/dominion.png -------------------------------------------------------------------------------- /src-ui/img/doppelblock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/doppelblock.png -------------------------------------------------------------------------------- /src-ui/img/dotchi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/dotchi.png -------------------------------------------------------------------------------- /src-ui/img/dotchi2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/dotchi2.png -------------------------------------------------------------------------------- /src-ui/img/doubleback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/doubleback.png -------------------------------------------------------------------------------- /src-ui/img/easyasabc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/easyasabc.png -------------------------------------------------------------------------------- /src-ui/img/evolmino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/evolmino.png -------------------------------------------------------------------------------- /src-ui/img/fakearrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/fakearrow.png -------------------------------------------------------------------------------- /src-ui/img/firewalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/firewalk.png -------------------------------------------------------------------------------- /src-ui/img/forestwalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/forestwalk.png -------------------------------------------------------------------------------- /src-ui/img/geradeweg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/geradeweg.png -------------------------------------------------------------------------------- /src-ui/img/heteromino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/heteromino.png -------------------------------------------------------------------------------- /src-ui/img/heyapin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/heyapin.png -------------------------------------------------------------------------------- /src-ui/img/icewalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/icewalk.png -------------------------------------------------------------------------------- /src-ui/img/invlitso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/invlitso.png -------------------------------------------------------------------------------- /src-ui/img/island.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/island.png -------------------------------------------------------------------------------- /src-ui/img/kaidan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kaidan.png -------------------------------------------------------------------------------- /src-ui/img/kaisu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kaisu.png -------------------------------------------------------------------------------- /src-ui/img/kissing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kissing.png -------------------------------------------------------------------------------- /src-ui/img/kropki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kropki.png -------------------------------------------------------------------------------- /src-ui/img/kuroclone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kuroclone.png -------------------------------------------------------------------------------- /src-ui/img/kuromenbun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/kuromenbun.png -------------------------------------------------------------------------------- /src-ui/img/ladders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/ladders.png -------------------------------------------------------------------------------- /src-ui/img/lixloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/lixloop.png -------------------------------------------------------------------------------- /src-ui/img/lollipops.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/lollipops.png -------------------------------------------------------------------------------- /src-ui/img/magnets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/magnets.png -------------------------------------------------------------------------------- /src-ui/img/mannequin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/mannequin.png -------------------------------------------------------------------------------- /src-ui/img/martini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/martini.png -------------------------------------------------------------------------------- /src-ui/img/maxi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/maxi.png -------------------------------------------------------------------------------- /src-ui/img/midloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/midloop.png -------------------------------------------------------------------------------- /src-ui/img/mintonette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/mintonette.png -------------------------------------------------------------------------------- /src-ui/img/mirrorbk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/mirrorbk.png -------------------------------------------------------------------------------- /src-ui/img/moonsun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/moonsun.png -------------------------------------------------------------------------------- /src-ui/img/mrtile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/mrtile.png -------------------------------------------------------------------------------- /src-ui/img/mukkonn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/mukkonn.png -------------------------------------------------------------------------------- /src-ui/img/nanameguri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nanameguri.png -------------------------------------------------------------------------------- /src-ui/img/nibunnogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nibunnogo.png -------------------------------------------------------------------------------- /src-ui/img/nondango.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nondango.png -------------------------------------------------------------------------------- /src-ui/img/nonogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nonogram.png -------------------------------------------------------------------------------- /src-ui/img/norinuri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/norinuri.png -------------------------------------------------------------------------------- /src-ui/img/nothing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nothing.png -------------------------------------------------------------------------------- /src-ui/img/nurimisaki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nurimisaki.png -------------------------------------------------------------------------------- /src-ui/img/nuritwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nuritwin.png -------------------------------------------------------------------------------- /src-ui/img/nuriuzu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/nuriuzu.png -------------------------------------------------------------------------------- /src-ui/img/oneroom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/oneroom.png -------------------------------------------------------------------------------- /src-ui/img/orbital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/orbital.png -------------------------------------------------------------------------------- /src-ui/img/ovotovata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/ovotovata.png -------------------------------------------------------------------------------- /src-ui/img/oyakodori.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/oyakodori.png -------------------------------------------------------------------------------- /src-ui/img/patchwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/patchwork.png -------------------------------------------------------------------------------- /src-ui/img/pencils.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/pencils.png -------------------------------------------------------------------------------- /src-ui/img/pentatouch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/pentatouch.png -------------------------------------------------------------------------------- /src-ui/img/pentopia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/pentopia.png -------------------------------------------------------------------------------- /src-ui/img/pmemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/pmemory.png -------------------------------------------------------------------------------- /src-ui/img/portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/portal.png -------------------------------------------------------------------------------- /src-ui/img/ququ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/ququ.png -------------------------------------------------------------------------------- /src-ui/img/rassi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/rassi.png -------------------------------------------------------------------------------- /src-ui/img/recoil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/recoil.png -------------------------------------------------------------------------------- /src-ui/img/regional-poly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/regional-poly.png -------------------------------------------------------------------------------- /src-ui/img/remlen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/remlen.png -------------------------------------------------------------------------------- /src-ui/img/retroships.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/retroships.png -------------------------------------------------------------------------------- /src-ui/img/retsurin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/retsurin.png -------------------------------------------------------------------------------- /src-ui/img/roundtrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/roundtrip.png -------------------------------------------------------------------------------- /src-ui/img/sananko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/sananko.png -------------------------------------------------------------------------------- /src-ui/img/sashikazune.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/sashikazune.png -------------------------------------------------------------------------------- /src-ui/img/satogaeri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/satogaeri.png -------------------------------------------------------------------------------- /src-ui/img/scrin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/scrin.png -------------------------------------------------------------------------------- /src-ui/img/simplegako.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/simplegako.png -------------------------------------------------------------------------------- /src-ui/img/simpleloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/simpleloop.png -------------------------------------------------------------------------------- /src-ui/img/skyscrapers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/skyscrapers.png -------------------------------------------------------------------------------- /src-ui/img/slashpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/slashpack.png -------------------------------------------------------------------------------- /src-ui/img/smullyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/smullyan.png -------------------------------------------------------------------------------- /src-ui/img/snake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/snake.png -------------------------------------------------------------------------------- /src-ui/img/snakeegg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/snakeegg.png -------------------------------------------------------------------------------- /src-ui/img/squarejam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/squarejam.png -------------------------------------------------------------------------------- /src-ui/img/starbattle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/starbattle.png -------------------------------------------------------------------------------- /src-ui/img/statuepark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/statuepark.png -------------------------------------------------------------------------------- /src-ui/img/subomino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/subomino.png -------------------------------------------------------------------------------- /src-ui/img/swslither.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/swslither.png -------------------------------------------------------------------------------- /src-ui/img/symmarea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/symmarea.png -------------------------------------------------------------------------------- /src-ui/img/tachibk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tachibk.png -------------------------------------------------------------------------------- /src-ui/img/tajmahal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tajmahal.png -------------------------------------------------------------------------------- /src-ui/img/takoyaki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/takoyaki.png -------------------------------------------------------------------------------- /src-ui/img/tapaloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tapaloop.png -------------------------------------------------------------------------------- /src-ui/img/tents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tents.png -------------------------------------------------------------------------------- /src-ui/img/teri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/teri.png -------------------------------------------------------------------------------- /src-ui/img/tetrochain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tetrochain.png -------------------------------------------------------------------------------- /src-ui/img/tetrominous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tetrominous.png -------------------------------------------------------------------------------- /src-ui/img/tilecity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tilecity.png -------------------------------------------------------------------------------- /src-ui/img/timebomb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/timebomb.png -------------------------------------------------------------------------------- /src-ui/img/tjunction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tjunction.png -------------------------------------------------------------------------------- /src-ui/img/tontonbeya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tontonbeya.png -------------------------------------------------------------------------------- /src-ui/img/trainstations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/trainstations.png -------------------------------------------------------------------------------- /src-ui/img/tslither.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/tslither.png -------------------------------------------------------------------------------- /src-ui/img/turnaround.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/turnaround.png -------------------------------------------------------------------------------- /src-ui/img/voxas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/voxas.png -------------------------------------------------------------------------------- /src-ui/img/vslither.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/vslither.png -------------------------------------------------------------------------------- /src-ui/img/wafusuma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/wafusuma.png -------------------------------------------------------------------------------- /src-ui/img/walllogic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/walllogic.png -------------------------------------------------------------------------------- /src-ui/img/wataridori.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/wataridori.png -------------------------------------------------------------------------------- /src-ui/img/waterwalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/waterwalk.png -------------------------------------------------------------------------------- /src-ui/img/wittgen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/wittgen.png -------------------------------------------------------------------------------- /src-ui/img/yinyang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/yinyang.png -------------------------------------------------------------------------------- /src-ui/img/zabajaba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robx/pzprjs/66159ca48828d640a5ba74deae80f80f08f51b24/src-ui/img/zabajaba.png -------------------------------------------------------------------------------- /src-ui/js/common/intro.js: -------------------------------------------------------------------------------- 1 | // intro.js 2 | 3 | (function(){ 4 | -------------------------------------------------------------------------------- /src-ui/js/common/langs.js: -------------------------------------------------------------------------------- 1 | // langs.js 2 | 3 | ui.langs = { 4 | en: <%= JSON.stringify(langs.p_en) %>, 5 | ja: <%= JSON.stringify(langs.p_ja) %> 6 | }; 7 | -------------------------------------------------------------------------------- /src-ui/js/common/outro.js: -------------------------------------------------------------------------------- 1 | // outro.js 2 | 3 | })(); 4 | -------------------------------------------------------------------------------- /src-ui/js/pzpr-ui.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | exports.files = [ 3 | "common/intro", 4 | "ui/Boot", 5 | "ui/UI", 6 | "common/langs", 7 | "ui/Event", 8 | "ui/Listener", 9 | "ui/MenuConfig", 10 | "ui/UrlConfig", 11 | "ui/Misc", 12 | "ui/MenuArea", 13 | "ui/PopupMenu", 14 | "ui/ToolArea", 15 | "ui/Notify", 16 | "ui/KeyPopup", 17 | "ui/Timer", 18 | "ui/AuxEditor", 19 | "ui/Network", 20 | "common/outro" 21 | ].map(function(mod) { 22 | return "src-ui/js/" + mod + ".js"; 23 | }); 24 | -------------------------------------------------------------------------------- /src-ui/js/ui/Network.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | ui.network = { 3 | ws: null, 4 | mode: "", 5 | key: "", 6 | maxSeen: -1, 7 | 8 | configure: function(mode, key) { 9 | this.mode = mode; 10 | this.key = key; 11 | ui.setdisplay("network"); 12 | }, 13 | 14 | start: function() { 15 | if (!this.mode) { 16 | return; 17 | } 18 | 19 | var loc = window.location; 20 | var wsurl = "ws://"; 21 | if (document.location.protocol === "https:") { 22 | wsurl = "wss://"; 23 | } 24 | wsurl = wsurl + loc.host + "/game/" + this.key; 25 | 26 | this.ws = new WebSocket(wsurl); 27 | this.ws.onclose = this.onclose; 28 | this.ws.onmessage = this.onmessage; 29 | }, 30 | 31 | onCellOp: function(op) { 32 | if (!!this.ws) { 33 | this.ws.send(op); 34 | } 35 | }, 36 | 37 | onclose: function(event) { 38 | ui.network.start(); 39 | }, 40 | 41 | onmessage: function(event) { 42 | var msg = JSON.parse(event.data); 43 | var id = msg.id; 44 | if (id > ui.network.maxSeen) { 45 | ui.network.maxSeen = id; 46 | ui.network.applyOp(msg.operation); 47 | } 48 | }, 49 | 50 | applyOp: function(encOp) { 51 | var op = new ui.puzzle.klass.ObjectOperation(); 52 | op.decode(encOp.split(",")); 53 | op.external = true; 54 | 55 | ui.puzzle.opemgr.disableRecord(); 56 | op.redo(); 57 | ui.puzzle.opemgr.enableRecord(); 58 | 59 | ui.puzzle.opemgr.newOperation(); 60 | ui.puzzle.opemgr.add(op); 61 | } 62 | }; 63 | })(); 64 | -------------------------------------------------------------------------------- /src-ui/js/ui/UrlConfig.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | ui.urlconfig = { 3 | embed: false, 4 | 5 | init: function(onload_option) { 6 | if (onload_option.embed === "yes") { 7 | this.embed = true; 8 | } 9 | } 10 | }; 11 | })(); 12 | -------------------------------------------------------------------------------- /src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, // Allow to use browser defined variable (not console, alert etc.) 4 | "node": true // Allow to use node defined variable (require, process etc.) 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": 5 8 | }, 9 | "globals": { 10 | "pzpr": "readonly" 11 | }, 12 | "extends": "eslint:recommended", // Implement recommended rules 13 | "rules": { 14 | "curly": ["error", "all"], // Error for no curly brancket in loop or conditions 15 | "no-unused-vars": // Error for unused variables, not detect arguments 16 | ["error", {"args": "none"}], 17 | "no-undef": "error", // Error for unused variable (that will become global variable) 18 | "new-cap": "error", // Error for lowercase first letter or constructor call as function 19 | "eqeqeq": ["error", "always"], // Error for ==, != to compare 20 | "no-use-before-define": // Error for using variable before definition 21 | ["error", {"functions":false, "classes":false}], 22 | "comma-dangle": ["error", "never"], // Error for trailing comma 23 | "no-redeclare": "off", 24 | "no-empty": "off", // Allow empty block statements 25 | "no-constant-condition": // Allow constant condition in conditions 26 | ["error", {"checkLoops": false}], 27 | "no-useless-escape": "off", // Allow unnessesary escape charactors 28 | "no-extra-boolean-cast": "off", // Allow to use boolean cast for boolean value 29 | "no-mixed-spaces-and-tabs": "off", // Allow to use spaces and tabs for indent 30 | "dot-notation": "off", // Allow object access via obj["name"] 31 | "no-loop-func": "off" // Allow function definition in loop 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/common/banner_full.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * @license 3 | * 4 | * pzpr.js v<%= git.hash %> 5 | * https://github.com/sabo2/pzprv3 6 | * 7 | * This script includes candle.js, see below 8 | * https://github.com/sabo2/candle 9 | * 10 | * Copyright 2009-<%= grunt.template.today('yyyy') %> <%= pkg.author %> 11 | * 12 | * This script is released under the MIT license. Please see below. 13 | * http://www.opensource.org/licenses/mit-license.php 14 | * 15 | * Date: <%= grunt.template.today('yyyy-mm-dd') %> 16 | */ 17 | -------------------------------------------------------------------------------- /src/common/banner_min.js: -------------------------------------------------------------------------------- 1 | /*! @license pzpr.js v<%= git.hash %> (c) 2009-<%= grunt.template.today('yyyy') %> <%= pkg.author %>, MIT license 2 | * https://github.com/sabo2/pzprv3 */ 3 | -------------------------------------------------------------------------------- /src/common/intro.js: -------------------------------------------------------------------------------- 1 | // intro.js 2 | 3 | (function(){ 4 | -------------------------------------------------------------------------------- /src/common/langs.js: -------------------------------------------------------------------------------- 1 | // langs.js 2 | 3 | pzpr.failcodes = { 4 | en: <%= JSON.stringify(langs.failcode_en) %>, 5 | ja: <%= JSON.stringify(langs.failcode_ja) %> 6 | }; 7 | -------------------------------------------------------------------------------- /src/common/outro.js: -------------------------------------------------------------------------------- 1 | // outro.js 2 | 3 | })(); 4 | -------------------------------------------------------------------------------- /src/lib/candle-intro.js: -------------------------------------------------------------------------------- 1 | // candle-intro.js 2 | 3 | (function(){ 4 | 5 | 6 | //--------------------------------------------------------------------------- 7 | // node.js環境向けの対策 8 | //--------------------------------------------------------------------------- 9 | var document = this.document; 10 | 11 | var module = {exports:{}}, exports = module.exports; 12 | 13 | (function(module,exports){ 14 | -------------------------------------------------------------------------------- /src/lib/candle-outro.js: -------------------------------------------------------------------------------- 1 | // candle-outro.js 2 | 3 | })(module,exports); 4 | 5 | pzpr.Candle = module.exports; 6 | 7 | })(); 8 | 9 | //--------------------------------------------------------------------------- 10 | // node.js環境向けの対策 11 | //--------------------------------------------------------------------------- 12 | document = this.document || pzpr.Candle.document; 13 | var DOMParser = this.DOMParser || pzpr.Candle.DOMParser; 14 | var XMLSerializer = this.XMLSerializer || pzpr.Candle.XMLSerializer; 15 | -------------------------------------------------------------------------------- /src/pzpr.js: -------------------------------------------------------------------------------- 1 | exports.files = [ 2 | "common/intro", 3 | "pzpr/core", 4 | "lib/candle-intro", 5 | "../node_modules/pzpr-canvas/dist/candle", 6 | "lib/candle-outro", 7 | "common/langs", 8 | "pzpr/env", 9 | "pzpr/event", 10 | "pzpr/classmgr", 11 | "pzpr/variety", 12 | "pzpr/parser", 13 | "pzpr/metadata", 14 | "pzpr/util", 15 | "puzzle/Puzzle", 16 | "puzzle/Config", 17 | "puzzle/Address", 18 | "puzzle/Piece", 19 | "puzzle/PieceList", 20 | "puzzle/Board", 21 | "puzzle/BoardExec", 22 | "puzzle/GraphBase", 23 | "puzzle/LineManager", 24 | "puzzle/AreaManager", 25 | "puzzle/Graphic", 26 | "puzzle/MouseInput", 27 | "puzzle/KeyInput", 28 | "puzzle/Encode", 29 | "puzzle/FileData", 30 | "puzzle/Answer", 31 | "puzzle/Operation", 32 | "puzzle/Bank", 33 | "variety-common/Graphic", 34 | "variety-common/KeyInput", 35 | "variety-common/MouseInput", 36 | "variety-common/Answer", 37 | "variety-common/BoardExec", 38 | "variety-common/Encode", 39 | "variety-common/FileData", 40 | "variety-common/Operation", 41 | "variety-common/Piece", 42 | "common/outro" 43 | ].map(function(mod) { 44 | return "src/" + mod + ".js"; 45 | }); 46 | -------------------------------------------------------------------------------- /src/pzpr/core.js: -------------------------------------------------------------------------------- 1 | // core.js v3.5.2 2 | 3 | //---------------------------------------------------------------------------- 4 | // ★pzprオブジェクト 5 | //--------------------------------------------------------------------------- 6 | /* extern */ 7 | var pzpr = { 8 | version: "<%= git.hash %>" 9 | }; 10 | 11 | if (typeof module === "object" && module.exports) { 12 | module.exports = pzpr; 13 | } else { 14 | this.pzpr = pzpr; 15 | } 16 | -------------------------------------------------------------------------------- /src/pzpr/metadata.js: -------------------------------------------------------------------------------- 1 | // metadata.js v3.5.2 2 | 3 | //--------------------------------------------------------------------------- 4 | // MetaData構造体 作者やコメントなどの情報を保持する 5 | //--------------------------------------------------------------------------- 6 | pzpr.MetaData = function() {}; 7 | pzpr.MetaData.prototype = { 8 | author: "", 9 | source: "", 10 | hard: "", 11 | comment: "", 12 | items: { author: "", source: "", hard: "", comment: "" }, 13 | 14 | update: function(metadata) { 15 | if (!metadata) { 16 | return; 17 | } 18 | for (var i in this.items) { 19 | if (typeof metadata[i] === "string") { 20 | this[i] = metadata[i]; 21 | } 22 | } 23 | }, 24 | getvaliddata: function() { 25 | var obj = {}; 26 | for (var i in this.items) { 27 | if (!!this[i]) { 28 | obj[i] = this[i]; 29 | } 30 | } 31 | return obj; 32 | }, 33 | reset: function() { 34 | for (var i in this.items) { 35 | this[i] = ""; 36 | } 37 | }, 38 | empty: function() { 39 | for (var i in this.items) { 40 | if (!!this[i]) { 41 | return false; 42 | } 43 | } 44 | return true; 45 | } 46 | }; 47 | -------------------------------------------------------------------------------- /src/variety-common/Operation.js: -------------------------------------------------------------------------------- 1 | // Operation.js 2 | 3 | pzpr.classmgr.makeCommon({ 4 | //--------------------------------------------------------- 5 | "StartGoalOperation:Operation": { 6 | setData: function(prop, x1, y1, x2, y2) { 7 | this.property = prop; 8 | this.bx1 = x1; 9 | this.by1 = y1; 10 | this.bx2 = x2; 11 | this.by2 = y2; 12 | }, 13 | decode: function(strs) { 14 | if (strs[0] !== "PS" && strs[0] !== "PG") { 15 | return false; 16 | } 17 | this.property = strs[0] === "PS" ? "start" : "goal"; 18 | this.bx1 = +strs[1]; 19 | this.by1 = +strs[2]; 20 | this.bx2 = +strs[3]; 21 | this.by2 = +strs[4]; 22 | return true; 23 | }, 24 | toString: function() { 25 | return [ 26 | this.property === "start" ? "PS" : "PG", 27 | this.bx1, 28 | this.by1, 29 | this.bx2, 30 | this.by2 31 | ].join(","); 32 | }, 33 | 34 | isModify: function(lastope) { 35 | // 1回の入力でstartpos, goalposが連続して更新されているなら前回の更新のみ 36 | if ( 37 | this.manager.changeflag && 38 | lastope.bx2 === this.bx1 && 39 | lastope.by2 === this.by1 && 40 | lastope.property === this.property 41 | ) { 42 | lastope.bx2 = this.bx2; 43 | lastope.by2 = this.by2; 44 | return true; 45 | } 46 | return false; 47 | }, 48 | 49 | undo: function() { 50 | this.exec(this.bx1, this.by1); 51 | }, 52 | redo: function() { 53 | this.exec(this.bx2, this.by2); 54 | }, 55 | exec: function(bx, by) { 56 | var bd = this.board, 57 | cell = bd.getc(bx, by); 58 | if (this.property === "start") { 59 | bd.startpos.set(cell); 60 | } else if (this.property === "goal") { 61 | bd.goalpos.set(cell); 62 | } 63 | } 64 | } 65 | }); 66 | -------------------------------------------------------------------------------- /src/variety-common/Piece.js: -------------------------------------------------------------------------------- 1 | // Piece.js 2 | 3 | pzpr.classmgr.makeCommon({ 4 | //--------------------------------------------------------- 5 | "StartGoalAddress:Address": { 6 | type: "", 7 | partner: null, 8 | 9 | init: function(bx, by) { 10 | this.bx = bx; 11 | this.by = by; 12 | return this; 13 | }, 14 | 15 | input: function(cell) { 16 | if (!this.partner || !this.partner.equals(cell)) { 17 | if (!this.equals(cell)) { 18 | this.set(cell); 19 | } else { 20 | this.draw(); 21 | } 22 | } else { 23 | this.board.exchangestartgoal(); 24 | } 25 | }, 26 | set: function(pos, record) { 27 | var pos0 = this.getaddr(); 28 | if (record !== false) { 29 | this.addOpe(pos.bx, pos.by); 30 | } 31 | 32 | this.bx = pos.bx; 33 | this.by = pos.by; 34 | 35 | pos0.draw(); 36 | this.draw(); 37 | }, 38 | 39 | addOpe: function(bx, by) { 40 | if (this.bx === bx && this.by === by) { 41 | return; 42 | } 43 | this.puzzle.opemgr.add( 44 | new this.klass.StartGoalOperation(this.type, this.bx, this.by, bx, by) 45 | ); 46 | } 47 | }, 48 | "StartAddress:StartGoalAddress": { 49 | type: "start" 50 | }, 51 | "GoalAddress:StartGoalAddress": { 52 | type: "goal" 53 | } 54 | }); 55 | -------------------------------------------------------------------------------- /test/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "node": true 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": 6 8 | }, 9 | "globals": { 10 | "beforeEach": "readonly", 11 | "describe": "readonly", 12 | "it": "readonly" 13 | }, 14 | "extends": "eslint:recommended", // Implement recommended rules 15 | "rules": { 16 | "curly": ["error", "all"], // Error for no curly brancket in loop or conditions 17 | "no-unused-vars": // Error for unused variables, not detect arguments 18 | ["error", {"args": "none"}], 19 | "no-undef": "error", // Error for unused variable (that will become global variable) 20 | "new-cap": "error", // Error for lowercase first letter or constructor call as function 21 | "eqeqeq": ["error", "always"], // Error for ==, != to compare 22 | "no-use-before-define": // Error for using variable before definition 23 | ["error", {"functions":false, "classes":false}], 24 | "comma-dangle": ["error", "never"], // Error for trailing comma 25 | "no-redeclare": "error", // Error for redefine variable 26 | //"block-scoped-var": "warn", // Warn var declaration inside block scope 27 | "no-empty": "off", // Allow empty block statements 28 | "no-useless-escape": "off", // Allow unnessesary escape charactors 29 | "no-extra-boolean-cast": "off", // Allow to use boolean cast for boolean value 30 | "no-mixed-spaces-and-tabs": "off", // Allow to use spaces and tabs for indent 31 | "dot-notation": "off", // Allow object access via obj["name"] 32 | "no-loop-func": "off", // Allow function definition in loop 33 | "no-console": "off" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/load_testdata.js: -------------------------------------------------------------------------------- 1 | // test/load_testdata.js 2 | 3 | var pzpr = require("../dist/js/pzpr.js"); 4 | 5 | // Load test data 6 | var testdata = {}; 7 | global.ui = { 8 | debug: { 9 | addDebugData: function(pid, data) { 10 | testdata[pid] = data; 11 | testdata[pid].fullfile = data.failcheck[data.failcheck.length - 1][1]; 12 | } 13 | } 14 | }; 15 | pzpr.variety.each(function(pid) { 16 | require("./script/" + pid + ".js"); 17 | }); 18 | 19 | module.exports = testdata; 20 | -------------------------------------------------------------------------------- /test/puzzle/answer_test.js: -------------------------------------------------------------------------------- 1 | // test/answer_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../dist/js/pzpr.js"); 6 | 7 | var testdata = require("../load_testdata.js"); 8 | 9 | pzpr.variety.each(function(pid) { 10 | describe(pid + " answer test", function() { 11 | describe("Answer check", function() { 12 | var puzzle = new pzpr.Puzzle(); 13 | puzzle.setConfig("forceallcell", true); 14 | testdata[pid].failcheck.forEach(function(testcase) { 15 | var idx = testdata[pid].failcheck.indexOf(testcase); 16 | it("Check[" + idx + "]: " + testcase[0], function() { 17 | puzzle.open(testcase[1]); 18 | var failcode = puzzle.check(true); 19 | var failcodePassive = puzzle.check(false); 20 | assert.equal(failcode[0], testcase[0]); 21 | assert.equal(!!failcode[0], !!failcodePassive[0]); 22 | if (testcase.length > 2 && "undecided" in testcase[2]) { 23 | assert.equal(failcode.undecided, testcase[2].undecided); 24 | } 25 | assert.notEqual(failcode.gettext("en"), pzpr.failcodes.en.invalid); 26 | }); 27 | }); 28 | }); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /test/puzzle/filedata_test.js: -------------------------------------------------------------------------------- 1 | // test/filedata_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../dist/js/pzpr.js"); 6 | 7 | var testdata = require("../load_testdata.js"); 8 | 9 | function assert_equal_board(bd1, bd2, iskanpen) { 10 | var pid = bd1.pid; 11 | var ignore_qsub = 12 | iskanpen && 13 | (pid === "fillomino" || 14 | pid === "hashikake" || 15 | pid === "heyabon" || 16 | pid === "kurodoko" || 17 | pid === "shikaku" || 18 | pid === "tentaisho"); 19 | bd1.compareData(bd2, function(group, c, a) { 20 | if (ignore_qsub && (a === "qsub" || a === "qcmp")) { 21 | return; 22 | } 23 | assert.equal( 24 | bd2[group][c][a], 25 | bd1[group][c][a], 26 | group + "[" + c + "]." + a 27 | ); 28 | }); 29 | } 30 | 31 | pzpr.variety.each(function(pid) { 32 | describe(pid + " filedata test", function() { 33 | describe("File I/O", function() { 34 | var puzzle = new pzpr.Puzzle().open(testdata[pid].fullfile); 35 | it("pzpr file", function() { 36 | var bd = puzzle.board, 37 | bd2 = bd.freezecopy(); 38 | var outputstr = puzzle.getFileData(pzpr.parser.FILE_PZPR); 39 | 40 | puzzle.open(outputstr, function() { 41 | assert_equal_board(bd, bd2, false); 42 | }); 43 | }); 44 | if (!pzpr.variety(pid).exists.pencilbox) { 45 | return; 46 | } 47 | it("Kanpen file", function() { 48 | var bd = puzzle.board, 49 | bd2 = bd.freezecopy(); 50 | var outputstr = puzzle.getFileData(pzpr.parser.FILE_PBOX); 51 | 52 | puzzle.open(outputstr, function() { 53 | assert_equal_board(bd, bd2, true); 54 | }); 55 | }); 56 | it("Kanpen XML file", function() { 57 | var bd = puzzle.board, 58 | bd2 = bd.freezecopy(); 59 | var outputstr = puzzle.getFileData(pzpr.parser.FILE_PBOX_XML); 60 | 61 | puzzle.open(outputstr, function() { 62 | assert_equal_board(bd, bd2, true); 63 | }); 64 | }); 65 | }); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /test/puzzle/render_test.js: -------------------------------------------------------------------------------- 1 | var pzpr = require("../../dist/js/pzpr.js"); 2 | 3 | var testdata = require("../load_testdata.js"); 4 | 5 | pzpr.variety.each(function(pid) { 6 | describe(pid + " render test", function() { 7 | it("render svg", function() { 8 | var checks = testdata[pid].failcheck; 9 | 10 | checks.forEach(function(check) { 11 | var puzzle = new pzpr.Puzzle(); 12 | puzzle.open(check[1], () => { 13 | puzzle.check(true); 14 | puzzle.toBuffer("svg", 0, 30); 15 | }); 16 | }); 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/script/alter.js: -------------------------------------------------------------------------------- 1 | /* alter.js */ 2 | 3 | ui.debug.addDebugData("alter", { 4 | url: "4/4/aqgk1gc1a3b1a1a2c", 5 | failcheck: [ 6 | [ 7 | "bkNumLt3", 8 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . . . /. . . . /. 2 . . /. . . . /" 9 | ], 10 | [ 11 | "bkDupNum", 12 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . . . /2 . . . /. . . . /. . . . /" 13 | ], 14 | [ 15 | "bkNumGt3", 16 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . 3 . /. . . . /. 2 . 2 /. . 3 . /" 17 | ], 18 | [ 19 | "nmTripRow", 20 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . . . /. . . . /. 2 . 3 /. . . . /" 21 | ], 22 | [ 23 | "nmMissRow", 24 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . 3 . /. . . . /. 2 . 2 /. 3 . . /" 25 | ], 26 | [ 27 | "nmDupRow", 28 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /2 . . . /. . . 2 /. . . . /. . . . /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/alter/4/4/3/0 0 1 1 /2 0 0 1 /2 0 0 1 /2 2 1 1 /. . . 1 /. 3 . . /1 . 1 . /2 . . . /. . 3 . /. . . 2 /. 2 . . /. 3 . . /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/archipelago.js: -------------------------------------------------------------------------------- 1 | /* archipelago.js */ 2 | 3 | ui.debug.addDebugData("archipelago", { 4 | url: "6/6/2o.g3h.n1p1", 5 | failcheck: [ 6 | [ 7 | "bkSizeNe", 8 | "pzprv3/archipelago/6/6/2 . # # . . /. # . . - . /3 # . - # # /. . . . . . /1 . . . . . /. . . . . 1 /" 9 | ], 10 | [ 11 | "bsNoSequence", 12 | "pzprv3/archipelago/6/6/2 # . . # . /. . # # - . /3 # . - . . /. # . . . . /1 . . # # . /. . . . . 1 /" 13 | ], 14 | [ 15 | "bsSameNum", 16 | "pzprv3/archipelago/6/6/2 # . . . . /. . # # - . /3 # . - . . /. # . . . . /1 . . . . . /. # # # . 1 /" 17 | ], 18 | [ 19 | "bkNoChain", 20 | "pzprv3/archipelago/6/6/2 # . . . . /. . # # - . /3 # . - . . /. # . . . . /1 . . . . . /. . . . . 1 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/archipelago/6/6/2 # + + + + /+ + # # - + /3 # + - + + /+ # + + + + /1 + + # # + /+ + + + + 1 /" 25 | ] 26 | ], 27 | inputs: [ 28 | { 29 | input: ["newboard,6,2", "cursor,5,3", "mouse,right,5,3"], 30 | result: "pzprv3/archipelago/2/6/. . . . . . /. . 5 . . . /" 31 | } 32 | ] 33 | }); 34 | -------------------------------------------------------------------------------- /test/script/arrowflow.js: -------------------------------------------------------------------------------- 1 | /* arrowflow.js */ 2 | 3 | ui.debug.addDebugData("arrowflow", { 4 | url: "4/4/1g0.j5h0i2", 5 | failcheck: [ 6 | [ 7 | "nmAdjacent", 8 | "pzprv3/arrowflow/4/4/1 . 0 - /. . . . /5 . . 0 /. . . 2 /. 3 . . /2 3 4 1 /. 1 2 . /1 3 4 . /" 9 | ], 10 | [ 11 | "arCountLt", 12 | "pzprv3/arrowflow/4/4/1 . 0 - /. . . . /5 . . 0 /. . . 2 /. 3 . . /4 2 4 1 /. 3 1 . /4 1 4 . /" 13 | ], 14 | [ 15 | "arCountGt", 16 | "pzprv3/arrowflow/4/4/1 . 0 - /. . . . /5 . . 0 /. . . 2 /. 2 . . /2 3 4 1 /. 1 2 . /1 3 4 . /" 17 | ], 18 | [ 19 | "stopHalfway", 20 | "pzprv3/arrowflow/4/4/1 . 0 - /. . . . /5 . . 0 /. . . 2 /. 3 . . /4 2 4 2 /. 3 2 . /4 1 4 . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/arrowflow/4/4/1 . 0 - /. . . . /5 . . 0 /. . . 2 /. 3 . . /4 2 4 1 /. 3 2 . /4 1 4 . /" 25 | ] 26 | ], 27 | inputs: [ 28 | { 29 | input: ["newboard,3,3", "editmode", "cursor,3,1", "key,8"], 30 | result: "pzprv3/arrowflow/3/3/. 8 . /. . . /. . . /. . . /. . . /. . . /" 31 | } 32 | ] 33 | }); 34 | -------------------------------------------------------------------------------- /test/script/box.js: -------------------------------------------------------------------------------- 1 | /* box.js */ 2 | 3 | ui.debug.addDebugData("box", { 4 | url: "5/5/7a9979672f", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/box/5/5"], 7 | [ 8 | "nmSumRowShadeNe", 9 | "pzprv3/box/5/5/0 7 10 9 9 7 /9 . # . . . /6 . + . . . /7 . + . . . /2 + # + + + /15 # # # # # /" 10 | ], 11 | [ 12 | null, 13 | "pzprv3/box/5/5/0 7 10 9 9 7 /9 + # # # + /6 # + + + # /7 + + # # + /2 + # + + + /15 # # # # # /" 14 | ] 15 | ], 16 | inputs: [ 17 | /* 回答入力はnurikabeと同じなので省略 */ 18 | { input: ["editmode", "newboard,5,5"] }, 19 | { 20 | input: [ 21 | "cursor,1,-1", 22 | "key,-", 23 | "key,right", 24 | "key,0", 25 | "key,right", 26 | "key,1", 27 | "key,right", 28 | "key,2", 29 | "key,right", 30 | "key,1", 31 | "key,0" 32 | ], 33 | result: 34 | "pzprv3/box/5/5/. 0 0 1 2 10 /0 . . . . . /0 . . . . . /0 . . . . . /0 . . . . . /0 . . . . . /" 35 | }, 36 | { 37 | input: [ 38 | "cursor,1,-1", 39 | "key,-", 40 | "key,right", 41 | "key,-", 42 | "key,right", 43 | "key,-", 44 | "key,-" 45 | ], 46 | result: 47 | "pzprv3/box/5/5/. 0 0 0 2 10 /0 . . . . . /0 . . . . . /0 . . . . . /0 . . . . . /0 . . . . . /" 48 | }, 49 | { input: ["newboard,6,6"] }, 50 | { 51 | input: [ 52 | "cursor,0,0", 53 | "mouse,leftx2, -1,-1", 54 | "mouse,leftx2, 1,-1", 55 | "mouse,leftx3, 3,-1", 56 | "mouse,leftx4, 5,-1", 57 | "mouse,leftx5, 7,-1", 58 | "mouse,leftx6, 9,-1", 59 | "mouse,rightx2, 11,-1" 60 | ], 61 | result: 62 | "pzprv3/box/6/6/. 1 2 3 4 5 21 /0 . . . . . . /0 . . . . . . /0 . . . . . . /0 . . . . . . /0 . . . . . . /0 . . . . . . /" 63 | } 64 | ] 65 | }); 66 | -------------------------------------------------------------------------------- /test/script/canal.js: -------------------------------------------------------------------------------- 1 | /* canal.js */ 2 | 3 | ui.debug.addDebugData("canal", { 4 | url: "6/6/3i3h2z4h5i2", 5 | failcheck: [ 6 | [ 7 | "cs2x2", 8 | "pzprv3/canal/6/6/3 . . . 3 . /. 2 . . . . /. . . . . . /. . . . . . /. . . . 4 . /. 5 . . . 2 /. # # # . . /. . # . . . /# . # . # . /# # # # # # /# # . # . # /# . # # . . /" 9 | ], 10 | [ 11 | "nmShadeViewNe", 12 | "pzprv3/canal/6/6/3 . . . 3 . /. 2 . . . . /. . . . . . /. . . . . . /. . . . 4 . /. 5 . . . 2 /. # # # . # /. . # . . # /. . # . # # /. # # # # . /# # . # . . /# . . # # . /" 13 | ], 14 | [ 15 | "csDivide", 16 | "pzprv3/canal/6/6/3 . . . 3 . /. 2 . . . . /. . . . . . /. . . . . . /. . . . 4 . /. 5 . . . 2 /. # # # . . /. . # . . . /. . . . # . /. # . . # # /# # . # . # /# . # # . . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/canal/6/6/3 . . . 3 . /. 2 . . . . /. . . . . . /. . . . . . /. . . . 4 . /. 5 . . . 2 /. # # # . + /+ . # + + + /+ + # + # + /+ # # # # # /# # + # . # /# . # # + . /" 21 | ] 22 | ], 23 | inputs: [] 24 | }); 25 | -------------------------------------------------------------------------------- /test/script/cbanana.js: -------------------------------------------------------------------------------- 1 | /* canal.js */ 2 | 3 | ui.debug.addDebugData("cbanana", { 4 | url: "5/5/g13t6h6i1", 5 | failcheck: [ 6 | [ 7 | "csNotRect", 8 | "pzprv3/cbanana/5/5/. 1 3 . . /. . . . . /. . . . . /. . 6 . . /6 . . . 1 /+ # + + # /+ + # + # /# + + # + /# # # + + /# # + + # /" 9 | ], 10 | [ 11 | "cuRect", 12 | "pzprv3/cbanana/5/5/. 1 3 . . /. . . . . /. . . . . /. . 6 . . /6 . . . 1 /+ # + + + /+ + # # # /+ + + + + /# # # + + /# # # + # /" 13 | ], 14 | [ 15 | "bkSizeNe", 16 | "pzprv3/cbanana/5/5/. 1 3 . . /. . . . . /. . . . . /. . 6 . . /6 . . . 1 /# # + + # /+ + # + # /+ # + # + /+ # + + + /+ + # + # /" 17 | ], 18 | [ 19 | "bkSizeNe", 20 | "pzprv3/cbanana/5/5/. 1 3 . . /. . . . . /. . . . . /. . 6 . . /6 . . . 1 /+ # + + + /+ + # + # /+ + + # + /# # # + + /# # # + # /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/cbanana/5/5/. 1 3 . . /. . . . . /. . . . . /. . 6 . . /6 . . . 1 /+ # + + # /+ + # + # /+ + + # + /# # # + + /# # # + # /" 25 | ] 26 | ], 27 | inputs: [] 28 | }); 29 | -------------------------------------------------------------------------------- /test/script/chainedb.js: -------------------------------------------------------------------------------- 1 | /* chainedb.js */ 2 | 3 | ui.debug.addDebugData("chainedb", { 4 | url: "6/6/k.g1s3j3g1m", 5 | failcheck: [ 6 | [ 7 | "bkNumGe2", 8 | "pzprv3/chainedb/6/6/. . . . . - /. 1 . . . . /. . . . . . /. . # 3 . . /. . 3 . 1 . /. . . . . . /" 9 | ], 10 | [ 11 | "bkNoNum", 12 | "pzprv3/chainedb/6/6/. . # # . - /. 1 . . . # /. . . # # . /. . . 3 . . /# # 3 . 1 . /. . . . . . /" 13 | ], 14 | [ 15 | "bkSizeNe", 16 | "pzprv3/chainedb/6/6/. . # # # - /. 1 . . . . /. . . # # . /. # . 3 . . /. # 3 . 1 . /. # . . . . /" 17 | ], 18 | [ 19 | "bkNoChain", 20 | "pzprv3/chainedb/6/6/. . . . . - /. 1 . . . # /. . . # # . /. . . 3 . . /# # 3 . 1 . /. . . . . . /" 21 | ], 22 | [ 23 | "bsSameShape", 24 | "pzprv3/chainedb/6/6/. . . . . - /. 1 . . . . /. . . # # . /. # . 3 . . /. # 3 . 1 . /. . . . . . /" 25 | ], 26 | [ 27 | "bsSameShape", 28 | "pzprv3/chainedb/6/6/. . # # # - /. 1 . . . # /. . . # # . /. . . 3 . . /# # 3 . 1 . /. . . . . . /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/chainedb/6/6/+ + # # # - /+ 1 + + + + /+ + + # # + /+ + + 3 + + /# # 3 + 1 + /+ + + + + + /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/chocona.js: -------------------------------------------------------------------------------- 1 | /* chocona.js */ 2 | 3 | ui.debug.addDebugData("chocona", { 4 | url: "6/6/8guumlfvo1eq33122g21g32", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/chocona/6/6"], 7 | [ 8 | "csNotRect", 9 | "pzprv3/chocona/6/6/11/0 0 1 1 1 1 /0 2 2 2 2 2 /3 4 5 6 7 7 /3 4 5 6 7 7 /3 5 5 8 9 9 /3 10 10 8 8 9 /3 . 3 . . . /. 1 . . . . /2 2 . 2 1 . /. . . . . . /. . . . 3 . /. 2 . . . . /# # . . . . /# # # # # # /. . . . . . /. . . . . . /. . . . . . /. . . . . . /" 10 | ], 11 | [ 12 | "bkShadeNe", 13 | "pzprv3/chocona/6/6/11/0 0 1 1 1 1 /0 2 2 2 2 2 /3 4 5 6 7 7 /3 4 5 6 7 7 /3 5 5 8 9 9 /3 10 10 8 8 9 /3 . 3 . . . /. 1 . . . . /2 2 . 2 1 . /. . . . . . /. . . . 3 . /. 2 . . . . /# # . # # # /# # . # # # /. . . . . . /. . . . . . /. . . . . . /. . . . . . /" 14 | ], 15 | [ 16 | null, 17 | "pzprv3/chocona/6/6/11/0 0 1 1 1 1 /0 2 2 2 2 2 /3 4 5 6 7 7 /3 4 5 6 7 7 /3 5 5 8 9 9 /3 10 10 8 8 9 /3 . 3 . . . /. 1 . . . . /2 2 . 2 1 . /. . . . . . /. . . . 3 . /. 2 . . . . /# # + # # # /# # + + + + /# # + # + # /# # + # + + /. . + + # # /. # # + # # /" 18 | ] 19 | ], 20 | inputs: [] /* shimaguniと同じなので省略 */ 21 | }); 22 | -------------------------------------------------------------------------------- /test/script/circlesquare.js: -------------------------------------------------------------------------------- 1 | /* cirlesquare.js */ 2 | 3 | ui.debug.addDebugData("circlesquare", { 4 | url: "5/5/0799i8010", 5 | failcheck: [ 6 | [ 7 | "circleUnshade", 8 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /. . . . . /. . . . . /. . # . . /. # # . . /. . . . . /" 9 | ], 10 | [ 11 | "circleShade", 12 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /. . . . # /# . . . . /. . # . . /. # # . . /. . . . . /" 13 | ], 14 | [ 15 | "cs2x2", 16 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /+ + # # # /+ + # . + /. # # . . /. # # . . /. . . + . /" 17 | ], 18 | [ 19 | "csDivide", 20 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /# # + # # /+ + # # + /+ + # . . /# # # . . /. . . + . /" 21 | ], 22 | [ 23 | "cuNotSquare", 24 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /# # # # # /+ + # + + /+ + # + + /+ # # # # /# # + + # /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/circlesquare/5/5/. . . . 2 /1 1 . . 1 /. . 2 . . /. 2 2 . . /. . . 1 . /# # # # # /+ + # + + /+ + # + + /# # # # # /# + # + # /" 29 | ] 30 | ], 31 | inputs: [] 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/coffeemilk.js: -------------------------------------------------------------------------------- 1 | /* coffeemilk.js */ 2 | 3 | ui.debug.addDebugData("coffeemilk", { 4 | url: "4/4/11a2d.a2a21a./", 5 | failcheck: [ 6 | [ 7 | "brNoLine", 8 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /0 0 0 /0 0 0 /0 0 0 /0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /", 9 | { skiprules: true } 10 | ], 11 | [ 12 | "nmNoLine", 13 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /0 0 0 /0 0 0 /0 0 0 /0 1 1 /0 0 0 1 /0 0 0 1 /0 0 0 1 /" 14 | ], 15 | [ 16 | "lnCross", 17 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /0 0 0 /0 0 0 /1 1 0 /0 0 0 /0 1 0 0 /0 1 0 0 /0 1 0 0 /" 18 | ], 19 | [ 20 | "lcInvalid", 21 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /1 1 1 /0 0 0 /0 0 0 /0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /" 22 | ], 23 | [ 24 | "lcGrayGt", 25 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /1 0 0 /0 0 0 /0 0 0 /0 1 1 /1 1 0 0 /1 1 0 0 /0 1 0 0 /" 26 | ], 27 | [ 28 | "lcBalance", 29 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /0 0 0 /0 0 0 /1 1 0 /0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /" 30 | ], 31 | [ 32 | null, 33 | "pzprv3/coffeemilk/4/4/1 1 . 2 /. . . . /- . 2 . /2 1 . - /1 0 0 /0 0 0 /1 1 0 /0 1 1 /1 0 0 1 /1 0 0 1 /1 0 0 1 /" 34 | ] 35 | ], 36 | inputs: [] 37 | }); 38 | -------------------------------------------------------------------------------- /test/script/cojun.js: -------------------------------------------------------------------------------- 1 | /* cojun.js */ 2 | 3 | ui.debug.addDebugData("cojun", { 4 | url: "4/4/pd0hsoh3p3h", 5 | failcheck: [ 6 | [ 7 | "bkDupNum", 8 | "pzprv3/cojun/4/4/1 1 0 /0 1 0 /1 1 0 /1 0 0 /1 0 0 0 /1 1 1 1 /0 0 1 1 /. . 3 . /. . . . /. . . . /. 3 . . /. . . . /. . . 3 /. . . . /. . . . /" 9 | ], 10 | [ 11 | "nmAdjacent", 12 | "pzprv3/cojun/4/4/1 1 0 /0 1 0 /1 1 0 /1 0 0 /1 0 0 0 /1 1 1 1 /0 0 1 1 /. . 3 . /. . . . /. . . . /. 3 . . /. 3 . . /. . . . /. . . . /. . . . /" 13 | ], 14 | [ 15 | "bkSmallOnBig", 16 | "pzprv3/cojun/4/4/1 1 0 /0 1 0 /1 1 0 /1 0 0 /1 0 0 0 /1 1 1 1 /0 0 1 1 /. . 3 . /. . . . /. . . . /. 3 . . /1 2 . . /3 1 4 . /. . . . /. . . . /" 17 | ], 18 | [ 19 | "ceNoNum", 20 | "pzprv3/cojun/4/4/1 1 0 /0 1 0 /1 1 0 /1 0 0 /1 0 0 0 /1 1 1 1 /0 0 1 1 /. . 3 . /. . . . /. . . . /. 3 . . /1 2 . 4 /3 1 2 1 /. . 1 2 /. . 2 1 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/cojun/4/4/1 1 0 /0 1 0 /1 1 0 /1 0 0 /1 0 0 0 /1 1 1 1 /0 0 1 1 /. . 3 . /. . . . /. . . . /. 3 . . /1 2 . 4 /3 1 2 1 /2 4 1 2 /1 . 2 1 /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力, 回答入力はrippleと同じなので省略 */ 29 | ] 30 | }); 31 | -------------------------------------------------------------------------------- /test/script/coral.js: -------------------------------------------------------------------------------- 1 | /* coral.js */ 2 | 3 | ui.debug.addDebugData("coral", { 4 | url: "5/5/11g11g5k3h3h31j3h2h", 5 | failcheck: [ 6 | [ 7 | "exNoMatch", 8 | "pzprv3/coral/5/5/. . . . . . . . /. . . 1 1 . . . /. . . 1 1 5 . 3 /. . 3 . . # # # /. 1 3 . # # . # /. . . . . # . # /. . 3 # # # . . /. . 2 . . # # . /" 9 | ], 10 | [ 11 | "cs2x2", 12 | "pzprv3/coral/5/5/. . . . . . . . /. . . 1 1 . . . /. . . 1 1 5 . 3 /. . 3 # # # . . /. 1 3 # . # # # /. . . . . # . . /. . 3 . # # # . /. . 2 . # # . . /" 13 | ], 14 | [ 15 | "csDivide", 16 | "pzprv3/coral/5/5/. . . . . . . . /. . . 1 1 2 1 . /. . . 1 1 2 1 3 /. . 3 . . # # # /. 1 3 # # # . # /. . 1 . . . . # /. . 3 # # # . . /. . 2 . . # # . /" 17 | ], 18 | [ 19 | "cuConnOut", 20 | "pzprv3/coral/5/5/. . . . . . . . /. . . 1 1 . . . /. . . 1 1 5 . 3 /. . 3 # # # . . /. 1 3 # . # # # /. . . # . # . . /. . 3 # # # . . /. . 2 . . # # . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/coral/5/5/. . . . . . . . /. . . 1 1 . . . /. . . 1 1 5 . 3 /. . 3 . . # # # /. 1 3 # # # . # /. . . . . # . # /. . 3 # # # . . /. . 2 . . # # . /" 25 | ] 26 | ], 27 | inputs: [] 28 | }); 29 | -------------------------------------------------------------------------------- /test/script/cts.js: -------------------------------------------------------------------------------- 1 | /* cts.js */ 2 | 3 | ui.debug.addDebugData("cts", { 4 | url: "5/5/03g21g.2g1h4h3h01g12g.h1h", 5 | failcheck: [ 6 | [ 7 | "cs2x2", 8 | "pzprv3/cts/5/5/. . . . . . . . /. . . 3 1 2 . . /. . . 0 2 -2 1 4 /. . 3 # # # . . /. 1 0 # . # # # /. 2 1 # # . . # /. . -2 # # # . # /. . 1 . . . . . /" 9 | ], 10 | [ 11 | "csDivide", 12 | "pzprv3/cts/5/5/. . . . . . . . /. . . 3 1 2 . . /. . . 0 2 -2 0 0 /. . 3 # # # . . /. 1 0 # . # # # /. 2 1 # # . . # /. . -2 . # # # # /. . 1 # . . . . /" 13 | ], 14 | [ 15 | "exNoMatch", 16 | "pzprv3/cts/5/5/. . . . . . . . /. . . 3 1 2 . . /. . . 0 2 -2 1 4 /. . 3 # # # . . /. 1 0 # . # # # /. 2 1 # # . . # /. . -2 . # # . # /. . 1 . . . . # /" 17 | ], 18 | [ 19 | "exNoMatch", 20 | "pzprv3/cts/5/5/. . . . . . . . /. . . 3 1 2 . . /. . . 0 2 -2 1 4 /. . 3 # # # . . /. 1 0 . . # # # /. 2 1 # # . . # /. . -2 . # # # # /. . 1 . . # . . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/cts/5/5/. . . . . . . . /. . . 3 1 2 . . /. . . 0 2 -2 1 4 /. . 3 # # # . . /. 1 0 # . # . # /. 2 1 # # . . # /. . -2 . # # # # /. . 1 . . . . # /" 25 | ] 26 | ], 27 | inputs: [ 28 | { 29 | label: "Keyboard inputs", 30 | input: [ 31 | "editmode", 32 | "newboard,3,3", 33 | "cursor,1,-1", 34 | "key,1,up,shift+8,right,-,down,2,left,3" 35 | ], 36 | result: 37 | "pzprv3/cts/3/3/. . 0 -2 . /. . 3 2 . /. . . . . /. . . . . /. . . . . /" 38 | }, 39 | { 40 | label: "Completion inputs", 41 | input: [ 42 | "newboard,3,1", 43 | "editmode,number", 44 | "mouse,rightx2,-1,1", 45 | "playmode", 46 | "mouse,left,-1,1", 47 | "mouse,left,3,-1" 48 | ], 49 | result: "pzprv3/cts/1/3/. . . . . /. c3 . . . /" 50 | } 51 | ] 52 | }); 53 | -------------------------------------------------------------------------------- /test/script/curvedata-aux.js: -------------------------------------------------------------------------------- 1 | /* curvedata-aux.js */ 2 | 3 | ui.debug.addDebugData("curvedata-aux", { 4 | url: "4/4/3/2/921", 5 | failcheck: [[null, "pzprv3/curvedata-aux/4/4/3/2/921"]], 6 | inputs: [ 7 | { 8 | input: ["newboard,4,4", "playmode"], 9 | result: "pzprv3/curvedata-aux/4/4/0/0/" 10 | }, 11 | { 12 | input: ["mouse,left, 1,1, 1,3, 1,5"], 13 | result: "pzprv3/curvedata-aux/4/4/1/3/a/" 14 | }, 15 | { 16 | input: ["mouse,left, 7,5, 5,5, 5,7"], 17 | result: "pzprv3/curvedata-aux/4/4/4/4/20200300/" 18 | }, 19 | { 20 | input: [ 21 | "playmode,slide", 22 | "mouse,left, 1,3, 3,3" 23 | ] /* Slide the left-most shape 1 to the right */, 24 | result: "pzprv3/curvedata-aux/4/4/3/4/280c00/" 25 | }, 26 | { 27 | input: [ 28 | "playmode,slide", 29 | "mouse,left, 3,3, 5,3" 30 | ] /* Attempt to slide into an occupied space */, 31 | result: "pzprv3/curvedata-aux/4/4/3/4/280c00/" 32 | } 33 | ] 34 | }); 35 | -------------------------------------------------------------------------------- /test/script/dominion.js: -------------------------------------------------------------------------------- 1 | /* dominion.js */ 2 | 3 | ui.debug.addDebugData("dominion", { 4 | url: "5/5/h2l2g3k1h1i2", 5 | failcheck: [ 6 | [ 7 | "csGt2", 8 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /. . . . . /. . . . . /. . . # . /. . . # . /. . . # . /" 9 | ], 10 | [ 11 | "csLt2", 12 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /# . . . . /. # . . . /. . # . . /# # . # . /. . . # . /" 13 | ], 14 | [ 15 | "bkPlNum", 16 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /# # . . . /. . # . . /. . # . . /. . . # . /. . . # . /" 17 | ], 18 | [ 19 | "bkSepNum", 20 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /# # . # # /. . # . . /. . # . . /# # . # . /. . . # . /" 21 | ], 22 | [ 23 | "bkNoNum", 24 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /. # . . . /. # . . . /# . . . . /# . . . . /. . . . . /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/dominion/5/5/. . 2 . . /. . . . 2 /. 3 . . . /. . 1 . . /1 . . . 2 /# # + + + /+ + # + + /+ + # + + /# # + # + /+ + + # + /" 29 | ] 30 | ], 31 | inputs: [] 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/fillmat.js: -------------------------------------------------------------------------------- 1 | /* fillmat.js */ 2 | 3 | ui.debug.addDebugData("fillmat", { 4 | url: "5/5/3b3h1h1b4", 5 | failcheck: [ 6 | [ 7 | "bdCross", 8 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /0 1 0 0 /0 1 0 0 /0 1 0 0 /0 1 0 0 /0 1 0 0 /0 0 0 0 0 /1 1 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bsSizeEq", 12 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /0 0 1 1 /0 0 1 1 /0 0 1 1 /0 0 0 0 /0 0 0 0 /1 1 1 0 0 /0 0 0 0 0 /0 0 0 1 0 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | "bkLenGt4", 16 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 17 | ], 18 | [ 19 | "bkNumGe2", 20 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /0 0 0 1 /0 0 1 0 /1 0 0 0 /0 1 0 0 /0 0 0 1 /1 1 1 1 1 /1 1 1 1 1 /1 1 1 1 1 /1 1 1 1 1 /" 21 | ], 22 | [ 23 | "bkSizeNe", 24 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /0 1 0 0 /0 0 0 1 /0 -1 2 -1 /1 0 -1 -1 /-1 -1 2 0 /1 1 1 1 1 /1 1 1 1 1 /1 1 1 1 1 /1 1 1 1 1 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/fillmat/5/5/3 . . 3 . /. . . . . /. . 1 . . /. . . . . /. 1 . . 4 /1 1 0 0 /1 1 0 1 /1 1 1 1 /1 1 1 1 /1 1 1 1 /0 -1 1 1 1 /0 -1 1 1 -1 /1 -1 1 -1 -1 /0 1 -1 0 -1 /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 問題入力, 回答入力はshikaku等と同じなので省略 */ 33 | ] 34 | }); 35 | -------------------------------------------------------------------------------- /test/script/fourcells.js: -------------------------------------------------------------------------------- 1 | /* fourcells.js */ 2 | 3 | ui.debug.addDebugData("fourcells", { 4 | url: "6/6/b1d2a3e3d1f2b2a3b2", 5 | failcheck: [ 6 | [ 7 | "bkSizeLt4", 8 | "pzprv3/fourcells/6/6/. . 1 . . . /. 2 . 3 . . /. . . 3 . . /. . 1 . . . /. . . 2 . . /2 . 3 . . 2 /1 0 0 0 0 /1 0 0 1 1 /0 0 0 1 1 /0 0 0 0 0 /1 0 1 0 0 /0 0 0 0 0 /0 0 0 0 1 0 /1 0 0 0 0 0 /0 0 0 0 1 0 /0 1 1 0 0 0 /0 1 1 0 0 0 /" 9 | ], 10 | [ 11 | "nmBorderNe", 12 | "pzprv3/fourcells/6/6/. . 1 . . . /. 2 . 3 . . /. . . 3 . . /. . 1 . . . /. . . 2 . . /2 . 3 . . 2 /1 -1 -1 1 0 /-1 1 1 0 0 /1 1 0 0 0 /0 0 1 0 0 /1 0 0 0 0 /-1 0 1 0 0 /-1 1 -1 1 0 0 /1 -1 1 0 0 0 /-1 1 1 0 0 0 /1 1 1 0 0 0 /-1 1 1 0 0 0 /" 13 | ], 14 | [ 15 | "bdDeadEnd", 16 | "pzprv3/fourcells/6/6/. . 1 . . . /. 2 . 3 . . /. . . 3 . . /. . 1 . . . /. . . 2 . . /2 . 3 . . 2 /1 -1 -1 1 0 /-1 1 1 0 0 /1 1 1 0 0 /0 1 0 1 0 /1 1 1 0 0 /-1 0 1 0 0 /-1 1 -1 1 0 0 /1 -1 1 1 1 0 /-1 1 0 1 0 0 /1 0 0 1 0 0 /-1 1 1 0 0 0 /" 17 | ], 18 | [ 19 | "bkSizeGt4", 20 | "pzprv3/fourcells/6/6/. . 1 . . . /. 2 . 3 . . /. . . 3 . . /. . 1 . . . /. . . 2 . . /2 . 3 . . 2 /1 -1 -1 1 0 /-1 1 1 0 1 /1 1 1 0 0 /0 1 0 1 0 /1 1 1 0 0 /-1 0 1 0 0 /-1 1 -1 1 0 1 /1 -1 1 1 1 0 /-1 1 0 1 0 0 /1 0 0 1 0 0 /-1 1 1 0 0 0 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/fourcells/6/6/. . 1 . . . /. 2 . 3 . . /. . . 3 . . /. . 1 . . . /. . . 2 . . /2 . 3 . . 2 /1 -1 -1 1 0 /-1 1 1 0 1 /1 1 1 0 0 /0 1 0 1 1 /1 1 1 -1 1 /-1 0 1 1 0 /-1 1 -1 1 0 1 /1 -1 1 1 1 0 /-1 1 0 1 1 1 /1 0 0 1 0 0 /-1 1 1 -1 1 0 /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力, 回答入力はfivecellsと同じなので省略 */ 29 | ] 30 | }); 31 | -------------------------------------------------------------------------------- /test/script/goishi.js: -------------------------------------------------------------------------------- 1 | /* goishi.js */ 2 | 3 | ui.debug.addDebugData("goishi", { 4 | url: "6/7/vsten1tvo", 5 | failcheck: [ 6 | ["brNoStone", "pzprv3/goishi/7/6"], 7 | [ 8 | "goishiRemains", 9 | "pzprv3/goishi/7/6/. . . . . . /. . 0 0 . . /. 5 . 4 . . /. 0 . 3 . . /. 0 0 2 1 . /. . . 0 . . /. . . . . . /" 10 | ], 11 | [ 12 | null, 13 | "pzprv3/goishi/7/6/. . . . . . /. . 9 10 . . /. 5 . 4 . . /. 6 . 3 . . /. 7 8 2 1 . /. . . 11 . . /. . . . . . /" 14 | ] 15 | ], 16 | inputs: [ 17 | /* 問題入力テスト */ 18 | { input: ["newboard,4,4", "editmode"] }, 19 | { 20 | input: ["cursor,3,3", "key,q", "key,right,q,q"], 21 | result: "pzprv3/goishi/4/4/. . . . /. 0 . . /. . . . /. . . . /" 22 | }, 23 | { 24 | input: [ 25 | "cursor,3,5", 26 | "mouse,left, 3,5", 27 | "mouse,left, 5,5", 28 | "mouse,leftx2, 7,5" 29 | ], 30 | result: "pzprv3/goishi/4/4/. . . . /. 0 . . /. 0 0 . /. . . . /" 31 | }, 32 | /* 回答入力テスト */ 33 | { 34 | input: ["playmode", "mouse,left, 1,1"], 35 | result: "pzprv3/goishi/4/4/. . . . /. 0 . . /. 0 0 . /. . . . /" 36 | }, 37 | { 38 | input: ["mouse,left, 3,3", "mouse,left, 5,5", "mouse,left, 3,5"], 39 | result: "pzprv3/goishi/4/4/. . . . /. 1 . . /. 2 0 . /. . . . /" 40 | } 41 | ] 42 | }); 43 | -------------------------------------------------------------------------------- /test/script/gokigen.js: -------------------------------------------------------------------------------- 1 | /* gokigen.js */ 2 | 3 | ui.debug.addDebugData("gokigen", { 4 | url: "4/4/iaegcgcj6a", 5 | failcheck: [ 6 | [ 7 | "slLoop", 8 | "pzprv3/gokigen/4/4/. . . 0 . /. 4 . . . /2 . . . 2 /. . . . . /. 1 . 0 . /. 2 1 . /2 . . 1 /1 . . 2 /. 1 2 . /" 9 | ], 10 | [ 11 | "crConnSlNe", 12 | "pzprv3/gokigen/4/4/. . . 0 . /. 4 . . . /2 . . . 2 /. . . . . /. 1 . 0 . /. 2 1 . /2 . . 1 /1 . . 2 /. . 2 . /" 13 | ], 14 | [ 15 | "ceNoSlash", 16 | "pzprv3/gokigen/4/4/. . . 0 . /. 4 . . . /2 . . . 2 /. . . . . /. 1 . 0 . /1 2 1 2 /2 1 . 1 /1 . . 2 /. 2 2 1 /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/gokigen/4/4/. . . 0 . /. 4 . . . /2 . . . 2 /. . . . . /. 1 . 0 . /1 2 1 2 /2 1 1 1 /1 1 2 2 /2 2 2 1 /" 21 | ] 22 | ], 23 | inputs: [ 24 | /* 問題入力はcreekでやっているので省略 */ 25 | /* 回答入力テスト */ 26 | { input: ["newboard,3,2", "playmode", "setconfig,use,1", "ansclear"] }, 27 | { 28 | input: [ 29 | "mouse,left, 1,1", 30 | "mouse,leftx2, 3,1", 31 | "mouse,leftx3, 5,1", 32 | "mouse,right, 1,3", 33 | "mouse,rightx2, 3,3", 34 | "mouse,rightx3, 5,3" 35 | ], 36 | result: "pzprv3/gokigen/2/3/. . . . /. . . . /. . . . /1 . 1 /2 . 2 /" 37 | }, 38 | { input: ["newboard,3,2", "playmode", "setconfig,use,2", "ansclear"] }, 39 | { 40 | input: [ 41 | "mouse,left, 1,1", 42 | "mouse,leftx2, 3,1", 43 | "mouse,leftx3, 5,1", 44 | "mouse,right, 1,3", 45 | "mouse,rightx2, 3,3", 46 | "mouse,rightx3, 5,3" 47 | ], 48 | result: "pzprv3/gokigen/2/3/. . . . /. . . . /. . . . /1 2 . /2 1 . /" 49 | }, 50 | { input: ["newboard,3,2", "playmode"] }, 51 | { 52 | input: ["mouse,left, 1,1, 4,4", "mouse,left, 1,3, 4,0, 5,1"], 53 | result: "pzprv3/gokigen/2/3/. . . . /. . . . /. . . . /1 2 1 /2 1 . /" 54 | }, 55 | { 56 | input: ["mouse,left, 0,4, 2,2, 1.9,4, 4,0"], 57 | result: "pzprv3/gokigen/2/3/. . . . /. . . . /. . . . /1 . 1 /. 1 . /" 58 | } 59 | ] 60 | }); 61 | -------------------------------------------------------------------------------- /test/script/heteromino.js: -------------------------------------------------------------------------------- 1 | /* heteromino.js */ 2 | 3 | ui.debug.addDebugData("heteromino", { 4 | url: "5/5/d7b7a7b7b77c7d", 5 | failcheck: [ 6 | [ 7 | "bkSizeGt3", 8 | "pzprv3/heteromino/5/5/. . . . * /. . * . * /. . * . . /* * . . . /* . . . . /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 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 /0 0 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkSizeLt3", 12 | "pzprv3/heteromino/5/5/. . . . * /. . * . * /. . * . . /* * . . . /* . . . . /0 0 1 0 0 0 /0 0 0 0 0 0 /0 0 0 0 1 0 /0 0 0 0 1 0 /0 0 0 0 1 0 /0 0 0 0 0 /1 1 0 0 0 /1 1 0 1 0 /0 0 0 0 0 /0 0 1 1 0 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | "bkSameTouch", 16 | "pzprv3/heteromino/5/5/. . . . * /. . * . * /. . * . . /* * . . . /* . . . . /0 0 1 0 0 0 /0 1 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 0 0 /1 0 0 0 0 /0 1 0 1 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/heteromino/5/5/. . . . * /. . * . * /. . * . . /* * . . . /* . . . . /0 0 1 0 0 0 /0 1 0 0 0 0 /0 0 0 0 1 0 /0 0 0 0 1 0 /0 0 0 0 1 0 /0 0 0 0 0 /-1 1 0 0 0 /1 0 0 1 0 /0 0 0 -1 0 /0 0 1 1 0 /0 0 0 0 0 /" 21 | ] 22 | ], 23 | inputs: [ 24 | { 25 | input: [ 26 | "newboard,3,2", 27 | "editmode", 28 | "mouse,left, 1,1", 29 | "mouse,left, 3,1", 30 | "mouse,left, 1,3" 31 | ], 32 | result: 33 | "pzprv3/heteromino/2/3/* * . /* . . /0 0 0 0 /0 0 0 0 /0 0 0 /0 0 0 /0 0 0 /" 34 | }, 35 | { 36 | input: [ 37 | "playmode", 38 | "mouse,left, 0,0 0,2", 39 | "mouse,left, 2,0, 2,2", 40 | "mouse,left, 4,0, 4,2", 41 | "mouse,left, 6,0, 6,2", 42 | "mouse,left, 4,2, 4,4" 43 | ], 44 | result: 45 | "pzprv3/heteromino/2/3/* * . /* . . /0 0 0 0 /0 0 1 0 /0 0 0 /0 0 0 /0 0 0 /" 46 | } 47 | ] 48 | }); 49 | -------------------------------------------------------------------------------- /test/script/ichimagax.js: -------------------------------------------------------------------------------- 1 | /* ichimagax.js */ 2 | 3 | ui.debug.addDebugData("ichimagax", { 4 | url: "5/5/g8dgddgbbg6b", 5 | failcheck: [ 6 | ["brNoLine", "pzprv3/ichimagax/5/5/cross"], 7 | [ 8 | "lnBranch", 9 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 0 0 /1 1 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /1 1 1 0 0 /1 0 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 10 | ], 11 | [ 12 | "lcCurveGt1", 13 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 0 0 /0 1 1 0 /1 0 0 0 /0 1 0 0 /0 0 0 0 /1 1 1 0 0 /1 0 1 0 0 /0 1 0 0 0 /0 0 0 0 0 /" 14 | ], 15 | [ 16 | "lcDivided", 17 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 0 0 /0 1 0 0 /1 0 0 0 /0 0 0 0 /0 0 0 1 /1 1 1 0 0 /1 0 1 0 0 /1 0 1 0 1 /0 0 0 0 1 /" 18 | ], 19 | [ 20 | "lcDeadEnd", 21 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 1 1 /0 0 0 0 /1 1 0 0 /0 0 1 0 /1 0 0 0 /1 1 0 1 1 /1 0 0 1 1 /1 0 1 1 0 /1 0 0 0 0 /" 22 | ], 23 | [ 24 | "nmLineNe", 25 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 1 0 /0 1 1 1 /1 1 1 0 /0 0 0 0 /1 0 0 0 /1 1 0 0 0 /1 0 1 0 1 /1 0 1 1 0 /1 0 0 1 0 /" 26 | ], 27 | [ 28 | "nmNoLine", 29 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . - /. 1 . 1 . /1 1 1 1 /0 1 1 0 /1 1 1 0 /0 0 0 0 /1 0 0 0 /1 1 0 1 1 /1 0 1 0 1 /1 0 1 1 0 /1 0 0 1 0 /" 30 | ], 31 | [ 32 | null, 33 | "pzprv3/ichimagax/5/5/cross/. 3 . 3 . /. . 3 . . /3 . . . 1 /. . 1 . . /. 1 . 1 . /1 1 1 1 /0 1 1 0 /1 1 1 0 /0 0 0 0 /1 0 0 0 /1 1 0 1 1 /1 0 1 0 1 /1 0 1 1 0 /1 0 0 1 0 /" 34 | ] 35 | ], 36 | inputs: [ 37 | /* 回答入力はfireflyと同じなので省略 */ 38 | /* 問題入力はichimagaと同じなので省略 */ 39 | ] 40 | }); 41 | -------------------------------------------------------------------------------- /test/script/invlitso.js: -------------------------------------------------------------------------------- 1 | /* invlitso.js */ 2 | 3 | ui.debug.addDebugData("invlitso", { 4 | url: "4/4/2tge80", 5 | failcheck: [ 6 | [ 7 | "bkShadeLt4", 8 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. . . . /. . . . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "cs2x2", 12 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. # # . /. # # . /. . . . /. . . . /" 13 | ], 14 | [ 15 | "bkShadeGt4", 16 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. . # # /. . . # /. . . # /. . . . /" 17 | ], 18 | [ 19 | "bkShadeDivide", 20 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /# # . . /# . . . /. . . . /. . . . /" 21 | ], 22 | [ 23 | "bsSameShape", 24 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. . . . /. . . . /. . # . /. . . . /" 25 | ], 26 | [ 27 | "csDivide", 28 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. . . . /# . . . /# . . . /# . . # /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/invlitso/4/4/3/0 0 0 0 /0 1 1 2 /0 1 2 2 /0 1 2 2 /. # # # /. . . # /. . . . /. . . . /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/island.js: -------------------------------------------------------------------------------- 1 | /* island.js */ 2 | 3 | ui.debug.addDebugData("island", { 4 | url: "5/5/1g6m2i3h4m", 5 | failcheck: [ 6 | [ 7 | "brNoShade", 8 | "pzprv3/island/5/5/1 . 6 . . /. . . . . /2 . . . 3 /. . 4 . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "nmSumSizeNe", 12 | "pzprv3/island/5/5/1 . 6 . . /. . . . . /2 . . . 3 /. . 4 . . /. . . . . /. # . # # /+ + # . . /. + # # . /# # . + + /. . . . + /" 13 | ], 14 | [ 15 | "csDivide", 16 | "pzprv3/island/5/5/1 . 6 . . /. . . . . /2 . . . 3 /. . 4 . . /. . . . . /. # . # # /+ + # + # /. + # + . /# . . + + /# + # # + /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/island/5/5/1 . 6 . . /. . . . . /2 . . . 3 /. . 4 . . /. . . . . /. # . # # /+ + # + # /. + # + . /# # . + + /+ + + + + /" 21 | ] 22 | ], 23 | inputs: [ 24 | { input: ["newboard,5,1", "editmode"] }, 25 | { 26 | input: [ 27 | "cursor,3,1", 28 | "key,1", 29 | "cursor,9,1", 30 | "key,1", 31 | "playmode", 32 | "mouse,left,1,1,5,1" 33 | ], 34 | result: "pzprv3/island/1/5/. 1 . . 1 /# . # . . /" 35 | }, 36 | { 37 | input: ["playmode,info-blk", "mouse,left,3,1"], 38 | result: function(puzzle, assert) { 39 | var bd = puzzle.board; 40 | assert.equal(bd.getc(1, 1).qinfo, 1); 41 | assert.equal(bd.getc(3, 1).qinfo, 1); 42 | assert.equal(bd.getc(5, 1).qinfo, 1); 43 | assert.equal(bd.getc(9, 1).qinfo, 0); 44 | } 45 | } 46 | ] 47 | }); 48 | -------------------------------------------------------------------------------- /test/script/juosan.js: -------------------------------------------------------------------------------- 1 | /* juosan.js */ 2 | 3 | ui.debug.addDebugData("juosan", { 4 | url: "5/5/8mdnvues132g213g22g", 5 | failcheck: [ 6 | [ 7 | "baParaGe3", 8 | "pzprv3/juosan/5/5/11/0 0 1 1 1 /2 2 3 3 4 /5 6 6 6 4 /5 7 7 8 4 /9 9 10 8 4 /1 . 3 . . /2 . . . 2 /1 3 . . . /. . . 2 . /2 . . . . /0 0 2 2 2 /0 0 2 2 0 /0 2 2 2 0 /0 0 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkMajorBarGt", 12 | "pzprv3/juosan/5/5/11/0 0 1 1 1 /2 2 3 3 4 /5 6 6 6 4 /5 7 7 8 4 /9 9 10 8 4 /1 . 3 . . /2 . . . 2 /1 3 . . . /. . . 2 . /2 . . . . /0 0 2 2 2 /0 0 1 1 0 /0 2 2 2 1 /0 0 0 0 1 /0 0 0 0 1 /" 13 | ], 14 | [ 15 | "bkMajorBarLt", 16 | "pzprv3/juosan/5/5/11/0 0 1 1 1 /2 2 3 3 4 /5 6 6 6 4 /5 7 7 8 4 /9 9 10 8 4 /1 . 3 . . /2 . . . 2 /1 3 . . . /. . . 2 . /2 . . . . /0 1 2 2 2 /0 2 1 1 2 /0 2 2 2 0 /0 1 0 0 0 /0 0 0 0 0 /" 17 | ], 18 | [ 19 | "ceNoBar", 20 | "pzprv3/juosan/5/5/11/0 0 1 1 1 /2 2 3 3 4 /5 6 6 6 4 /5 7 7 8 4 /9 9 10 8 4 /1 . 3 . . /2 . . . 2 /1 3 . . . /. . . 2 . /2 . . . . /2 1 2 2 2 /2 2 1 1 2 /1 2 2 2 0 /2 1 2 1 0 /2 2 1 1 2 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/juosan/5/5/11/0 0 1 1 1 /2 2 3 3 4 /5 6 6 6 4 /5 7 7 8 4 /9 9 10 8 4 /1 . 3 . . /2 . . . 2 /1 3 . . . /. . . 2 . /2 . . . . /2 1 2 2 2 /2 2 1 1 2 /1 2 2 2 1 /2 1 2 1 1 /2 2 1 1 2 /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力はなげなわと同じ */ 29 | /* 回答入力はタテボーヨコボーと同じ */ 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/kramma.js: -------------------------------------------------------------------------------- 1 | /* kramma.js */ 2 | 3 | ui.debug.addDebugData("kramma", { 4 | url: "c/5/5/9ock3ba9i", 5 | failcheck: [ 6 | [ 7 | "bkNoNum", 8 | "pzprv3/kramma/5/5/1 . . 2 2 /. 1 1 . 2 /. 2 . 1 . /1 . 2 1 . /1 1 . . 2 /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /1 0 1 0 /1 0 1 0 /1 0 1 0 /1 0 1 0 /1 0 1 0 /1 1 1 1 1 /1 1 1 1 1 /-1 -1 -1 -1 -1 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkPlNum", 12 | "pzprv3/kramma/5/5/1 . . 2 2 /. 1 1 . 2 /. 2 . 1 . /1 . 2 1 . /1 1 . . 2 /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /1 0 1 0 /1 0 1 0 /1 0 1 0 /1 0 1 0 /1 0 1 0 /0 0 0 0 0 /1 1 1 1 1 /-1 -1 -1 -1 -1 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | null, 16 | "pzprv3/kramma/5/5/1 . . 2 2 /. 1 1 . 2 /. 2 . 1 . /1 . 2 1 . /1 1 . . 2 /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /1 0 1 -1 /1 0 1 -1 /1 -1 1 -1 /1 -1 1 -1 /1 0 1 -1 /-1 -1 -1 -1 -1 /1 1 1 1 1 /-1 -1 -1 -1 -1 /1 1 1 1 1 /" 17 | ] 18 | ], 19 | inputs: [ 20 | /* 問題入力, 回答入力はkrammanと同じなので省略 */ 21 | ] 22 | }); 23 | -------------------------------------------------------------------------------- /test/script/kropki.js: -------------------------------------------------------------------------------- 1 | /* kropki.js */ 2 | 3 | ui.debug.addDebugData("kropki", { 4 | url: "4/4/aa7fioco", 5 | failcheck: [ 6 | [ 7 | "nmDupRow", 8 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 4 . . /. . . . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "nmSubNe1", 12 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 1 . . /. . . . /. . . . /. . . . /" 13 | ], 14 | [ 15 | "nmSubEq1", 16 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /1 . . . /2 . . . /4 . . . /3 . . . /" 17 | ], 18 | [ 19 | "nmDivNe2", 20 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 . . . /2 . . . /1 . . . /3 4 1 . /" 21 | ], 22 | [ 23 | "nmDivEq2", 24 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 3 . . /2 1 . . /1 . . . /3 .[2,4,,] 4 2 /" 25 | ], 26 | [ 27 | "ceNoNum", 28 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 3 1 2 /2 1 . . /1 . . . /3 .[2,4,,] . . /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/kropki/4/4/1 0 1 /1 0 1 /0 2 1 /1 2 0 /2 0 0 2 /2 0 1 1 /0 2 2 0 /4 3 1 2 /2 1 3 4 /1 4 2 3 /3 2 4 1 /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/kurodoko.js: -------------------------------------------------------------------------------- 1 | /* kurodoko.js */ 2 | 3 | ui.debug.addDebugData("kurodoko", { 4 | url: "5/5/i7g5l2l2g4i", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/kurodoko/5/5"], 7 | [ 8 | "csAdjacent", 9 | "pzprv3/kurodoko/5/5/. . . 7 . /5 . . . . /. . 2 . . /. . . . 2 /. 4 . . . /. . . . . /. . . . . /. . . . . /. . # . . /. . # . . /" 10 | ], 11 | [ 12 | "cuDivideRB", 13 | "pzprv3/kurodoko/5/5/. . . 7 . /5 . . . . /. . 2 . . /. . . . 2 /. 4 . . . /. # . . . /. . # . . /. # . . . /. . # . . /. . . # . /" 14 | ], 15 | [ 16 | "nmSumViewNe", 17 | "pzprv3/kurodoko/5/5/. . . 7 . /5 . . . . /. . 2 . . /. . . . 2 /. 4 . . . /# + + + . /+ + # + + /+ # + + # /+ + # + + /# + + + # /" 18 | ], 19 | [ 20 | null, 21 | "pzprv3/kurodoko/5/5/. . . 7 . /5 . . . . /. . 2 . . /. . . . 2 /. 4 . . . /+ # + + . /+ + # + + /+ # + + # /+ + # + + /# + + + # /" 22 | ] 23 | ], 24 | inputs: [] /* hitori, kurottoと同じなので省略 */ 25 | }); 26 | -------------------------------------------------------------------------------- /test/script/kuromenbun.js: -------------------------------------------------------------------------------- 1 | /* kuromenbun.js */ 2 | 3 | ui.debug.addDebugData("kuromenbun", { 4 | url: "4/4/0q0v282h2j0l5", 5 | failcheck: [ 6 | [ 7 | "bkNumGe2", 8 | "pzprv3/kuromenbun/4/4/0 0 0 /0 0 1 /1 0 1 /0 0 0 /1 1 1 1 /1 0 0 0 /1 0 0 1 /2 . . 2 /. . . . /0 . . . /. . . 5 /. . . . /. # # . /. . . # /. # . . /" 9 | ], 10 | [ 11 | "nmShadeGt", 12 | "pzprv3/kuromenbun/4/4/0 0 0 /0 0 1 /1 0 1 /0 0 0 /1 1 1 1 /1 0 0 0 /1 0 0 1 /2 . . 2 /. . . . /0 . . . /. . . 5 /. # # . /# . . # /. . . . /. # . . /" 13 | ], 14 | [ 15 | "nmShadeLt", 16 | "pzprv3/kuromenbun/4/4/0 0 0 /0 0 1 /1 0 1 /0 0 0 /1 1 1 1 /1 0 0 0 /1 0 0 1 /2 . . 2 /. . . . /0 . . . /. . . 5 /. . # . /. # . # /. . . . /. . . . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/kuromenbun/4/4/0 0 0 /0 0 1 /1 0 1 /0 0 0 /1 1 1 1 /1 0 0 0 /1 0 0 1 /2 . . 2 /. . . . /0 . . . /. . . 5 /+ + # + /+ # + # /+ + + # /+ # + + /" 21 | ] 22 | ], 23 | inputs: [ 24 | { 25 | input: [ 26 | "newboard,4,2", 27 | "editmode", 28 | "cursor,1,1", 29 | "mouse,right,1,1", 30 | "mouse,left, 0,2, 6,2, 6,0" 31 | ], 32 | result: 33 | "pzprv3/kuromenbun/2/4/0 0 1 /0 0 0 /1 1 1 0 /5 . . . /. . . . /. . . . /. . . . /" 34 | }, 35 | { 36 | input: [ 37 | "playmode", 38 | "mouse,left,5,3", 39 | "playmode,info-ublk", 40 | "mouse,left,1,3" 41 | ], 42 | result: function(puzzle, assert) { 43 | var bd = puzzle.board; 44 | assert.equal(bd.getc(3, 3).qinfo, 1); 45 | assert.equal(bd.getc(5, 3).qinfo, 2); 46 | assert.equal(bd.getc(7, 3).qinfo, 0); 47 | } 48 | }, 49 | { 50 | input: ["playmode,info-ublk", "mouse,left,5,3"], 51 | result: function(puzzle, assert) { 52 | var bd = puzzle.board; 53 | assert.equal(bd.getc(5, 3).qinfo, 0); 54 | assert.equal(bd.getc(5, 1).qinfo, 0); 55 | } 56 | } 57 | ] 58 | }); 59 | -------------------------------------------------------------------------------- /test/script/kurotto.js: -------------------------------------------------------------------------------- 1 | /* kurotto.js */ 2 | 3 | ui.debug.addDebugData("kurotto", { 4 | url: "5/5/30m4h6h4m02", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/kurotto/5/5"], 7 | [ 8 | "nmSumSizeNe", 9 | "pzprv3/kurotto/5/5/3 0 . . . /. . . . 4 /. . 6 . . /4 . . . . /. . . 0 2 /. . + . . /# + . . . /# # . + # /. + . + # /# + + . . /" 10 | ], 11 | [ 12 | null, 13 | "pzprv3/kurotto/5/5/3 0 . . . /. . . . 4 /. . 6 . . /4 . . . . /. . . 0 2 /. . + + + /# + # # . /# # . + # /. + # + # /# + + . . /" 14 | ] 15 | ], 16 | inputs: [ 17 | /* 回答入力はnurikabeと同じなので省略 */ 18 | { input: ["editmode", "newboard,5,1"] }, 19 | { 20 | input: [ 21 | "cursor,1,1", 22 | "key,-", 23 | "key,right", 24 | "key,0", 25 | "key,right", 26 | "key,1", 27 | "key,right", 28 | "key,2", 29 | "key,right", 30 | "key,3" 31 | ], 32 | result: "pzprv3/kurotto/1/5/- 0 1 2 3 /. . . . . /" 33 | }, 34 | { 35 | input: [ 36 | "cursor,1,1", 37 | "key,-", 38 | "key,right", 39 | "key,-", 40 | "key,right", 41 | "key,-", 42 | "key,-" 43 | ], 44 | result: "pzprv3/kurotto/1/5/. - . 2 3 /. . . . . /" 45 | }, 46 | { input: ["newboard,6,1"] }, 47 | { 48 | input: [ 49 | "cursor,0,0", 50 | "mouse,leftx2, 1,1", 51 | "mouse,leftx3, 3,1", 52 | "mouse,leftx4, 5,1", 53 | "mouse,leftx5, 7,1", 54 | "mouse,leftx6, 9,1", 55 | "mouse,rightx2, 11,1" 56 | ], 57 | result: "pzprv3/kurotto/1/6/- 0 1 2 3 5 /. . . . . . /" 58 | } 59 | ] 60 | }); 61 | -------------------------------------------------------------------------------- /test/script/lither.js: -------------------------------------------------------------------------------- 1 | /* lither.js */ 2 | 3 | ui.debug.addDebugData("lither", { 4 | url: "4/4/8a638d6c", 5 | failcheck: [ 6 | [ 7 | "brNoLine", 8 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /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 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 0 0 /0 0 0 0 /" 9 | ], 10 | [ 11 | "lnSnLine", 12 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 1 0 0 0 /0 1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /1 1 0 0 /1 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 13 | ], 14 | [ 15 | "lnNoBranchOrTerm", 16 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 1 0 0 0 /0 0 0 1 1 /1 1 0 1 1 /1 1 0 1 1 /1 1 0 1 /1 1 0 0 /0 0 1 1 /1 0 1 0 /0 0 0 0 /" 17 | ], 18 | [ 19 | "nmLineNe", 20 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 1 0 0 0 /0 0 0 1 1 /1 1 0 1 0 /1 1 0 1 0 /1 1 0 1 /1 1 0 0 /0 0 1 0 /1 0 1 1 /0 0 1 1 /" 21 | ], 22 | [ 23 | "lnHasLoop", 24 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 1 0 0 0 /0 0 0 1 1 /1 1 0 1 1 /1 1 0 0 1 /1 1 0 1 /1 1 0 0 /0 0 1 1 /1 0 1 1 /0 0 1 0 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3.1/lither/4/4/3 . 0 . /. 1 . 3 /3 . 3 . /. 1 . 2 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /-1 1 -1 -1 -1 /-1 -1 -1 1 1 /1 1 -1 1 1 /1 1 -1 1 -1 /1 1 -1 1 /1 1 -1 -1 /-1 -1 1 1 /1 -1 1 -1 /-1 -1 1 1 /" 29 | ] 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/lits.js: -------------------------------------------------------------------------------- 1 | /* lits.js */ 2 | 3 | ui.debug.addDebugData("lits", { 4 | url: "4/4/9q02jg", 5 | failcheck: [ 6 | [ 7 | "cs2x2", 8 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# # . . /# # . . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "bkShadeGt4", 12 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /. . # # /. . # . /. # # . /. . . . /" 13 | ], 14 | [ 15 | "bkShadeDivide", 16 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /. . # # /. . . . /. # # # /. . . . /" 17 | ], 18 | [ 19 | "bsSameShape", 20 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# # # # /# . # . /# . # . /. . . . /" 21 | ], 22 | [ 23 | "csDivide", 24 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# . # # /# . # . /# . # . /. . . . /" 25 | ], 26 | [ 27 | "bkNoShade", 28 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# . # # /# # # . /# . # . /. . . . /" 29 | ], 30 | [ 31 | "bkShadeLt4", 32 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# . # # /# # # . /# . # . /. . # # /" 33 | ], 34 | [ 35 | null, 36 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /# + # # /# # # + /# + # + /# # # # /" 37 | ] 38 | ], 39 | inputs: [ 40 | /* 回答入力はnurikabeと同じなので省略 */ 41 | { input: ["editmode", "newboard,4,4"] }, 42 | { 43 | input: [ 44 | "mouse,left, 4,0, 4,4, 2,4, 2,6", 45 | "mouse,left, 0,6, 6,6, 6,2, 8,2" 46 | ], 47 | result: 48 | "pzprv3/lits/4/4/3/0 0 1 1 /0 0 1 2 /0 1 1 2 /2 2 2 2 /. . . . /. . . . /. . . . /. . . . /" 49 | }, 50 | { 51 | input: [ 52 | "mouse,left, 4,0, 4,4, 2,4, 2,6", 53 | "mouse,left, 0,6, 6,6, 6,2, 8,2" 54 | ], 55 | result: 56 | "pzprv3/lits/4/4/1/0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /. . . . /. . . . /. . . . /. . . . /" 57 | } 58 | ] 59 | }); 60 | -------------------------------------------------------------------------------- /test/script/lookair.js: -------------------------------------------------------------------------------- 1 | /* lookair.js */ 2 | 3 | ui.debug.addDebugData("lookair", { 4 | url: "6/6/3e3b3g1a2e0a2c1d", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/lookair/6/6"], 7 | [ 8 | "csNotSquare", 9 | "pzprv3/lookair/6/6/3 . . . . . /3 . . 3 . . /. . . . . 1 /. 2 . . . . /. 0 . 2 . . /. 1 . . . . /# # . . . . /# . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /" 10 | ], 11 | [ 12 | "lookairBC", 13 | "pzprv3/lookair/6/6/3 . . . . . /3 . . 3 . . /. . . . . 1 /. 2 . . . . /. 0 . 2 . . /. 1 . . . . /# # + . . . /# # + . . . /+ + . . . . /# + # . . . /+ + + . . . /# + . . . . /" 14 | ], 15 | [ 16 | "nmShade5Ne", 17 | "pzprv3/lookair/6/6/3 . . . . . /3 . . 3 . . /. . . . . 1 /. 2 . . . . /. 0 . 2 . . /. 1 . . . . /# # + . . . /# # + + . . /+ + # # + . /# + # # + . /+ + + + . . /+ + # + . . /" 18 | ], 19 | [ 20 | null, 21 | "pzprv3/lookair/6/6/3 . . . . . /3 . . 3 . . /. . . . . 1 /. 2 . . . . /. 0 . 2 . . /. 1 . . . . /# # + # + + /# # + + # + /+ + # # + # /# + # # + + /+ + + + # # /+ + # + # # /" 22 | ] 23 | ], 24 | inputs: [ 25 | /* マウスの問題入力以外nurikabeと同じなので省略 */ 26 | { input: ["editmode", "newboard,8,2"] }, 27 | { 28 | input: [ 29 | "cursor,0,0", 30 | "mouse,leftx2, 1,1", 31 | "mouse,leftx3, 3,1", 32 | "mouse,leftx4, 5,1", 33 | "mouse,leftx5, 7,1", 34 | "mouse,leftx6, 9,1", 35 | "mouse,leftx7, 11,1", 36 | "mouse,leftx8, 13,1", 37 | "mouse,leftx9, 15,1", 38 | "cursor,0,0", 39 | "mouse,rightx2, 1,3", 40 | "mouse,rightx3, 3,3", 41 | "mouse,rightx4, 5,3", 42 | "mouse,rightx5, 7,3", 43 | "mouse,rightx6, 9,3", 44 | "mouse,rightx7, 11,3", 45 | "mouse,rightx8, 13,3", 46 | "mouse,rightx9, 15,3" 47 | ], 48 | result: 49 | "pzprv3/lookair/2/8/- 0 1 2 3 4 5 . /5 4 3 2 1 0 - . /. . . . . . . . /. . . . . . . . /" 50 | } 51 | ] 52 | }); 53 | -------------------------------------------------------------------------------- /test/script/loute.js: -------------------------------------------------------------------------------- 1 | /* loute.js */ 2 | 3 | ui.debug.addDebugData("loute", { 4 | url: "5/5/5i3h1h1i1h2h4i5", 5 | failcheck: [ 6 | [ 7 | "arBlkEdge", 8 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /0 0 0 0 /0 1 0 0 /1 0 0 0 /1 0 0 0 /0 0 0 0 /1 1 0 0 0 /0 1 0 0 0 /0 0 0 0 0 /1 0 0 0 0 /" 9 | ], 10 | [ 11 | "arNotPtCnr", 12 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /0 0 0 0 /0 0 0 0 /1 0 0 0 /0 1 0 0 /0 0 0 0 /0 0 0 0 0 /1 0 0 0 0 /0 1 0 0 0 /1 1 0 0 0 /" 13 | ], 14 | [ 15 | "ciNotOnCnr", 16 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /0 0 0 0 /1 0 0 0 /1 0 0 0 /0 1 1 0 /0 1 0 0 /0 1 0 0 0 /0 0 0 0 0 /1 0 1 0 0 /0 0 0 1 1 /" 17 | ], 18 | [ 19 | "bdDeadEnd", 20 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /-1 1 0 -1 /1 1 1 0 /1 0 0 1 /-1 1 1 1 /-1 -1 1 -1 /-1 1 0 1 1 /-1 0 1 0 0 /1 0 1 0 1 /1 1 -1 1 -1 /" 21 | ], 22 | [ 23 | "bkNotLshape", 24 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /-1 1 0 -1 /1 1 1 0 /1 0 0 1 /-1 1 1 1 /-1 -1 1 -1 /-1 1 0 1 1 /-1 0 1 1 0 /1 0 1 0 1 /1 1 -1 1 -1 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/loute/5/5/5 . . . 3 /. . 1 . . /1 . . . 1 /. . 2 . . /4 . . . 5 /-1 1 0 -1 /1 1 1 0 /1 1 0 1 /-1 1 1 1 /-1 -1 1 -1 /-1 1 0 1 1 /-1 0 1 1 0 /1 0 1 0 1 /1 1 -1 1 -1 /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 問題, 回答はsashiganeと同じなので省略 */ 33 | ] 34 | }); 35 | -------------------------------------------------------------------------------- /test/script/meander.js: -------------------------------------------------------------------------------- 1 | /* meander.js */ 2 | 3 | ui.debug.addDebugData("meander", { 4 | url: "4/4/94g0f0i2n2h4", 5 | failcheck: [ 6 | [ 7 | "bkDupNum", 8 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /. . . . /. . 1 1 /. . . . /. 2 . . /" 9 | ], 10 | [ 11 | "ceNoNum", 12 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /. . 1 . /. . 4 3 /. . 2 1 /. 1 3 . /" 13 | ], 14 | [ 15 | "nmNotConsecNeighbors", 16 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /1 2 1 . /3 6 4 3 /4 5 2 1 /. 1 3 . /" 17 | ], 18 | // touch by edge 19 | [ 20 | "nmAround", 21 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /. . . . /. . . . /. . 2 3 /. 1 1 . /" 22 | ], 23 | // touch diagonally 24 | [ 25 | "nmAround", 26 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /3 2 1 . /4 1 4 3 /5 6 2 1 /. 1 3 . /" 27 | ], 28 | [ 29 | null, 30 | "pzprv3/meander/4/4/0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 0 /0 0 1 1 /1 1 0 0 /. . . 2 /. . . . /. . . . /2 . . 4 /1 2 1 . /4 3 4 3 /5 6 2 1 /. 1 3 . /" 31 | ] 32 | ] 33 | }); 34 | -------------------------------------------------------------------------------- /test/script/mejilink.js: -------------------------------------------------------------------------------- 1 | /* mejilink.js */ 2 | 3 | ui.debug.addDebugData("mejilink", { 4 | url: "4/4/g9rm4", 5 | failcheck: [ 6 | [ 7 | "lnBranch", 8 | "pzprv3/mejilink/4/4/1 0 1 1 1 /2 2 1 1 1 /2 0 1 1 1 /1 0 0 0 1 /1 1 1 1 /1 0 0 0 /2 0 0 1 /1 1 0 1 /1 1 1 1 /" 9 | ], 10 | [ 11 | "lnCross", 12 | "pzprv3/mejilink/4/4/1 0 1 1 1 /1 1 1 2 1 /1 0 2 2 1 /1 0 0 0 1 /1 1 1 1 /1 0 0 0 /1 0 2 2 /2 2 0 2 /1 1 1 1 /" 13 | ], 14 | [ 15 | "bkNoLineNe", 16 | "pzprv3/mejilink/4/4/2 0 1 1 1 /1 2 1 1 1 /2 0 1 1 1 /2 0 0 0 1 /2 2 1 1 /2 0 0 0 /2 0 0 1 /1 1 0 1 /2 2 2 2 /" 17 | ], 18 | [ 19 | "lnDeadEnd", 20 | "pzprv3/mejilink/4/4/2 0 1 2 2 /1 2 1 2 2 /2 0 1 2 2 /2 0 0 1 2 /2 2 2 1 /2 0 0 0 /2 0 0 1 /1 1 0 0 /2 2 2 2 /" 21 | ], 22 | [ 23 | "lnPlLoop", 24 | "pzprv3/mejilink/4/4/2 2 0 2 2 /2 2 0 2 2 /1 0 0 0 1 /2 1 0 1 2 /2 1 1 2 /1 0 0 1 /2 1 1 2 /2 2 2 2 /2 2 2 2 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/mejilink/4/4/2 0 -1 1 2 /-1 2 -1 1 2 /2 0 -1 2 1 /2 0 0 0 2 /2 2 2 2 /2 0 0 0 /2 0 0 2 /-1 -1 0 2 /2 2 2 2 /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 回答入力はslitherと同じなので省略 */ 33 | { input: ["newboard,4,1", "editmode"] }, 34 | { 35 | input: ["mouse,left, 0,0, 8,0, 8,2, 0,2, 0,0"], 36 | result: "pzprv3/mejilink/1/4/0 0 0 0 0 /0 0 0 0 /0 0 0 0 /" 37 | }, 38 | { 39 | input: [ 40 | "mouse,left, 0,0, 8,0, 8,2, 0,2, 0,0", 41 | "mouse,left, 2,0, 2,2, 4,2, 4,0, 6,0, 6,2" 42 | ], 43 | result: "pzprv3/mejilink/1/4/1 1 1 1 1 /1 1 1 1 /1 1 1 1 /" 44 | }, 45 | { 46 | input: ["playmode", "mouse,left, 0,0, 4,0, 4,2, 8,2"], 47 | result: "pzprv3/mejilink/1/4/1 1 2 1 1 /2 2 1 1 /1 1 2 2 /" 48 | }, 49 | { 50 | input: ["editmode", "mouse,left, 2,0, 2,2, 4,2, 4,0, 6,0, 6,2"], 51 | result: "pzprv3/mejilink/1/4/1 0 2 0 1 /2 2 0 1 /1 0 2 2 /" 52 | }, 53 | { input: ["newboard,4,1"] }, 54 | { 55 | input: ["playmode", "mouse,left, 0,0, 4,0, 4,2, 8,2"], 56 | result: "pzprv3/mejilink/1/4/1 0 0 0 1 /2 2 1 1 /1 1 2 2 /" 57 | } 58 | ] 59 | }); 60 | -------------------------------------------------------------------------------- /test/script/mines.js: -------------------------------------------------------------------------------- 1 | /* mines.js */ 2 | 3 | ui.debug.addDebugData("mines", { 4 | url: "5/5/g2m13l13g0j", 5 | failcheck: [ 6 | [ 7 | "nmMinesNe", 8 | "pzprv3/mines/5/5/. 2 . . . /. . . . 1 /3 . . . . /. . 1 3 . /0 . . . . /. . . . # /# # . . . /. . . . . /# . . . # /. . . # # /" 9 | ], 10 | [ 11 | "nmMinesNe", 12 | "pzprv3/mines/5/5/. 2 . . . /. . . . 1 /3 . . . . /. . 1 3 . /0 . . . . /. . . . . /# # . . . /. . # . # /. . . . . /. . . . # /" 13 | ], 14 | [ 15 | null, 16 | "pzprv3/mines/5/5/. 2 . . . /. . . . 1 /3 . . . . /. . 1 3 . /0 . . . . /. . + . . /# # + . . /. # + + # /+ + . . # /. + + + # /" 17 | ] 18 | ], 19 | inputs: [ 20 | { input: ["editmode", "newboard,5,1"] }, 21 | { 22 | input: [ 23 | "cursor,1,1", 24 | "key,-", 25 | "key,right", 26 | "key,0", 27 | "key,right", 28 | "key,1", 29 | "key,right", 30 | "key,2", 31 | "key,right", 32 | "key,3" 33 | ], 34 | result: "pzprv3/mines/1/5/- 0 1 2 3 /. . . . . /" 35 | }, 36 | { 37 | input: [ 38 | "cursor,1,1", 39 | "key,-", 40 | "key,right", 41 | "key,-", 42 | "key,right", 43 | "key,-", 44 | "key,-" 45 | ], 46 | result: "pzprv3/mines/1/5/. - . 2 3 /. . . . . /" 47 | }, 48 | { input: ["newboard,6,1"] }, 49 | { 50 | input: [ 51 | "cursor,0,0", 52 | "mouse,leftx2, 1,1", 53 | "mouse,leftx3, 3,1", 54 | "mouse,leftx4, 5,1", 55 | "mouse,leftx5, 7,1", 56 | "mouse,leftx6, 9,1", 57 | "mouse,rightx2, 11,1" 58 | ], 59 | result: "pzprv3/mines/1/6/- 0 1 2 3 8 /. . . . . . /" 60 | } 61 | ] 62 | }); 63 | -------------------------------------------------------------------------------- /test/script/mochikoro.js: -------------------------------------------------------------------------------- 1 | /* mochikoro.js */ 2 | 3 | ui.debug.addDebugData("mochikoro", { 4 | url: "5/5/4p2n1i1", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/mochikoro/5/5"], 7 | [ 8 | "cs2x2", 9 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /. . . # # /. . . # # /. . . . . /. . . . . /. . . . . /" 10 | ], 11 | [ 12 | "csDivide8", 13 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /+ + + + # /# # # # # /. . . . . /. . . . . /. . . . . /" 14 | ], 15 | [ 16 | "cuNotRect", 17 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /+ + + + # /# # # # + /. . # + + /. . . # # /. . . . . /" 18 | ], 19 | [ 20 | "bkNumGe2", 21 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /+ + # + . /. . # . + /. . # . + /# # . # # /. . # . . /" 22 | ], 23 | [ 24 | "bkSizeNe", 25 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /+ + + + # /# # # # + /# + + # + /+ # # + # /+ # + # + /" 26 | ], 27 | [ 28 | null, 29 | "pzprv3/mochikoro/5/5/4 . . . . /. . . . . /. 2 . . . /. . . . . /1 . . . 1 /+ + + + # /# # # # + /# + # + # /# + # + # /+ # + # + /" 30 | ] 31 | ], 32 | inputs: [] /* nurikabeと同じなので省略 */ 33 | }); 34 | -------------------------------------------------------------------------------- /test/script/mochinyoro.js: -------------------------------------------------------------------------------- 1 | /* mochinyoro.js */ 2 | 3 | ui.debug.addDebugData("mochinyoro", { 4 | url: "5/5/l4g2m2m1", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/mochinyoro/5/5"], 7 | [ 8 | "cs2x2", 9 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /. . . . . /. . . . . /. . . . . /. . # # . /. . # # . /" 10 | ], 11 | [ 12 | "csDivide8", 13 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /. . # . . /. . # . . /# # # . . /. . . . . /. . . . . /" 14 | ], 15 | [ 16 | "cuNotRect", 17 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /+ + # . . /+ + # . . /# # + . . /. . . . . /. . . . . /" 18 | ], 19 | [ 20 | "bkNumGe2", 21 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /+ + # . # /+ + # . # /. . # # . /. . # . # /# # . # . /" 22 | ], 23 | [ 24 | "bkSizeNe", 25 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /+ + # . . /+ + # + . /# # + # # /# + # + # /# # # # + /" 26 | ], 27 | [ 28 | "csRect", 29 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /+ + # + # /+ + # + # /# # + # # /# + # + # /# + # # + /" 30 | ], 31 | [ 32 | null, 33 | "pzprv3/mochinyoro/5/5/. . . . . /. 4 . 2 . /. . . . . /. 2 . . . /. . . . 1 /+ + # # # /+ + # + + /# # + # # /# + # + # /# + # # + /" 34 | ] 35 | ], 36 | inputs: [] /* nurikabeと同じなので省略 */ 37 | }); 38 | -------------------------------------------------------------------------------- /test/script/mrtile.js: -------------------------------------------------------------------------------- 1 | /* mrtile.js */ 2 | 3 | ui.debug.addDebugData("mrtile", { 4 | url: "5/5/1h3k32g..q", 5 | failcheck: [ 6 | [ 7 | "bkSizeNe", 8 | "pzprv3/mrtile/5/5/1 . . 3 . /. # . . 3 /2 . - - . /# . . . # /. # # . # /" 9 | ], 10 | [ 11 | "bkNoChain", 12 | "pzprv3/mrtile/5/5/1 . . 3 # /. # . . 3 /2 . - - . /# . . . # /. # # . # /" 13 | ], 14 | [ 15 | null, 16 | "pzprv3/mrtile/5/5/1 + + 3 # /+ # + + 3 /2 + - - + /# + + # + /+ # # + + /" 17 | ] 18 | ], 19 | inputs: [ 20 | { 21 | input: ["newboard,6,2", "cursor,5,3", "mouse,right,5,3"], 22 | result: "pzprv3/mrtile/2/6/. . . . . . /. . 5 . . . /" 23 | } 24 | ] 25 | }); 26 | -------------------------------------------------------------------------------- /test/script/nawabari.js: -------------------------------------------------------------------------------- 1 | /* nawabari.js */ 2 | 3 | ui.debug.addDebugData("nawabari", { 4 | url: "5/5/f0b1f2a1f", 5 | failcheck: [ 6 | [ 7 | "bkNotRect", 8 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 1 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 /0 0 1 0 0 /1 1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkNoNum", 12 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /0 0 0 1 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 0 /0 0 0 0 0 /1 1 1 1 1 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | "bkNumGe2", 16 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /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 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 /0 0 0 0 0 /0 0 0 0 0 /" 17 | ], 18 | [ 19 | "nmBorderNe", 20 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 1 1 /1 1 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 21 | ], 22 | [ 23 | "bdDeadEnd", 24 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 1 0 0 0 /0 0 1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /1 1 1 1 1 /0 0 1 0 0 /0 0 0 0 0 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/nawabari/5/5/. . . . . /. 0 . . 1 /. . . . . /. 2 . 1 . /. . . . . /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 0 1 0 0 /0 0 1 0 0 0 /0 0 1 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /1 1 1 1 1 /0 0 0 0 0 /0 0 0 0 0 /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 問題入力, 回答入力はshikaku等と同じなので省略 */ 33 | ] 34 | }); 35 | -------------------------------------------------------------------------------- /test/script/news.js: -------------------------------------------------------------------------------- 1 | /* news.js */ 2 | 3 | ui.debug.addDebugData("news", { 4 | url: "4/4/2n8f9054a3826", 5 | failcheck: [ 6 | [ 7 | "arAlone", 8 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /. . . . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "bkNumGe3", 12 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /. . . . /. . 1 . /. . 4 . /" 13 | ], 14 | [ 15 | "nmDupRow", 16 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /. . . . /. 4 . . /. . . . /" 17 | ], 18 | [ 19 | "arNotRelative", 20 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /1 . . . /. . . . /. . . . /" 21 | ], 22 | [ 23 | "bkNoNum", 24 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /2 . 4 . /. . 1 . /. . . . /" 25 | ], 26 | 27 | [ 28 | "bkDivide", 29 | "pzprv3/news/5/4/n/2/0 0 0 1 /0 0 0 1 /0 0 1 1 /1 1 1 1 /1 1 1 1 /. . . . /. . . . /. . . . /. . . . /. . . . /. . . . /. . 1 . /. 3 . 4 /. . 2 . /. . . . /", 30 | { skiprules: true } 31 | ], 32 | [ 33 | null, 34 | "pzprv3/news/5/4/n/2/0 0 0 1 /0 0 0 1 /0 0 1 1 /1 1 1 1 /1 1 1 1 /. . . . /. . . . /. . . . /. . . . /. . . . /. . 1 . /. . . . /. 3 . 4 /. . 2 . /. . . . /", 35 | { skiprules: true } 36 | ], 37 | 38 | [ 39 | null, 40 | "pzprv3/news/4/4/4/0 0 0 0 /0 1 1 2 /1 1 3 2 /1 3 3 2 /. 4 . . /. . . . /3 . . . /. 2 . . /. . . . /2 . 4 1 /. . 1 2 /. . . . /" 41 | ] 42 | ], 43 | inputs: [ 44 | { 45 | label: "Keyboard input", 46 | input: ["newboard,2,2", "editmode", "key,n,right,e,down,x"], 47 | result: "pzprv3/news/2/2/1/0 0 /0 0 /1 4 /. - /. . /. . /" 48 | }, 49 | { 50 | input: ["editmode,empty", "mouse,left,1,3"], 51 | result: "pzprv3/news/2/2/1/0 0 /0 0 /1 4 /- - /. . /. . /" 52 | } 53 | ] 54 | }); 55 | -------------------------------------------------------------------------------- /test/script/nibunnogo.js: -------------------------------------------------------------------------------- 1 | /* nibunnogo.js */ 2 | 3 | ui.debug.addDebugData("nibunnogo", { 4 | url: "4/4/gbjbakci", 5 | failcheck: [ 6 | [ 7 | "bkSizeGt5", 8 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /1 2 2 2 /2 2 1 2 /2 2 1 1 /1 1 2 1 /" 9 | ], 10 | [ 11 | "bkSizeGt5", 12 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /2 1 2 2 /2 2 1 2 /2 2 1 1 /1 1 1 1 /" 13 | ], 14 | [ 15 | "crShadeGt", 16 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /2 1 2 2 /2 2 1 2 /1 2 1 1 /1 2 1 1 /" 17 | ], 18 | [ 19 | "crShadeLt", 20 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /2 1 2 2 /2 2 1 2 /2 2 1 1 /1 1 2 2 /" 21 | ], 22 | [ 23 | "ceEmpty", 24 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /2 1 2 2 /2 2 1 2 /2 2 0 1 /0 0 0 1 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/nibunnogo/4/4/. 1 . . . /. . . 1 . /. 0 . . . /. . . . 2 /. . . . . /2 1 2 2 /2 2 1 2 /2 2 1 1 /1 1 2 1 /" 29 | ] 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/nikoji.js: -------------------------------------------------------------------------------- 1 | /* nikoji.js */ 2 | 3 | ui.debug.addDebugData("nikoji", { 4 | url: "4/4/h1g2h3h2h43g", 5 | failcheck: [ 6 | [ 7 | "bkNumGe2", 8 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /0 1 0 /0 0 0 /1 0 0 /0 1 0 /0 0 1 1 /1 0 0 0 /0 1 0 0 /" 9 | ], 10 | [ 11 | "bkNoNum", 12 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /0 0 0 /0 1 1 /0 1 0 /0 1 1 /1 1 0 1 /1 1 1 1 /0 0 1 1 /" 13 | ], 14 | [ 15 | "bkDifferentShape", 16 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /1 0 0 /0 1 1 /0 1 0 /0 1 0 /0 1 1 1 /1 1 0 1 /0 0 1 1 /" 17 | ], 18 | [ 19 | "bkDifferentShape", 20 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /1 0 0 /1 0 1 /1 1 0 /0 1 1 /0 1 1 1 /0 0 1 1 /1 0 1 0 /" 21 | ], 22 | [ 23 | "bkDifferentOrientation", 24 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /0 0 0 /1 0 1 /0 1 1 /0 1 0 /1 0 0 1 /1 1 1 0 /0 0 1 1 /" 25 | ], 26 | [ 27 | "bkDifferentPosition", 28 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /0 0 1 /1 1 0 /0 1 1 /0 1 0 /1 1 1 0 /1 0 1 1 /0 0 1 0 /" 29 | ], 30 | [ 31 | "bkDifferentLetters", 32 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /0 0 0 /0 1 1 /1 1 0 /0 1 1 /1 1 0 1 /1 0 1 1 /0 1 1 0 /" 33 | ], 34 | [ 35 | "bdDeadEnd", 36 | "pzprv3/nikoji/2/4/. . . . /. 1 . 1 /0 1 0 /0 1 0 /1 0 0 0 /", 37 | { skiprules: true } 38 | ], 39 | [ 40 | null, 41 | "pzprv3/nikoji/4/4/. . 1 . /2 . . 3 /. . 2 . /. 4 3 . /1 0 0 /0 1 1 /1 1 0 /0 1 1 /0 1 1 1 /1 0 0 1 /0 1 1 0 /" 42 | ] 43 | ], 44 | inputs: [] 45 | }); 46 | -------------------------------------------------------------------------------- /test/script/nonogram.js: -------------------------------------------------------------------------------- 1 | /* nonogram.js */ 2 | 3 | ui.debug.addDebugData("nonogram", { 4 | url: "6/6/12g1111h11112j12g11g21j11g3h", 5 | failcheck: [ 6 | [ 7 | // missing groups 8 | "exNoMatch", 9 | "pzprv3/nonogram/6/6/. . . . 1 . 1 . . /. . . 2 1 . 1 2 . /. . . 1 1 1 1 1 . /. 2 1 # # . # . . /. 1 1 # . . . # . /. 1 2 . # . # # . /. . . . . . . . . /. 1 1 # . . . . . /. . 3 . # # # . . /" 10 | ], 11 | [ 12 | // group order 13 | "exNoMatch", 14 | "pzprv3/nonogram/6/6/. . . . 1 . 1 . . /. . . 2 1 . 1 2 . /. . . 1 1 1 1 1 . /. 2 1 . # . # # . /. 1 1 # . . . # . /. 1 2 # # . # . . /. . . . . . . . . /. 1 1 # . . . # . /. . 3 . # # # . . /" 15 | ], 16 | [ 17 | // empty rows 18 | "exNoMatch", 19 | "pzprv3/nonogram/6/6/. . . . 1 . 1 . . /. . . 2 1 . 1 2 . /. . . 1 1 1 1 1 . /. 2 1 # # . # . . /. 1 1 # . . . # . /. 1 2 . # . # # . /. . . . . . . . # /. 1 1 # . . . # . /. . 3 . # # # . . /" 20 | ], 21 | [ 22 | null, 23 | "pzprv3/nonogram/6/6/. . . . 1 . 1 . . /. . . 2 1 . 1 2 . /. . . 1 1 1 1 1 . /. 2 1 # # . # . . /. 1 1 # . . . # . /. 1 2 . # . # # . /. . . . . . . . . /. 1 1 # . . . # . /. . 3 . # # # . . /" 24 | ], 25 | [ 26 | // Puzzle with width != height 27 | null, 28 | "pzprv3/nonogram/10/3/. . . . . /. . . 1 . /. . . 2 . /. . 4 1 3 /. . 1 1 4 /. 2 . # # /. 1 . . # /. 2 . # # /. 2 # # . /. 1 # . . /. 1 # . . /. 3 # # # /. 1 . . # /. 1 . . # /. 3 # # # /", 29 | { skiprules: true } 30 | ] 31 | ], 32 | inputs: [ 33 | { input: ["newboard,5,1"] }, 34 | { 35 | input: ["cursor,0,0", "mouse,leftx2, -5,1"], 36 | result: "pzprv3/nonogram/1/5/. . . . . . . . /1 . . . . . . . /" 37 | }, 38 | { 39 | input: ["flushexcell"], 40 | result: "pzprv3/nonogram/1/5/. . . . . . . . /. . 1 . . . . . /" 41 | } 42 | ] 43 | }); 44 | -------------------------------------------------------------------------------- /test/script/norinori.js: -------------------------------------------------------------------------------- 1 | /* norinori.js */ 2 | 3 | ui.debug.addDebugData("norinori", { 4 | url: "5/5/cag4ocjo", 5 | failcheck: [ 6 | [ 7 | "csGt2", 8 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # . . . /. # . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "bkShadeGt2", 12 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # + . # /+ + # # . /# . . . # /. . . . # /. . . . . /" 13 | ], 14 | [ 15 | "csLt2", 16 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # + + + /+ + # # + /# . . + . /+ + . . . /# # + . . /" 17 | ], 18 | [ 19 | "bkShadeLt2", 20 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # + + + /+ + # # + /# # + + . /+ + . . . /# # + . . /" 21 | ], 22 | [ 23 | "bkNoShade", 24 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # + + + /+ + + + + /+ + + + . /+ + . . . /# # + . . /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/norinori/5/5/5/0 0 1 2 2 /1 1 1 2 2 /1 3 3 2 2 /3 3 3 3 3 /4 4 3 3 3 /# # + + + /+ + # # + /# # + + # /+ + . . # /# # + . . /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 問題入力はlitsと同じなので省略 */ 33 | /* 回答入力テスト */ 34 | { input: ["playmode", "newboard,4,4"] }, 35 | { 36 | input: [ 37 | "mouse,left, 4,0, 4,4, 2,4, 2,6", 38 | "mouse,left, 0,6, 6,6, 6,2, 8,2" 39 | ], 40 | result: 41 | "pzprv3/norinori/4/4/1/0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /. . # . /. . # . /. . . . /# # . . /" 42 | } 43 | ] 44 | }); 45 | -------------------------------------------------------------------------------- /test/script/norinuri.js: -------------------------------------------------------------------------------- 1 | /* norinuri.js */ 2 | 3 | ui.debug.addDebugData("norinuri", { 4 | url: "6/6/1l4i.o1h5p4", 5 | failcheck: [ 6 | [ 7 | "csLt2", 8 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. # . . . . /# . . . . . /# . . . . . /. . . . . . /. . . . . . /. . . . . . /" 9 | ], 10 | [ 11 | "csGt2", 12 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. # # # . . /# . . . . . /# . . . . . /. . . . . . /. . . . . . /. . . . . . /" 13 | ], 14 | [ 15 | "bkNoNum", 16 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. . . . . . /. . . . . . /. . # . . . /. . # . . . /. # . # . . /. # . # . . /" 17 | ], 18 | [ 19 | "bkNumGe2", 20 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. # # . . . /# . . # . . /# . . # . # /. # # . . # /. . . # # . /. # # . . . /" 21 | ], 22 | [ 23 | "bkSizeNe", 24 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. # # . . . /# . . # . . /# . . # . . /. # # . # # /. . . # . . /. . . # . . /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/norinuri/6/6/1 . . . . . /. 4 . . . - /. . . . . . /. . . 1 . . /5 . . . . . /. . . . . 4 /. # # . . . /# . . # . . /# . . # . . /. # # . # # /. . . # . . /# # . # . . /" 29 | ] 30 | ], 31 | inputs: [] /* nurikabeと同じなので省略 */ 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/nuribou.js: -------------------------------------------------------------------------------- 1 | /* nuribou.js */ 2 | 3 | ui.debug.addDebugData("nuribou", { 4 | url: "5/5/1g2l1g4r7", 5 | failcheck: [ 6 | [ 7 | "csWidthGt1", 8 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /. . . . . /# # # . . /. . # . . /. . # . . /. . . . . /" 9 | ], 10 | [ 11 | "csCornerSize", 12 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /+ # + + # /# + # # + /. . + + # /. . . . . /. . . . . /" 13 | ], 14 | [ 15 | "bkNoNum", 16 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /+ # + + # /# + # # + /# + + + # /. # . . . /. . # # . /" 17 | ], 18 | [ 19 | "bkNumGe2", 20 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /+ # + + # /# + # # + /# + + + # /. . . . . /. . . . . /" 21 | ], 22 | [ 23 | "bkSizeNe", 24 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /+ # + # . /+ # + # + /# + # . # /. . # . . /. . # . . /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/nuribou/5/5/1 . 2 . . /. . . . 1 /. 4 . . . /. . . . . /. . . . 7 /+ # + + # /# + # # + /# + + + # /+ # # # . /. . . . . /" 29 | ] 30 | ], 31 | inputs: [] /* nurikabeと同じなので省略 */ 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/nuritwin.js: -------------------------------------------------------------------------------- 1 | /* nuritwin.js */ 2 | 3 | ui.debug.addDebugData("nuritwin", { 4 | url: "5/5/08qi3u4632h", 5 | failcheck: [ 6 | [ 7 | "bkSizeNe", 8 | "pzprv3/nuritwin/5/5/4/0 0 0 0 0 /0 0 0 1 1 /2 2 2 3 1 /2 2 3 3 1 /2 2 2 1 1 /3 . . . . /. . . 2 . /. . . . . /. . . . . /. . . . . /# . # # . /# . . # # /# # # # . /. . # . . /# # # # # /" 9 | ], 10 | [ 11 | "bkUnitNe2", 12 | "pzprv3/nuritwin/5/5/4/0 0 0 0 0 /0 0 0 1 1 /2 2 2 3 1 /2 2 3 3 1 /2 2 2 1 1 /3 . . . . /. . . 2 . /. . . . . /. . . . . /. . . . . /# . # # # /# # . . # /. # # # # /. . . # . /. # # # # /" 13 | ], 14 | [ 15 | "bkDifferentShape", 16 | "pzprv3/nuritwin/5/5/4/0 0 0 0 0 /0 0 0 1 1 /2 2 2 3 1 /2 2 3 3 1 /2 2 2 1 1 /3 . . . . /. . . 2 . /. . . . . /. . . . . /. . . . . /# . # # # /# # . . # /. # # # # /# . # . . /# # # # # /" 17 | ], 18 | [ 19 | "csDivide", 20 | "pzprv3/nuritwin/5/5/4/0 0 0 0 0 /0 0 0 1 1 /2 2 2 3 1 /2 2 3 3 1 /2 2 2 1 1 /3 . . . . /. . . 2 . /. . . . . /. . . . . /. . . . . /# . # # # /# # . . # /# . . # # /# . # . . /. # # # # /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/nuritwin/5/5/4/0 0 0 0 0 /0 0 0 1 1 /2 2 2 3 1 /2 2 3 3 1 /2 2 2 1 1 /3 . . . . /. . . 2 . /. . . . . /. . . . . /. . . . . /# + # # # /# # + + # /+ # # # # /+ + # + + /+ # # # # /" 25 | ] 26 | ], 27 | inputs: [] 28 | }); 29 | -------------------------------------------------------------------------------- /test/script/oneroom.js: -------------------------------------------------------------------------------- 1 | /* oneroom.js */ 2 | 3 | ui.debug.addDebugData("oneroom", { 4 | url: "5/5/cpj600o01h0", 5 | failcheck: [ 6 | [ 7 | "brNoShade", 8 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "csAdjacent", 12 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . # . . /. . . # . /. # . # . /. . . . . /. . # . . /" 13 | ], 14 | [ 15 | "cuDivideRB", 16 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . . # . /. . . . . /. # . . # /. . . # . /. . # . . /" 17 | ], 18 | [ 19 | "bkShadeNe", 20 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /# . # . . /. . . # . /. # . . . /. . . # . /. . # . . /" 21 | ], 22 | [ 23 | "bkSubdivided", 24 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . . . . /. . # . . /. . . . . /. . . . . /. . . . . /" 25 | ], 26 | [ 27 | "bdDoorsGt", 28 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . # . . /. . . . . /. # . # . /. . . . . /. . # . . /" 29 | ], 30 | [ 31 | "bdDoorsGt", 32 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /. . # . . /. # . # . /. . . . . /. . . # . /. . # . . /" 33 | ], 34 | [ 35 | null, 36 | "pzprv3/oneroom/5/5/4/0 0 1 2 2 /0 0 1 2 2 /0 0 1 2 2 /3 3 1 2 2 /3 3 1 2 2 /1 . . . . /. . . . . /. . . . . /0 . . . . /. . . . . /+ + # + + /+ + + # + /+ # + + + /+ + + # + /+ + # + + /" 37 | ] 38 | ] 39 | }); 40 | -------------------------------------------------------------------------------- /test/script/outofsight.js: -------------------------------------------------------------------------------- 1 | /* outofsight.js */ 2 | 3 | ui.debug.addDebugData("outofsight", { 4 | url: "5/5/a2201b4141b01a12e1131b12a4242", 5 | failcheck: [ 6 | [ 7 | "brNoShade", 8 | "pzprv3/outofsight/5/5/. 2,2 0,1 . . /4,1 4,1 . . 0,1 /. 1,2 . . . /. . 1,1 3,1 . /. 1,2 . 4,2 4,2 /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "cuDivideRB", 12 | "pzprv3/outofsight/5/5/. 2,2 0,1 . . /4,1 4,1 . . 0,1 /. 1,2 . . . /. . 1,1 3,1 . /. 1,2 . 4,2 4,2 /. . . . . /# . . . # /. # . . . /. . # . . /. # . . # /" 13 | ], 14 | [ 15 | "csAdjacent", 16 | "pzprv3/outofsight/5/5/. 2,2 0,1 . . /4,1 4,1 . . 0,1 /. 1,2 . . . /. . 1,1 3,1 . /. 1,2 . 4,2 4,2 /. . # . . /# . . . # /. # . . . /. . . # . /. # . # . /" 17 | ], 18 | [ 19 | "anShadeNe", 20 | "pzprv3/outofsight/5/5/. 2,2 0,1 . . /4,1 4,1 . . 0,1 /. 1,2 . . . /. . 1,1 3,1 . /. 1,2 . 4,2 4,2 /. # . . . /. . . . # /. # . . . /. . # . . /. # . . # /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/outofsight/5/5/. 2,2 0,1 . . /4,1 4,1 . . 0,1 /. 1,2 . . . /. . 1,1 3,1 . /. 1,2 . 4,2 4,2 /+ + # + + /# + + + # /+ # + + + /+ + + # + /+ # + + # /" 25 | ] 26 | ], 27 | inputs: [] 28 | }); 29 | -------------------------------------------------------------------------------- /test/script/pentatouch.js: -------------------------------------------------------------------------------- 1 | /* pentatouch.js */ 2 | 3 | ui.debug.addDebugData("pentatouch", { 4 | url: "7/6/131a0a//t", 5 | failcheck: [ 6 | [ 7 | "bankGt", 8 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . 1 . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /# # . . . . . /# . # # . # . /# . . # . # # /. . . # . . # /. . . . . . . /. . . # # # # /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bankLt", 12 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . . . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /. . # # # # . /# # . . . . . /# . # # . . . /# . # # . . . /. # . . . . . /# # # . . . . /0 0 0 0 0 /" 13 | ], 14 | [ 15 | "shDiag", 16 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . 1 . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /. . . . # . . /. . . . # # . /. . # # . # . /. . # # . . . /. # . . . . . /# # # . . . . /0 0 0 0 0 /" 17 | ], 18 | [ 19 | "shNoDiag", 20 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . 1 . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /. . # # # # . /. # . . . . . /# # . # # . . /# . . # # . # /. # . . . . # /# # # . . # # /0 0 0 0 0 /" 21 | ], 22 | [ 23 | "bankInvalid", 24 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . 1 . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /. . . . . . # /. . # # # # . /# # . . . . . /# . . . # # . /. # . . # # . /# # # . . . . /0 0 0 0 0 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/pentatouch/6/7/t/. . . . . . . . /. . 1 . . . 1 . /. . 1 . . . . . /. . . . . . . . /. 1 1 . . . . . /. . . . . . . . /. . . . . . . . /+ + # # # # + /# # + + + + # /# + # # + # # /# + # # + # + /+ # + + + + + /# # # + + + + /0 0 0 0 0 /" 29 | ] 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/ququ.js: -------------------------------------------------------------------------------- 1 | ui.debug.addDebugData("ququ", { 2 | url: "2/2/i13k1i.g", 3 | failcheck: [ 4 | [ 5 | "bkNoNum", 6 | "pzprv3/ququ/2/2/. 3 /. . . . /1 . /. . /. 1 . - /. . /. . /# # . . /. . /# . /. . # . /# . /" 7 | ], 8 | [ 9 | "bkNumGe2", 10 | "pzprv3/ququ/2/2/. 3 /. . . . /1 . /. . /. 1 . - /. . /# . /# # # . /. . /# . /# . . . /# . /" 11 | ], 12 | [ 13 | "bkSizeNe", 14 | "pzprv3/ququ/2/2/. 3 /. . . . /1 . /. . /. 1 . - /. . /# . /# # # . /. # /# # /# . . . /# # /" 15 | ], 16 | [ 17 | "bsSameShape", 18 | "pzprv3/ququ/2/2/. 3 /. . . . /1 . /. . /. 1 . - /. . /. . /. . # . /. # /# . /# . . . /. . /" 19 | ], 20 | [ 21 | null, 22 | "pzprv3/ququ/2/2/. 3 /. . . . /1 . /. . /. 1 . - /. . /# + /# # # + /+ + /# # /# + # + /# + /" 23 | ], 24 | [ 25 | null, 26 | "pzprv3/ququ/2/3/2 3 4 /. . . . . . /. . . /. . . /. . . . . . /. . . /+ + + /+ # + # + # /# + + /# # + /# # # # # # /# # # /", 27 | { skiprules: true } 28 | ] 29 | ] 30 | }); 31 | -------------------------------------------------------------------------------- /test/script/renban.js: -------------------------------------------------------------------------------- 1 | /* renban.js */ 2 | 3 | ui.debug.addDebugData("renban", { 4 | url: "4/4/vmok3g1p5g2h", 5 | failcheck: [ 6 | [ 7 | "bkDupNum", 8 | "pzprv3/renban/4/4/1 1 1 /1 1 1 /0 1 1 /0 1 1 /1 0 1 0 /0 0 0 0 /1 1 1 0 /1 . . . /. . . . /. . . 5 /. 2 . . /. 3 . . /2 . . . /. 3 . . /. . . . /" 9 | ], 10 | [ 11 | "ceNoNum", 12 | "pzprv3/renban/4/4/1 1 1 /1 1 1 /0 1 1 /0 1 1 /1 0 1 0 /0 0 0 0 /1 1 1 0 /1 . . . /. . . . /. . . 5 /. . . . /. 3 . . /2 . . . /. 5 . . /4 . . . /" 13 | ], 14 | [ 15 | "bkNotSeqNum", 16 | "pzprv3/renban/4/4/1 1 1 /1 1 1 /0 1 1 /0 1 1 /1 0 1 0 /0 0 0 0 /1 1 1 0 /1 . . . /. . . . /. . . 5 /. 2 . . /. 3 . . /2 . . . /. 5 . . /4 . . . /" 17 | ], 18 | [ 19 | "cbDiffLenNe", 20 | "pzprv3/renban/4/4/1 1 1 /1 1 1 /0 1 1 /0 1 1 /1 0 1 0 /0 0 0 0 /1 1 1 0 /1 . . . /. . . . /. . . 5 /. 2 . . /. 3 7 . /2 4 8 . /6 5 9 . /3 . 7 . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/renban/4/4/1 1 1 /1 1 1 /0 1 1 /0 1 1 /1 0 1 0 /0 0 0 0 /1 1 1 0 /1 . . . /. . . . /. . . 5 /. 2 . . /. 3 7 3 /2 4 8 4 /6 5 9 . /3 . 6 2 /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力, 回答入力はripple, bosanowaとだいたい同じなので省略 */ 29 | ] 30 | }); 31 | -------------------------------------------------------------------------------- /test/script/roundtrip.js: -------------------------------------------------------------------------------- 1 | /* roundtrip.js */ 2 | 3 | ui.debug.addDebugData("roundtrip", { 4 | url: "5/5/243j234h332333h", 5 | failcheck: [ 6 | [ 7 | "lnBranch", 8 | "pzprv3/roundtrip/5/5/. 2 4 3 . . . /. . . . . . 3 /. . . . . . 3 /3 . . . . . 3 /3 . . . . . . /2 . . . . . . /. . . 2 3 4 . /0 0 1 1 /0 0 0 0 /0 0 1 1 /0 0 1 1 /0 1 0 0 /0 0 1 0 1 /0 0 1 0 1 /0 0 0 0 1 /0 0 1 0 0 /" 9 | ], 10 | [ 11 | "nmSightNe", 12 | "pzprv3/roundtrip/5/5/. 2 4 3 . . . /. . . . . . 3 /. . . . . . 3 /3 . . . . . 3 /3 . . . . . . /2 . . . . . . /. . . 2 3 4 . /0 0 1 1 /0 1 1 0 /1 1 0 0 /1 1 0 0 /0 1 0 1 /0 0 1 0 1 /0 1 1 1 1 /1 1 0 1 1 /0 1 1 1 1 /" 13 | ], 14 | [ 15 | "nmSightNe", 16 | "pzprv3/roundtrip/5/5/. 2 4 3 . . . /. . . . . . 3 /. . . . . . 3 /3 . . . . . 3 /3 . . . . . . /2 . . . . . . /. . . 2 3 4 . /0 0 1 1 /0 1 1 0 /1 1 0 0 /1 1 0 1 /0 1 0 0 /0 0 1 0 1 /0 0 1 1 1 /1 0 0 1 1 /0 0 1 0 0 /" 17 | ], 18 | [ 19 | "lnPlLoop", 20 | "pzprv3/roundtrip/5/5/. . . . . . . /. . . . . . . /. . . . . . . /. . . . . . . /. . . . . . . /. . . . . . . /. . . . . . . /0 0 0 1 /0 1 0 0 /1 1 0 0 /1 1 0 1 /0 1 0 0 /0 0 0 1 1 /0 1 1 1 1 /1 1 0 1 1 /0 1 1 0 0 /" 21 | ], 22 | [ 23 | "lnDeadEnd", 24 | "pzprv3/roundtrip/5/5/. 2 4 3 . . . /. . . . . . 3 /. . . . . . 3 /3 . . . . . 3 /3 . . . . . . /2 . . . . . . /. . . 2 3 4 . /0 0 1 1 /0 1 1 0 /1 1 0 0 /1 1 0 0 /0 1 0 0 /0 0 1 0 1 /0 1 1 1 1 /1 1 0 1 1 /0 1 1 0 0 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/roundtrip/5/5/. 2 4 3 . . . /. . . . . . 3 /. . . . . . 3 /3 . . . . . 3 /3 . . . . . . /2 . . . . . . /. . . 2 3 4 . /0 0 1 1 /0 1 1 0 /1 1 0 0 /1 1 0 1 /0 1 0 0 /0 0 1 0 1 /0 1 1 1 1 /1 1 0 1 1 /0 1 1 0 0 /" 29 | ] 30 | ], 31 | inputs: [] 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/sashikazune.js: -------------------------------------------------------------------------------- 1 | /* sashikazune.js */ 2 | 3 | ui.debug.addDebugData("sashikazune", { 4 | url: "6/6/3k4h345r1g3h2l", 5 | failcheck: [ 6 | [ 7 | "bkNotLshape", 8 | "pzprv3/sashikazune/6/6/3 . . . . . /4 . . 3 4 5 /. . . . . . /. . . . . . /1 . 3 . . 2 /. . . . . . /0 0 1 0 1 /1 1 1 0 1 /1 0 1 0 1 /0 1 0 0 1 /0 1 0 0 1 /0 0 0 0 0 /1 1 0 0 0 0 /0 0 1 0 0 0 /0 1 1 0 0 0 /0 0 0 0 0 0 /1 1 1 1 1 0 /" 9 | ], 10 | [ 11 | "nmDistNe", 12 | "pzprv3/sashikazune/6/6/3 . . . . . /4 . . 3 4 5 /. . . . . . /. . . . . . /1 . 3 . . 2 /. . . . . . /1 0 0 0 0 /1 0 0 0 0 /0 0 1 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 /1 1 1 0 0 0 /0 0 0 0 0 0 /0 0 0 0 0 0 /" 13 | ], 14 | [ 15 | "bkNumGt2", 16 | "pzprv3/sashikazune/6/6/3 . . . . . /4 . . 3 4 5 /. . . . . . /. . . . . . /1 . 3 . . 2 /. . . . . . /0 0 0 0 0 /1 0 0 0 0 /1 0 0 0 0 /1 0 0 0 0 /0 0 1 0 0 /0 0 0 0 0 /1 0 0 0 0 0 /0 0 0 0 0 0 /0 0 0 0 0 0 /0 1 1 0 0 0 /1 1 1 0 0 0 /" 17 | ], 18 | [ 19 | "bdDeadEnd", 20 | "pzprv3/sashikazune/6/6/3 . . . . . /4 . . 3 4 5 /. . . . . . /. . . . . . /1 . 3 . . 2 /. . . . . . /0 0 0 0 1 /0 0 0 0 1 /0 0 0 0 1 /0 0 0 0 1 /0 0 0 0 1 /0 0 0 0 0 /1 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 1 1 1 0 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/sashikazune/6/6/3 . . . . . /4 . . 3 4 5 /. . . . . . /. . . . . . /1 . 3 . . 2 /. . . . . . /0 0 1 1 1 /1 1 1 1 1 /1 0 1 1 1 /1 0 0 1 1 /0 1 0 0 1 /0 0 0 0 0 /1 1 0 0 0 0 /0 0 1 0 0 0 /0 1 1 0 0 0 /0 1 1 1 0 0 /1 1 1 1 1 0 /" 25 | ] 26 | ], 27 | inputs: [ 28 | { 29 | input: [ 30 | "newboard,2,1", 31 | "playmode,diraux", 32 | "mouse,left,1,1,3,1", 33 | "mouse,left,1,1,1,3" 34 | ], 35 | result: "pzprv3/sashikazune/1/2/. . /0 /40 0 /" 36 | }, 37 | { 38 | input: ["mouse,left,1,1,3,1"], 39 | result: "pzprv3/sashikazune/1/2/. . /0 /8 0 /" 40 | } 41 | ] 42 | }); 43 | -------------------------------------------------------------------------------- /test/script/simplegako.js: -------------------------------------------------------------------------------- 1 | /* simplegako.js */ 2 | 3 | ui.debug.addDebugData("simplegako", { 4 | url: "4/4/k5g12g2k", 5 | failcheck: [ 6 | [ 7 | "nmCountLt", 8 | "pzprv3/simplegako/4/4/. . . . /. 5 . 1 /2 . 2 . /. . . . /5 5 . . /5 . . . /. 5 . . /5 5 . . /" 9 | ], 10 | [ 11 | "nmCountGt", 12 | "pzprv3/simplegako/4/4/. . . . /. 5 . 1 /2 . 2 . /. . . . /5 5 5 . /5 . 5 . /. 2 . . /5 5 5 . /" 13 | ], 14 | [ 15 | "ceNoNum", 16 | "pzprv3/simplegako/4/4/. . . . /. 5 . 1 /2 . 2 . /. . . . /5 5 5 . /5 . 5 . /. 1 . . /5 5 5 . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/simplegako/4/4/. . . . /. 5 . 1 /2 . 2 . /. . . . /5 5 5 3 /5 . 5 . /. 1 . 3 /5 5 5 3 /" 21 | ] 22 | ], 23 | inputs: [ 24 | { 25 | label: "Click", 26 | input: [ 27 | "newboard,2,2", 28 | "playmode", 29 | "cursor,1,1", 30 | "mouse,left,1,1", 31 | "mouse,left,1,1", 32 | "cursor,3,3", 33 | "mouse,right,3,3" 34 | ], 35 | result: "pzprv3/simplegako/2/2/. . /. . /2 . /. 3 /" 36 | }, 37 | { 38 | label: "Drag", 39 | input: ["mouse,left,1,1,3,1,3,3"], 40 | result: "pzprv3/simplegako/2/2/. . /. . /2 2 /. 2 /" 41 | } 42 | ] 43 | }); 44 | -------------------------------------------------------------------------------- /test/script/simpleloop.js: -------------------------------------------------------------------------------- 1 | ui.debug.addDebugData("simpleloop", { 2 | url: "5/5/sg020", 3 | failcheck: [ 4 | [ 5 | "lnBranch", 6 | "pzprv3/simpleloop/5/5/* * * . . /* . . . . /. . . . . /. . . * . /. . . . . /0 0 0 0 /0 0 1 1 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 0 /0 0 0 1 0 /0 0 0 0 0 /0 0 0 0 0 /" 7 | ], 8 | [ 9 | "lnCross", 10 | "pzprv3/simpleloop/5/5/* * * . . /* . . . . /. . . . . /. . . * . /. . . . . /0 0 0 0 /0 0 1 1 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 1 0 /0 0 0 1 0 /0 0 0 0 0 /0 0 0 0 0 /" 11 | ], 12 | [ 13 | "lnDeadEnd", 14 | "pzprv3/simpleloop/5/5/* * * . . /* . . . . /. . . . . /. . . * . /. . . . . /0 0 0 0 /0 0 1 0 /0 1 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 0 /0 0 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 15 | ], 16 | [ 17 | "ceNoLine", 18 | "pzprv3/simpleloop/5/5/* * * . . /* . . . . /. . . . . /. . . * . /. . . . . /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 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 19 | ], 20 | [ 21 | null, 22 | "pzprv3/simpleloop/5/5/* * * . . /* . . . . /. . . . . /. . . * . /. . . . . /0 0 0 1 /0 1 0 0 /1 0 1 0 /0 1 0 0 /1 0 1 1 /0 0 0 1 1 /0 1 1 1 1 /1 0 0 0 1 /1 1 1 0 1 /" 23 | ] 24 | ] 25 | }); 26 | -------------------------------------------------------------------------------- /test/script/skyscrapers.js: -------------------------------------------------------------------------------- 1 | /* skyscrapers.js */ 2 | 3 | ui.debug.addDebugData("skyscrapers", { 4 | url: "4/4/k13h4j3g", 5 | failcheck: [ 6 | [ 7 | "nmDupRow", 8 | "pzprv3/skyscrapers/4/4/. . . . . . /. . . . . . /4 1 2 3 3 . /. . . . . 3 /. . . . . . /. . 1 3 . . /" 9 | ], 10 | [ 11 | "nmSightNe", 12 | "pzprv3/skyscrapers/4/4/. . . . . . /. . . . . . /4 1 2 3 4 . /. 4 . . . 3 /. . 4 . . . /. . 1 3 . . /" 13 | ], 14 | [ 15 | "ceNoNum", 16 | "pzprv3/skyscrapers/4/4/. . . . . . /. . 1 4 3 . /4 1 2 3 4 . /. 4 3 1 2 3 /. 3 4 2 1 . /. . 1 3 . . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/skyscrapers/4/4/. . . . . . /. 2 1 4 3 . /4 1 2 3 4 . /. 4 q3 1 2 3 /. 3 4 2 1 . /. . 1 3 . . /", 21 | { skiprules: true } 22 | ], 23 | [ 24 | null, 25 | "pzprv3/skyscrapers/4/4/. . . . . . /. 2 1 4 3 . /4 1 2 3 4 . /. 4 3 1 2 3 /. 3 4 2 1 . /. . 1 3 . . /" 26 | ] 27 | ], 28 | inputs: [ 29 | { 30 | input: [ 31 | "newboard,3,3", 32 | "editmode", 33 | "cursor,3,-1", 34 | "key,2", 35 | "cursor,3,3", 36 | "mouse,leftx2,3,3" 37 | ], 38 | result: 39 | "pzprv3/skyscrapers/3/3/. . 2 . . /. . . . . /. . q1 . . /. . . . . /. . . . . /" 40 | }, 41 | { 42 | input: ["playmode", "cursor,1,3", "key,3,right,3,right,3"], 43 | result: 44 | "pzprv3/skyscrapers/3/3/. . 2 . . /. . . . . /. 3 q1 3 . /. . . . . /. . . . . /" 45 | } 46 | ] 47 | }); 48 | -------------------------------------------------------------------------------- /test/script/smullyan.js: -------------------------------------------------------------------------------- 1 | /* smullyan.js */ 2 | 3 | ui.debug.addDebugData("smullyan", { 4 | url: "5/5/1122120322233212322211112", 5 | failcheck: [ 6 | [ 7 | "csAdjacent", 8 | "pzprv3/smullyan/5/5/1 1 2 2 1 /2 0 3 2 2 /2 3 3 2 1 /2 3 2 2 2 /1 1 1 1 2 /. . . . . /. # . . . /# . . . . /# . . . . /. . # . . /" 9 | ], 10 | [ 11 | "cuDivideRB", 12 | "pzprv3/smullyan/5/5/1 1 2 2 1 /2 0 3 2 2 /2 3 3 2 1 /2 3 2 2 2 /1 1 1 1 2 /. . . . . /. . . . . /. # . . . /# . # . . /. . . # . /" 13 | ], 14 | [ 15 | "nmShadeGt", 16 | "pzprv3/smullyan/5/5/1 1 2 2 1 /2 0 3 2 2 /2 3 3 2 1 /2 3 2 2 2 /1 1 1 1 2 /. . . # . /. # . . . /. . # . # /. # . # . /. . . . . /" 17 | ], 18 | [ 19 | "nmShadeEq", 20 | "pzprv3/smullyan/5/5/1 1 2 2 1 /2 0 3 2 2 /2 3 3 2 1 /2 3 2 2 2 /1 1 1 1 2 /. . . . # /. # . # . /# . . . . /. # . . # /. . . . . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/smullyan/5/5/1 1 2 2 1 /2 0 3 2 2 /2 3 3 2 1 /2 3 2 2 2 /1 1 1 1 2 /+ + + # + /+ # + + + /# + + # + /+ # + + + /+ + + + # /" 25 | ] 26 | ] 27 | }); 28 | -------------------------------------------------------------------------------- /test/script/snake.js: -------------------------------------------------------------------------------- 1 | /* snake.js */ 2 | 3 | ui.debug.addDebugData("snake", { 4 | url: "4/4/060300g1h4i", 5 | failcheck: [ 6 | [ 7 | "csDivide", 8 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 0 0 /. 0 0 5 4 /. 0 0 4 0 /" 9 | ], 10 | [ 11 | "shBranch", 12 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 4 0 /. 0 0 5 0 /. 0 0 4 0 /" 13 | ], 14 | [ 15 | "cs2x2", 16 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 4 4 /. 0 0 5 0 /. 0 0 4 0 /" 17 | ], 18 | [ 19 | "exShadeNe", 20 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 0 /. 6 0 4 0 /. 0 0 5 0 /. 0 0 4 0 /" 21 | ], 22 | [ 23 | "circleUnshade", 24 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 0 0 /. 0 0 1 0 /. 0 0 0 0 /" 25 | ], 26 | [ 27 | "shLoop", 28 | "pzprv3/snake/4/4/. . . . . /4 4 4 4 4 /. 4 0 0 4 /. 4 0 5 4 /. 4 4 4 0 /" 29 | ], 30 | [ 31 | "shEndpoint", 32 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 0 4 /. 4 0 5 4 /. 4 0 4 0 /" 33 | ], 34 | [ 35 | "shMidpoint", 36 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 0 4 /. 0 0 5 4 /. 0 0 0 0 /" 37 | ], 38 | [ 39 | "shDiag", 40 | "pzprv3/snake/4/4/. . 1 . . /4 0 0 0 0 /. 6 4 0 4 /. 0 0 5 4 /. 0 0 4 0 /" 41 | ], 42 | [ 43 | null, 44 | "pzprv3/snake/4/4/. . 1 . . /4 4 4 4 4 /. 6 0 0 4 /. 0 0 5 4 /. 0 0 4 0 /" 45 | ] 46 | ], 47 | inputs: [ 48 | { 49 | input: ["newboard,2,2", "editmode,number", "mouse,rightx2,3,-1"], 50 | result: "pzprv3/snake/2/2/. . 2 /. 0 0 /. 0 0 /" 51 | }, 52 | { 53 | input: ["playmode", "mouse,left,3,-1", "mouse,right,3,3"], 54 | result: "pzprv3/snake/2/2/. . c2 /. 0 0 /. 0 8 /" 55 | }, 56 | { 57 | input: ["editmode,auto", "cursor,-1,1", "key,1,right,1"], 58 | result: "pzprv3/snake/2/2/. . c2 /1 1 0 /. 0 8 /" 59 | } 60 | ] 61 | }); 62 | -------------------------------------------------------------------------------- /test/script/squarejam.js: -------------------------------------------------------------------------------- 1 | /* squarejam.js */ 2 | 3 | ui.debug.addDebugData("squarejam", { 4 | url: "6/6/i3s32s1i", 5 | failcheck: [ 6 | [ 7 | "bkNotSquare", 8 | "pzprv3/squarejam/6/6/. . . 3 . . /. . . . . . /. . . . . 3 /2 . . . . . /. . . . . . /. . 1 . . . /0 1 0 0 0 /0 1 0 0 0 /0 1 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 0 0 0 0 0 /0 0 1 1 1 1 /0 0 0 0 0 0 /0 0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkSideNe", 12 | "pzprv3/squarejam/6/6/. . . 3 . . /. . . . . . /. . . . . 3 /2 . . . . . /. . . . . . /. . 1 . . . /1 0 1 0 0 /1 0 1 0 0 /0 0 1 0 0 /0 0 1 0 0 /0 0 1 0 0 /1 1 1 0 0 /1 0 0 0 0 0 /1 1 1 0 0 0 /0 0 0 1 1 1 /0 0 0 0 0 0 /1 1 1 0 0 0 /" 13 | ], 14 | [ 15 | "bdCross", 16 | "pzprv3/squarejam/6/6/. . . 3 . . /. . . . . . /. . . . . 3 /2 . . . . . /. . . . . . /. . 1 . . . /0 0 1 0 0 /0 0 1 0 0 /0 0 1 0 0 /0 1 0 1 1 /0 1 0 1 0 /1 1 1 1 0 /0 0 0 0 0 0 /0 0 0 0 0 0 /1 1 1 1 1 1 /0 0 0 0 1 1 /1 1 1 1 0 0 /" 17 | ], 18 | [ 19 | "bdDeadEnd", 20 | "pzprv3/squarejam/6/6/. . . 3 . . /. . . . . . /. . . . . 3 /2 . . . . . /. . . . . . /. . 1 . . . /1 1 1 0 0 /1 0 1 0 0 /0 1 1 0 0 /0 1 0 1 1 /0 1 0 1 0 /0 1 1 1 0 /1 0 0 0 0 0 /1 1 1 0 0 0 /0 0 1 1 1 1 /1 1 0 0 1 1 /0 0 1 1 0 0 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/squarejam/6/6/. . . 3 . . /. . . . . . /. . . . . 3 /2 . . . . . /. . . . . . /. . 1 . . . /1 0 1 0 0 /1 0 1 0 0 /0 1 1 0 0 /0 1 0 1 1 /0 1 0 1 0 /0 1 1 1 0 /1 0 0 0 0 0 /1 1 1 0 0 0 /0 0 1 1 1 1 /1 1 0 0 1 1 /0 0 1 1 0 0 /" 25 | ] 26 | ] 27 | }); 28 | -------------------------------------------------------------------------------- /test/script/statuepark-aux.js: -------------------------------------------------------------------------------- 1 | /* statuepark-aux.js */ 2 | 3 | ui.debug.addDebugData("statuepark-aux", { 4 | url: "4/4/23bg", 5 | failcheck: [[null, "pzprv3/statuepark-aux/4/4/23bg"]], 6 | inputs: [] 7 | }); 8 | -------------------------------------------------------------------------------- /test/script/subomino.js: -------------------------------------------------------------------------------- 1 | /* subomino.js */ 2 | 3 | ui.debug.addDebugData("subomino", { 4 | url: "5/5/3j6j3i4o410000", 5 | failcheck: [ 6 | [ 7 | "bkSizeNe", 8 | "pzprv3/subomino/5/5/3 . . . * /6 . . . . /3 . . . 4 /. . . . . /. . . . 4 /0 0 0 1 0 0 /0 0 1 0 1 0 /0 1 0 1 1 0 /0 1 1 1 1 0 /0 1 0 0 1 0 /0 0 0 0 0 /1 1 1 0 0 /1 0 1 0 0 /0 1 0 1 0 /0 0 1 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkOverlap", 12 | "pzprv3/subomino/5/5/3 . . . * /6 . . . . /3 . . . 4 /. . . . . /. . . . 4 /0 0 0 1 0 0 /0 0 0 0 1 0 /0 1 1 1 0 0 /0 1 0 0 1 0 /0 1 0 0 0 0 /0 0 0 0 0 /1 1 1 0 0 /1 1 0 1 0 /0 0 1 1 0 /0 1 1 1 1 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | null, 16 | "pzprv3/subomino/5/5/3 . . . * /6 . . . . /3 . . . 4 /. . . . . /. . . . 4 /0 0 0 1 0 0 /0 0 1 0 1 0 /0 1 0 1 1 0 /0 1 1 0 1 0 /0 1 0 0 1 0 /0 0 0 0 0 /1 1 1 0 0 /1 0 1 0 0 /0 1 0 1 0 /0 0 1 1 0 /0 0 0 0 0 /" 17 | ] 18 | ], 19 | inputs: [ 20 | { 21 | input: ["newboard,3,3", "editmode", "cursor,3,3", "mouse,right,3,3"], 22 | result: 23 | "pzprv3/subomino/3/3/. . . /. 9 . /. . . /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 /0 0 0 /0 0 0 /0 0 0 /" 24 | }, 25 | { 26 | input: ["editmode,clear", "mouse,left,3,3"], 27 | result: 28 | "pzprv3/subomino/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 /" 29 | } 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/sudoku.js: -------------------------------------------------------------------------------- 1 | /* sudoku.js */ 2 | 3 | ui.debug.addDebugData("sudoku", { 4 | url: "4/4/g1k23k3g", 5 | failcheck: [ 6 | [ 7 | "bkDupNum", 8 | "pzprv3/sudoku/4/. 1 . . /. . . 2 /3 . . . /. . 3 . /. . . . /1 . . . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "nmDupRow", 12 | "pzprv3/sudoku/4/. 1 . . /. . . 2 /3 . . . /. . 3 . /. . . . /. . . . /. . . . /. 1 . . /" 13 | ], 14 | [ 15 | "ceNoNum", 16 | "pzprv3/sudoku/4/. 1 . . /. . . 2 /3 . . . /. . 3 . /2 . . . /. . . . /. 4 2 . /1 2 . . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/sudoku/4/. 1 . . /. . . 2 /3 . . . /. . 3 . /2 . 4 3 /4 3 1 . /. 4 2 1 /1 2 . 4 /" 21 | ] 22 | ], 23 | inputs: [ 24 | /* 問題入力はhitoriと同じなので省略 */ 25 | /* 回答入力はminarismと同じなので省略 */ 26 | ] 27 | }); 28 | -------------------------------------------------------------------------------- /test/script/sukororoom.js: -------------------------------------------------------------------------------- 1 | /* sukororoom.js */ 2 | 3 | ui.debug.addDebugData("sukororoom", { 4 | url: "5/5/4vjbtnfpb3i2i3b", 5 | failcheck: [ 6 | ["brNoValidNum", "pzprv3/sukororoom/5/5"], 7 | [ 8 | "bkDupNum", 9 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . 2 . . /. . . . . /. . 3 . . /3 . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 10 | ], 11 | [ 12 | "bkMixed", 13 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . 2 . . /. . . . . /. . 3 . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 14 | ], 15 | [ 16 | "nmNumberNe", 17 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . 2 . . /. . . . . /. . 3 . . /1 4 . . . /. . . . . /. . . . . /. . + . . /. + . . . /" 18 | ], 19 | [ 20 | "nmDivide", 21 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . . . . /. . . . . /. . 3 . . /1 2 . + + /- - + + . /. - . . . /. . + + + /. + . + . /" 22 | ], 23 | [ 24 | "ceSuspend", 25 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . 2 . . /. . . . . /. . 3 . . /1 2 . + + /- - + + . /. - . . . /. . + + + /. + . + . /" 26 | ], 27 | [ 28 | null, 29 | "pzprv3/sukororoom/5/5/0 0 1 0 /0 1 1 1 /1 1 1 0 /0 1 1 0 /1 0 1 1 /1 1 1 0 1 /1 0 1 1 1 /0 1 1 1 1 /1 1 0 0 1 /. . 3 . . /. . . . . /. . 2 . . /. . . . . /. . 3 . . /1 2 . 3 1 /- - 3 2 - /1 - . - - /2 3 4 3 1 /- 2 . 2 - /" 30 | ] 31 | ], 32 | inputs: [ 33 | /* 問題入力はsukoro, heyawakeと同じなので省略 */ 34 | /* 回答入力はsukoroと同じなので省略 */ 35 | ] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/tachibk.js: -------------------------------------------------------------------------------- 1 | /* tachibk.js */ 2 | 3 | ui.debug.addDebugData("tachibk", { 4 | url: "4/4/3g2g2k13j", 5 | failcheck: [ 6 | [ 7 | "bkSizeGt", 8 | "pzprv3/tachibk/4/4/3 . 2 . /2 . . . /. . 1 3 /. . . . /0 0 0 /1 0 1 /1 0 1 /1 0 0 /1 0 1 1 /0 0 1 0 /1 1 1 0 /" 9 | ], 10 | [ 11 | "bkSizeLt", 12 | "pzprv3/tachibk/4/4/3 . 2 . /2 . . . /. . 1 3 /. . . . /0 0 1 /0 0 0 /0 0 0 /0 0 0 /0 0 1 0 /0 0 0 0 /0 0 0 0 /" 13 | ], 14 | [ 15 | "bankNe", 16 | "pzprv3/tachibk/4/4/3 . 2 . /. . . . /. . . 3 /. . . . /0 0 0 /1 0 1 /1 0 1 /0 0 1 /0 1 1 1 /1 0 0 0 /1 1 1 0 /" 17 | ], 18 | [ 19 | "ceOverlap", 20 | "pzprv3/tachibk/4/4/3 . 2 . /2 . . . /. . 1 3 /. . . . /0 0 0 /1 0 1 /1 0 1 /1 0 1 /1 0 1 1 /0 1 1 0 /1 1 1 0 /" 21 | ], 22 | [ 23 | "bdDeadEnd", 24 | "pzprv3/tachibk/4/4/. . . . /2 . . . /. . 1 . /. . . . /1 0 0 /0 0 0 /0 0 1 /0 0 0 /1 1 0 0 /1 1 1 1 /1 0 1 1 /", 25 | { skiprules: true } 26 | ], 27 | [ 28 | null, 29 | "pzprv3/tachibk/4/4/3 . 2 . /2 . . . /. . 1 3 /. . . . /0 0 0 /1 0 1 /1 0 1 /1 0 0 /1 0 1 1 /0 1 1 1 /1 1 1 0 /" 30 | ] 31 | ], 32 | inputs: [ 33 | { 34 | label: "Enforce even amount of columns", 35 | input: ["newboard,5,2"], 36 | result: "pzprv3/tachibk/2/4/. . . . /. . . . /0 0 0 /0 0 0 /0 0 0 0 /" 37 | }, 38 | { 39 | label: "Maximum number", 40 | input: ["newboard,6,3", "cursor,11,1", "mouse,right,11,1"], 41 | result: 42 | "pzprv3/tachibk/3/6/. . . . . 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 0 0 0 /" 43 | }, 44 | { 45 | label: "Don't draw over center grid border", 46 | input: ["newboard,4,3", "playmode", "mouse,right,3,5,3,3,5,3,5,1"], 47 | result: 48 | "pzprv3/tachibk/3/4/. . . . /. . . . /. . . . /0 0 0 /0 0 0 /0 0 0 /0 0 -1 0 /0 -1 0 0 /" 49 | } 50 | ] 51 | }); 52 | -------------------------------------------------------------------------------- /test/script/tasquare.js: -------------------------------------------------------------------------------- 1 | /* tasquare.js */ 2 | 3 | ui.debug.addDebugData("tasquare", { 4 | url: "6/6/1g.i4j1i3j5i5j.i2g1", 5 | failcheck: [ 6 | ["brNoShade", "pzprv3/tasquare/6/6"], 7 | [ 8 | "csNotSquare", 9 | "pzprv3/tasquare/6/6/1 # - . . . /4 # # . . 1 /. . . 3 . . /. . 5 . . . /5 . . . . - /. . . 2 . 1 /" 10 | ], 11 | [ 12 | "cuDivide", 13 | "pzprv3/tasquare/6/6/1 . - # . . /4 . # . . 1 /. # . 3 . . /# . 5 . . . /5 . . . . - /. . . 2 . 1 /" 14 | ], 15 | [ 16 | "nmSumSizeNe", 17 | "pzprv3/tasquare/6/6/1 # - . . . /4 . . . . 1 /# # . 3 . . /# # 5 . . . /5 . . . . - /. . . 2 . 1 /" 18 | ], 19 | [ 20 | "nmNoSideShade", 21 | "pzprv3/tasquare/6/6/1 # - . . # /4 . . # . 1 /# # . 3 # . /# # 5 # . . /5 . . . . - /# . # 2 # 1 /" 22 | ], 23 | [ 24 | null, 25 | "pzprv3/tasquare/6/6/1 # - + + # /4 + + # + 1 /# # + 3 # + /# # 5 # + # /5 . + + + - /# . # 2 # 1 /" 26 | ] 27 | ], 28 | inputs: [] /* nurikabeと同じなので省略 */ 29 | }); 30 | -------------------------------------------------------------------------------- /test/script/teri.js: -------------------------------------------------------------------------------- 1 | /* teri.js */ 2 | 3 | ui.debug.addDebugData("teri", { 4 | url: "4/4/3h6q4", 5 | failcheck: [ 6 | [ 7 | "csAdjacent", 8 | "pzprv3/teri/4/4/3 . . 6 /. . . . /. . . . /. . . 4 /. # . . /. . . # /. . . . /# # . . /" 9 | ], 10 | [ 11 | "cuDivideRB", 12 | "pzprv3/teri/4/4/3 . . 6 /. . . . /. . . . /. . . 4 /. # . . /. . # . /. # . . /# . . . /" 13 | ], 14 | [ 15 | "nmSumViewNe", 16 | "pzprv3/teri/4/4/3 . . 6 /. . . . /. . . . /. . . 4 /. . . . /# . . . /. . . # /. . . . /" 17 | ], 18 | [ 19 | "nmSumViewNe", 20 | "pzprv3/teri/4/4/3 . . 6 /. . . . /. . . . /. . . 4 /. # . . /. . . . /. . # . /# . . . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/teri/4/4/3 . . 6 /. . . . /. . . . /. . . 4 /. # + . /+ + + + /+ + + + /# + # . /" 25 | ] 26 | ], 27 | inputs: [ 28 | { 29 | input: [ 30 | "newboard,2,2", 31 | "playmode", 32 | "mouse,right,1,1", 33 | "mouse,alt+left,1,1,3,1,3,3" 34 | ], 35 | result: "pzprv3/teri/2/2/. . /. . /+ . /. . /-1 /0 /0 -1 /" 36 | }, 37 | { 38 | input: ["mouse,left,3,1", "playmode,info-ublk", "mouse,left,1,1"], 39 | result: function(puzzle, assert) { 40 | var bd = puzzle.board; 41 | assert.equal(bd.getc(1, 1).qinfo, 2); 42 | assert.equal(bd.getc(1, 3).qinfo, 2); 43 | assert.equal(bd.getc(3, 3).qinfo, 0); 44 | } 45 | } 46 | ] 47 | }); 48 | -------------------------------------------------------------------------------- /test/script/tetrochain.js: -------------------------------------------------------------------------------- 1 | /* tetrochain.js */ 2 | 3 | ui.debug.addDebugData("tetrochain", { 4 | url: "6/6/c33d42r10d14c", 5 | failcheck: [ 6 | [ 7 | "csGt4", 8 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /. # # . . . /# # . . # # /. . # . # . /. # # . # . /. . # . # . /. . . # # . /" 9 | ], 10 | [ 11 | "csLt4", 12 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /# # # . . . /. . . . # # /. . # . # . /. . # . # . /. . # . . . /. . . . . . /" 13 | ], 14 | [ 15 | "bsSameShape", 16 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /# # # . . . /. # . . . . /. . # . . . /. . # . . . /. # # . . # /. . . # # # /" 17 | ], 18 | [ 19 | "anShadeNe", 20 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /# # # . . . /# . . . # # /. # . . . # /. # # . . # /. . # . # . /. . . # # # /" 21 | ], 22 | [ 23 | "csDivide", 24 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /# # # . . . /. # . . # # /. . # . # # /. . # . . . /. # # . . . /. . . . . . /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/tetrochain/6/6/. . . 3,3 . . /. . 4,2 . . . /. . . . . . /. . . . . . /. . . 1,0 . . /. . 1,4 . . . /# # # + + + /+ # + + # # /+ + # + + # /+ + # + + # /+ # # + # + /+ + + # # # /" 29 | ] 30 | ], 31 | inputs: [] 32 | }); 33 | -------------------------------------------------------------------------------- /test/script/tetrominous.js: -------------------------------------------------------------------------------- 1 | /* tetrominous.js */ 2 | 3 | ui.debug.addDebugData("tetrominous", { 4 | url: "4/4/1h1k3l", 5 | failcheck: [ 6 | [ 7 | null, 8 | "pzprv3/tetrominous/5/5/* 1 . . . /* . . 3 . /. . 2 . . /4 . . . 0 /. * * * . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /0 0 1 0 /0 1 0 1 /1 1 0 1 /0 1 0 1 /0 0 0 0 /0 0 1 0 1 /0 0 1 1 0 /0 1 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkSizeLt", 12 | "pzprv3/tetrominous/4/4/1 . . 1 /. . . . /. 3 . . /. . . . /. . . . /. . . . /. . . . /. . . . /0 1 0 /1 0 0 /0 0 0 /0 0 0 /0 1 0 0 /1 0 0 0 /0 0 0 0 /" 13 | ], 14 | [ 15 | "bkSizeGt", 16 | "pzprv3/tetrominous/4/4/1 . . 1 /. . . . /. 3 . . /. . . . /. . . . /. . . . /. . . . /. . . . /0 0 1 /0 0 1 /0 1 0 /0 0 0 /0 0 0 0 /0 0 1 0 /0 0 1 1 /" 17 | ], 18 | [ 19 | "nmShapeNe", 20 | "pzprv3/tetrominous/4/4/1 . . 1 /. . . . /. 3 . . /. . . . /. . . . /. 3 . . /. . 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 /" 21 | ], 22 | [ 23 | "bsSameShape", 24 | "pzprv3/tetrominous/4/4/1 . . 1 /. . . . /. 3 . . /. . . . /. . . . /. . . . /. . . . /. . . . /0 0 1 /1 0 1 /0 1 0 /0 0 0 /0 1 1 0 /1 0 1 0 /1 1 1 1 /" 25 | ], 26 | [ 27 | "bdUnused", 28 | "pzprv3/tetrominous/4/4/. . . . /. . . . /. . . . /. . . . /. . . . /. . . . /. . . . /. . . . /X 1 0 /0 1 1 /0 0 1 /0 0 0 /0 0 1 0 /1 1 0 0 /1 1 1 0 /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/tetrominous/4/4/1 . . 1 /. . . . /. 3 . . /. . . . /. 1 3 . /1 3 3 1 /1 . 1 1 /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 0 0 0 /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/toichika.js: -------------------------------------------------------------------------------- 1 | /* toichika.js */ 2 | 3 | ui.debug.addDebugData("toichika", { 4 | url: "4/4/n70kt84j", 5 | failcheck: [ 6 | [ 7 | "bkNumGe2", 8 | "pzprv3/toichika/4/4/6/0 1 1 2 /3 1 2 2 /3 3 4 5 /3 4 4 4 /4 . . . /. . . . /. . . . /. . . . /. . . . /2 . . . /. . . . /4 . . . /" 9 | ], 10 | [ 11 | "arAdjPair", 12 | "pzprv3/toichika/4/4/6/0 1 1 2 /3 1 2 2 /3 3 4 5 /3 4 4 4 /4 . . . /. . . . /. . . . /. . . . /. + 3 . /. + . . /. . . . /. . . . /" 13 | ], 14 | [ 15 | "arAlone", 16 | "pzprv3/toichika/4/4/6/0 1 1 2 /3 1 2 2 /3 3 4 5 /3 4 4 4 /4 . . . /. . . . /. . . . /. . . . /. + + 3 /. 2 + + /. . . . /. . . . /" 17 | ], 18 | [ 19 | "bkNoNum", 20 | "pzprv3/toichika/4/4/6/0 1 1 2 /3 1 2 2 /3 3 4 5 /3 4 4 4 /4 . . . /. . . . /. . . . /. . . . /. + + 3 /. 2 + + /. + . . /. 1 . . /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/toichika/4/4/6/0 1 1 2 /3 1 2 2 /3 3 4 5 /3 4 4 4 /4 . . . /. . . . /. . . . /. . . . /. + + 3 /+ 2 + + /4 + + 3 /+ 1 + + /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力はromaと同じなので省略 */ 29 | /* 回答入力テスト */ 30 | /* 矢印の入力はromaと同じ */ 31 | { input: ["newboard,5,2", "playmode"] }, 32 | { 33 | input: [ 34 | "cursor,1,1", 35 | "key,1", 36 | "key,right,2", 37 | "key,right,3", 38 | "key,right,4" 39 | ] 40 | }, 41 | { 42 | input: [ 43 | "cursor,0,0", 44 | "mouse,right, 1,1, 3,1", 45 | "mouse,right, 1,3, 5,3", 46 | "mouse,right, 3,3, 7,3, 7,1" 47 | ], 48 | result: 49 | "pzprv3/toichika/2/5/1/0 0 0 0 0 /0 0 0 0 0 /. . . . . /. . . . . /+ + 2 . . /+ . . . . /" 50 | } 51 | ] 52 | }); 53 | -------------------------------------------------------------------------------- /test/script/tontti.js: -------------------------------------------------------------------------------- 1 | /* tontti.js */ 2 | 3 | ui.debug.addDebugData("tontti", { 4 | url: "4/4/2g3l1l", 5 | failcheck: [ 6 | [ 7 | "lnCross", 8 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /0 1 1 0 0 /0 0 0 0 0 /0 1 1 1 0 /0 0 0 0 /0 0 0 0 /1 0 1 0 /1 0 1 1 /0 0 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 9 | ], 10 | [ 11 | "lnOverlap", 12 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 1 1 0 /0 1 1 0 0 /0 0 0 0 0 /0 1 1 0 0 /0 1 0 0 /0 1 0 0 /1 0 1 0 /1 0 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 13 | ], 14 | [ 15 | "lnDeadEnd", 16 | "pzprv3/tontti/3/3/2 . 3 /. . . /. . . /0 0 0 0 /0 1 0 0 /0 0 0 0 /0 1 0 /0 1 0 /0 1 0 /0 1 0 /0 0 0 /0 0 0 /0 0 0 /" 17 | ], 18 | [ 19 | "bkNoNum", 20 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /0 1 0 1 1 /0 0 0 0 0 /0 1 1 0 0 /0 1 0 0 /0 1 0 0 /1 0 1 0 /1 0 1 0 /0 1 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 21 | ], 22 | [ 23 | "lnAdjacent", 24 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /1 1 1 0 1 /1 0 0 0 0 /0 1 1 0 0 /0 0 0 0 /0 0 0 1 /0 0 1 0 /1 0 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 25 | ], 26 | [ 27 | "bkNumGe2", 28 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /0 1 1 0 0 /0 0 0 0 0 /0 1 1 0 0 /0 0 0 0 /0 0 0 0 /1 0 1 0 /1 0 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 29 | ], 30 | [ 31 | "bkSizeNe", 32 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /0 1 1 0 0 /0 0 0 1 0 /0 1 1 0 0 /0 1 0 0 /0 1 0 0 /1 0 1 0 /1 0 1 1 /0 0 0 1 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 33 | ], 34 | [ 35 | null, 36 | "pzprv3/tontti/4/4/2 . 3 . /. . . . /. 1 . . /. . . . /0 0 0 0 0 /0 1 1 0 0 /0 0 0 1 1 /0 1 1 0 0 /0 1 0 0 /0 1 0 0 /1 0 1 0 /1 0 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /" 37 | ] 38 | ], 39 | inputs: [] 40 | }); 41 | -------------------------------------------------------------------------------- /test/script/triplace.js: -------------------------------------------------------------------------------- 1 | /* triplace.js */ 2 | 3 | ui.debug.addDebugData("triplace", { 4 | url: "5/5/@2m_m@1m_.0.1....11", 5 | failcheck: [ 6 | [ 7 | "bkSizeLt3", 8 | "pzprv3/triplace/5/5/0 -1 0 -1 1 -1 /-1 -1,2 . . . . /-1 . . . -1,-1 . /-1 . . . . . /1 . -1,1 . . . /1 . . . . -1,-1 /0 0 0 0 /1 0 0 0 /1 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /1 0 0 0 0 /0 0 0 0 0 /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "asLblockNe", 12 | "pzprv3/triplace/5/5/0 -1 0 -1 1 -1 /-1 -1,2 . . . . /-1 . . . -1,-1 . /-1 . . . . . /1 . -1,1 . . . /1 . . . . -1,-1 /0 0 0 0 /1 0 0 0 /1 0 0 0 /0 0 0 0 /-1 -1 1 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 1 0 /1 0 1 -1 0 /. - . . . /+ - . . . /+ - . . . /+ . . - . /+ + + - . /" 13 | ], 14 | [ 15 | "bkSizeGt3", 16 | "pzprv3/triplace/5/5/0 -1 0 -1 1 -1 /-1 -1,2 . . . . /-1 . . . -1,-1 . /-1 . . . . . /1 . -1,1 . . . /1 . . . . -1,-1 /0 1 0 0 /1 0 0 0 /1 0 0 0 /0 0 0 0 /-1 -1 1 0 /0 0 1 0 1 /0 0 0 0 0 /0 0 0 1 0 /1 0 1 -1 0 /. - . . . /+ - . . . /+ - . . . /+ . . - . /+ + + - . /" 17 | ], 18 | [ 19 | null, 20 | "pzprv3/triplace/5/5/0 -1 0 -1 1 -1 /-1 -1,2 . . . . /-1 . . . -1,-1 . /-1 . . . . . /1 . -1,1 . . . /1 . . . . -1,-1 /0 1 0 0 /1 0 0 0 /1 0 1 0 /0 0 1 0 /-1 -1 1 0 /0 0 1 0 1 /0 1 1 0 0 /0 0 -1 1 1 /1 0 1 -1 0 /. - + + + /+ - - . . /+ - - . . /+ . - - - /+ + + - . /" 21 | ] 22 | ], 23 | inputs: [ 24 | /* 問題入力はtilepaintと同じなので省略 */ 25 | /* 回答入力はsashigane, kaeroでカバーしているので省略 */ 26 | ] 27 | }); 28 | -------------------------------------------------------------------------------- /test/script/turnaround.js: -------------------------------------------------------------------------------- 1 | ui.debug.addDebugData("turnaround", { 2 | url: "5/5/h0g1l1g2l2g3h", 3 | failcheck: [ 4 | [ 5 | "numNoLine", 6 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 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 0 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 7 | ], 8 | [ 9 | "numNoLine", 10 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 3 . . /0 0 0 0 /1 1 1 1 /1 1 1 0 /0 0 0 1 /0 0 0 0 /0 0 0 0 0 /1 0 0 0 1 /0 0 0 1 1 /0 0 0 0 0 /" 11 | ], 12 | [ 13 | "anTurn", 14 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 3 . . /0 1 1 1 /0 0 0 0 /0 0 0 1 /0 0 0 1 /1 1 0 0 /0 1 0 0 0 /0 0 0 0 1 /1 0 0 1 0 /1 0 0 0 1 /" 15 | ], 16 | [ 17 | "lnBranch", 18 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 3 . . /0 0 0 0 /0 1 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 0 /0 0 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 19 | ], 20 | [ 21 | "lnCross", 22 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 3 . . /0 0 0 0 /0 1 1 0 /0 0 0 0 /0 0 0 0 /0 0 0 0 /0 0 1 0 0 /0 0 1 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 23 | ], 24 | [ 25 | "lnDeadEnd", 26 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. . . . . /. . . . . /2 . 3 . . /1 1 1 1 /0 0 0 0 /1 0 0 0 /0 1 0 0 /1 0 1 0 /0 0 0 0 1 /0 0 0 0 1 /1 0 0 0 0 /1 1 1 1 0 /" 27 | ], 28 | [ 29 | "lnPlLoop", 30 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. . . . . /. . . . . /2 . 3 . . /1 1 1 1 /1 0 1 0 /1 0 1 0 /0 1 0 1 /1 0 1 0 /1 0 0 0 1 /0 1 1 1 1 /1 0 0 0 1 /1 1 1 1 0 /" 31 | ], 32 | [ 33 | null, 34 | "pzprv3/turnaround/5/5/. . 0 . 1 /. . . . . /. 1 . 2 . /. . . . . /2 . 3 . . /1 1 1 1 /1 1 1 0 /1 1 1 0 /0 1 0 1 /1 0 1 0 /1 0 0 0 1 /0 0 0 1 1 /1 0 0 0 1 /1 1 1 1 0 /" 35 | ] 36 | ] 37 | }); 38 | -------------------------------------------------------------------------------- /test/script/usotatami.js: -------------------------------------------------------------------------------- 1 | /* usotatami.js */ 2 | 3 | ui.debug.addDebugData("usotatami", { 4 | url: "5/5/1a13a2d1a1a3a121b3b2", 5 | failcheck: [ 6 | [ 7 | "bdCross", 8 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 1 1 1 1 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 9 | ], 10 | [ 11 | "bkNoNum", 12 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /0 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 1 1 1 1 /0 1 1 1 1 /0 0 0 0 0 /0 0 0 0 0 /" 13 | ], 14 | [ 15 | "bkNumGe2", 16 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /0 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 0 0 0 /1 1 1 1 1 /0 0 0 0 0 /0 0 0 0 0 /0 0 0 0 0 /" 17 | ], 18 | [ 19 | "bkSizeEq", 20 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /0 1 1 1 /1 1 1 1 /1 1 0 1 /1 1 1 1 /0 0 1 1 /1 1 0 0 0 /1 0 1 1 0 /0 0 1 1 0 /1 1 1 0 1 /" 21 | ], 22 | [ 23 | "bdDeadEnd", 24 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /0 1 1 0 /1 1 1 0 /1 1 0 1 /1 1 1 1 /1 0 1 1 /1 1 0 0 1 /1 0 1 1 1 /0 0 1 1 0 /0 1 1 0 1 /" 25 | ], 26 | [ 27 | "bkWidthGt1", 28 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /0 1 1 0 /1 1 1 0 /1 1 0 1 /1 1 1 1 /1 0 1 1 /1 1 0 0 0 /1 0 1 1 1 /0 0 1 1 0 /0 1 1 0 1 /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/usotatami/5/5/1 . 1 3 . /2 . . . . /1 . 1 . 3 /. 1 2 1 . /. 3 . . 2 /-1 1 1 1 /1 1 1 1 /1 1 0 1 /1 1 1 1 /1 0 1 1 /1 1 0 0 -1 /1 -1 1 1 -1 /0 -1 1 1 -1 /0 1 1 0 1 /" 33 | ] 34 | ], 35 | inputs: [ 36 | /* 問題入力, 回答入力はshikaku等と同じなので省略 */ 37 | ] 38 | }); 39 | -------------------------------------------------------------------------------- /test/script/view.js: -------------------------------------------------------------------------------- 1 | /* view.js */ 2 | 3 | ui.debug.addDebugData("view", { 4 | url: "5/5/m401g3g2g101m", 5 | failcheck: [ 6 | ["brNoValidNum", "pzprv3/view/5/5"], 7 | [ 8 | "nmAdjacent", 9 | "pzprv3/view/5/5/. . . . . /. . 4 0 1 /. 3 . 2 . /1 0 1 . . /. . . . . /- - - . . /- - . . . /. . - . . /. . . . . /. 0 . . . /" 10 | ], 11 | [ 12 | "nmSumViewNe", 13 | "pzprv3/view/5/5/. . . . . /. . 4 0 1 /. 3 . 2 . /1 0 1 . . /. . . . . /- - - . + /- - . . . /+ . - . - /. . . + + /- + + . . /" 14 | ], 15 | [ 16 | "nmDivide", 17 | "pzprv3/view/5/5/. . . . . /. . 4 0 1 /. 3 . 4 . /1 0 2 . . /. . . . . /- - - + + /- - . . . /+ . - . - /. . . . + /- + + . . /" 18 | ], 19 | [ 20 | "ceSuspend", 21 | "pzprv3/view/5/5/. . . . . /. . 4 0 1 /. 3 . 2 . /1 0 1 . . /. . . . . /- - - + + /- - . . . /2 . - . - /. . . 0 + /- + + + . /" 22 | ], 23 | [ 24 | null, 25 | "pzprv3/view/5/5/. . . . . /. . 4 0 1 /. 3 . 2 . /1 0 1 . . /. . . . . /- - - 3 0 /- - . . . /2 . - . - /. . . 0 2 /- 1 0 1 . /" 26 | ] 27 | ], 28 | inputs: [ 29 | /* 問題入力, 回答入力はsukoroとほぼ同じなので省略 */ 30 | ] 31 | }); 32 | -------------------------------------------------------------------------------- /test/script/wagiri.js: -------------------------------------------------------------------------------- 1 | /* wagiri.js */ 2 | 3 | ui.debug.addDebugData("wagiri", { 4 | url: "4/4/lebcacja1d2b1d1a", 5 | failcheck: [ 6 | [ 7 | "slLoopGiri", 8 | "pzprv3/wagiri/4/4/. . . . . /. 4 . . 1 /. . 2 . . /0 . . 2 . /. . . . . /. 1 . . /. . 2 . /. 1 . . /. . 1 . /1 2 1 . /2 1 2 . /. . . . /. . . . /" 9 | ], 10 | [ 11 | "crConnSlNe", 12 | "pzprv3/wagiri/4/4/. . . . . /. 4 . . 1 /. . 2 . . /0 . . 2 . /. . . . . /. 1 . . /. . 2 . /. 1 . . /. . 1 . /1 2 1 1 /2 1 1 2 /. . . . /. . . . /" 13 | ], 14 | [ 15 | "slNotLoopWa", 16 | "pzprv3/wagiri/4/4/. . . . . /. 4 . . 1 /. . 2 . . /0 . . 2 . /. . . . . /. 1 . . /. . 2 . /. 1 . . /. . 1 . /1 2 1 1 /2 1 1 1 /1 2 2 . /2 1 2 1 /" 17 | ], 18 | [ 19 | "ceNoSlash", 20 | "pzprv3/wagiri/4/4/. . . . . /. 4 . . 1 /. . 2 . . /0 . . 2 . /. . . . . /. 1 . . /. . 2 . /. 1 . . /. . 1 . /1 2 1 1 /2 1 1 1 /1 2 2 2 /. 1 2 2 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/wagiri/4/4/. . . . . /. 4 . . 1 /. . 2 . . /0 . . 2 . /. . . . . /. 1 . . /. . 2 . /. 1 . . /. . 1 . /1 2 1 1 /2 1 1 1 /1 2 2 2 /2 1 2 2 /" 25 | ] 26 | ], 27 | inputs: [ 28 | /* 問題入力テスト(輪切のみ) */ 29 | { input: ["newboard,4,2", "editmode", "cursor,0,0"] }, 30 | { 31 | input: [ 32 | "mouse,leftx2, 1,1", 33 | "mouse,leftx3, 3,1", 34 | "mouse,leftx4, 5,1", 35 | "mouse,leftx5, 7,1", 36 | "mouse,rightx2, 1,3", 37 | "mouse,rightx3, 3,3", 38 | "mouse,rightx4, 5,3", 39 | "mouse,rightx5, 7,3" 40 | ], 41 | result: 42 | "pzprv3/wagiri/2/4/. . . . . /. . . . . /. . . . . /1 2 - . /- 2 1 . /. . . . /. . . . /" 43 | } 44 | /* 回答入力はgokigenでやっているので省略 */ 45 | ] 46 | }); 47 | -------------------------------------------------------------------------------- /test/script/walllogic.js: -------------------------------------------------------------------------------- 1 | /* walllogic.js */ 2 | 3 | ui.debug.addDebugData("walllogic", { 4 | url: "5/5/h1k2g2i5g5k4h", 5 | failcheck: [ 6 | [ 7 | "brNoLine", 8 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 4 . . /. . . . . /. . . . . /. . . . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "nmConnWallGt", 12 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 4 . . /. . . . . /3 3 3 . . /. . . . . /. . . . . /. . . . . /" 13 | ], 14 | [ 15 | "nmConnWallLt", 16 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 4 . . /. . . . . /. . 3 . . /. . . . . /. . . . . /. . . . . /" 17 | ], 18 | [ 19 | "nmConnNoWall", 20 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 4 . . /. . . . . /. 3 3 . . /. . . . . /. . . . . /. . . . . /" 21 | ], 22 | [ 23 | "lbIsolate", 24 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 3 . . /1 3 . 1 1 /1 1 3 . 1 /. 1 3 3 . /3 . 4 4 2 /1 3 . 4 4 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/walllogic/5/5/. . 1 . . /. . . 2 . /2 . . . 5 /. 5 . . . /. . 4 . . /1 3 . 1 1 /1 1 3 . 1 /. 1 3 3 . /3 . 4 4 2 /3 3 . 4 4 /" 29 | ] 30 | ], 31 | inputs: [ 32 | /* 問題入力テスト */ 33 | /* 回答入力テスト */ 34 | { input: ["newboard,3,3", "playmode"] }, 35 | { 36 | input: ["mouse,left, 1,1, 3,1, 3,3, 5,3"], 37 | result: "pzprv3/walllogic/3/3/. . . /. . . /. . . /4 4 . /. 2 4 /. . . /" 38 | }, 39 | { 40 | input: ["mouse,left, 5,3, 3,3, 3,1, 1,1"], 41 | result: "pzprv3/walllogic/3/3/. . . /. . . /. . . /3 1 . /. 3 3 /. . . /" 42 | }, 43 | { 44 | input: ["mouse,left, 2,3, 1,3, 1,1, 5,1"], 45 | result: "pzprv3/walllogic/3/3/. . . /. . . /. . . /3 1 4 /3 3 3 /. . . /" 46 | }, 47 | { 48 | input: ["mouse,left, 2,3, 1,3, 1,1, 5,1"], 49 | result: "pzprv3/walllogic/3/3/. . . /. . . /. . . /. . . /. 3 3 /. . . /" 50 | } 51 | ] 52 | }); 53 | -------------------------------------------------------------------------------- /test/script/yajirushi.js: -------------------------------------------------------------------------------- 1 | /* yajirushi.js */ 2 | 3 | ui.debug.addDebugData("yajirushi", { 4 | url: "5/5/k.2.g.o..j", 5 | failcheck: [ 6 | [ 7 | "arAdjPair", 8 | "pzprv3/yajirushi/5/5/. . . . . /- 2 - . - /. . . . . /. . . . - /- . . . . /4 3 4 . 3 /. . . 2 . /4 . . . 3 /4 . 3 1 . /. 1 4 . 3 /" 9 | ], 10 | [ 11 | "arAlone", 12 | "pzprv3/yajirushi/5/5/. . . . . /- 2 - . - /. . . . . /. . . . - /- . . . . /4 . . . 3 /. . . 2 . /4 . . . 3 /4 . 3 1 . /. 4 . . 3 /" 13 | ], 14 | [ 15 | "arAlone", 16 | "pzprv3/yajirushi/5/5/. . . . . /- 2 - . - /. . . . . /. . . . - /- . . . . /4 . . 3 2 /. . . 2 . /4 . 3 . 1 /4 . 3 1 . /. 1 4 . 3 /" 17 | ], 18 | [ 19 | "cuNotPointed", 20 | "pzprv3/yajirushi/5/5/. . . . . /- 2 - . - /. . . . . /. . . . - /- . . . . /4 . . . 3 /. . . 2 . /4 . . . 3 /. 1 . 1 . /. 4 . . 3 /" 21 | ], 22 | [ 23 | null, 24 | "pzprv3/yajirushi/5/5/. . . . . /- 2 - . - /. . . . . /. . . . - /- . . . . /4 + + + 3 /. . . 2 . /4 + + + 3 /4 + 3 1 . /. 1 4 + 3 /" 25 | ] 26 | ], 27 | inputs: [] 28 | }); 29 | -------------------------------------------------------------------------------- /test/script/yajirushi2.js: -------------------------------------------------------------------------------- 1 | /* yajirushi2.js */ 2 | 3 | ui.debug.addDebugData("yajirushi2", { 4 | url: "4/4/.hbhd.j", 5 | failcheck: [ 6 | [ 7 | "nmArrowLt", 8 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. . . . /. . . . /. . . . /4 . . 3 /" 9 | ], 10 | [ 11 | "nmArrowGt", 12 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. . 2 . /4 . . 3 /. . 1 . /. . . . /" 13 | ], 14 | [ 15 | "bkDivide", 16 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. 2 . . /4 . . 3 /. 1 . . /4 . 3 . /" 17 | ], 18 | [ 19 | "arAdjPair", 20 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. 2 . . /4 . . 3 /. 1 . . /4 3 . . /" 21 | ], 22 | [ 23 | "arAlone", 24 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. . . . /4 . . 3 /. 4 . . /4 . . . /" 25 | ], 26 | [ 27 | "arAlone", 28 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. 2 . . /4 . . 3 /. . . . /4 1 . 3 /" 29 | ], 30 | [ 31 | null, 32 | "pzprv3/yajirushi2/4/4/- . . 1 /. . . . /3 . . - /. . . . /. 2 . . /4 . . 3 /. 1 . . /4 . . 3 /" 33 | ] 34 | ], 35 | inputs: [] 36 | }); 37 | -------------------------------------------------------------------------------- /test/script/yinyang.js: -------------------------------------------------------------------------------- 1 | /* yinyang.js */ 2 | 3 | ui.debug.addDebugData("yinyang", { 4 | url: "5/5/016612300", 5 | failcheck: [ 6 | [ 7 | "ms2x2", 8 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /. . . . . /. 2 . . . /. 2 2 . . /. . . . . /. . . . . /" 9 | ], 10 | [ 11 | "mu2x2", 12 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /1 1 1 1 1 /. 1 . . 1 /. . . . . /. . . . . /. . . . . /" 13 | ], 14 | [ 15 | "msDivide", 16 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /1 1 1 1 1 /. . . . 1 /. . . . . /. . . . . /. . . . . /" 17 | ], 18 | [ 19 | "muDivide", 20 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /1 1 1 1 1 /. 2 . 2 1 /. 2 1 1 . /1 2 . . . /. . . . . /" 21 | ], 22 | [ 23 | "ceNoNum", 24 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /1 1 1 1 1 /. 2 . 2 1 /. 2 1 1 . /1 2 . . . /1 1 1 1 1 /" 25 | ], 26 | [ 27 | null, 28 | "pzprv3/yinyang/5/5/. . . . . /1 . 2 . . /2 . . . 1 /. . 2 . 1 /. . . . . /1 1 1 1 1 /. 2 . 2 1 /. 2 1 1 . /1 2 . 2 . /1 1 1 1 1 /" 29 | ] 30 | ], 31 | inputs: [] 32 | }); 33 | -------------------------------------------------------------------------------- /test/variety/aho_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/aho_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:aho", function() { 10 | it("Check area generating", function() { 11 | puzzle.open("aho/6/6"); 12 | 13 | puzzle.setMode("edit"); 14 | puzzle.cursor.init(1, 1); 15 | puzzle.key.inputKeys("4", "down", "4"); 16 | puzzle.cursor.init(9, 1); 17 | puzzle.key.inputKeys("2", "right", "6"); 18 | puzzle.cursor.init(7, 5); 19 | puzzle.key.inputKeys("6", "down", "left", "3"); 20 | puzzle.cursor.init(1, 11); 21 | puzzle.key.inputKeys("2", "right", "3"); 22 | puzzle.cursor.init(11, 9); 23 | puzzle.key.inputKeys("2", "down", "4"); 24 | 25 | puzzle.setMode("play"); 26 | puzzle.mouse.inputPath("right", 1, 1, 7, 1); 27 | puzzle.mouse.inputPath(0, 2, 8, 2, 8, 0); 28 | puzzle.mouse.inputPath(10, 0, 10, 4, 8, 4, 8, 0); 29 | puzzle.mouse.inputPath("right", 11, 1, 11, 7, 9, 7); 30 | puzzle.mouse.inputPath(8, 8, 12, 8, 12, 10, 8, 10, 8, 8); 31 | puzzle.mouse.inputPath(4, 12, 4, 10, 12, 10); 32 | puzzle.mouse.inputPath(0, 8, 2, 8, 2, 12); 33 | puzzle.mouse.inputPath(2, 8, 6, 8, 6, 10); 34 | puzzle.mouse.inputPath("right", 7, 7, 7, 9); 35 | puzzle.mouse.inputPath(8, 6, 8, 8, 8, 4); 36 | puzzle.mouse.inputPath(4, 6, 4, 8); 37 | puzzle.mouse.inputPath(4, 6, 8, 6); 38 | puzzle.mouse.inputPath(0, 4, 8, 4); 39 | 40 | assert.equal(puzzle.board.roommgr.components.length, 10); 41 | assert.equal(puzzle.check().complete, true); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /test/variety/ayeheya_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/ayeheya_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:ayeheya", function() { 10 | it("Check area generating", function() { 11 | puzzle.open("ayeheya/6/6"); 12 | 13 | puzzle.setMode("edit"); 14 | puzzle.mouse.inputPath(4, 0, 4, 12); 15 | puzzle.mouse.inputPath(0, 4, 12, 4); 16 | puzzle.mouse.inputPath(10, 0, 10, 2, 12, 2, 10, 2, 10, 4, 12, 4); 17 | puzzle.mouse.inputPath(0, 6, 4, 6); 18 | puzzle.mouse.inputPath(4, 8, 12, 8, 8, 8, 8, 4); 19 | puzzle.mouse.inputPath(4, 10, 12, 10); 20 | puzzle.mouse.inputPath(6, 10, 6, 12); 21 | puzzle.cursor.init(7, 5); 22 | puzzle.key.inputKeys("2"); 23 | 24 | assert.equal(puzzle.board.roommgr.components.length, 11); 25 | 26 | puzzle.setMode("play"); 27 | puzzle.mouse.inputPath("right", 1, 5, 3, 5); 28 | puzzle.mouse.inputPath("right", 7, 1, 7, 3); 29 | puzzle.mouse.inputPath("right", 1, 9, 3, 9); 30 | puzzle.mouse.inputPath("right", 7, 9, 9, 9); 31 | puzzle.mouse.inputPath("right", 1, 3); 32 | puzzle.mouse.inputPath("right", 3, 1); 33 | puzzle.mouse.inputPath(1, 7); 34 | puzzle.mouse.inputPath(3, 3, 3, 1, 1, 1); 35 | puzzle.mouse.inputPath("right", 5, 1, 5, 3, 9, 3, 9, 1); 36 | puzzle.mouse.inputPath(11, 1); 37 | puzzle.mouse.inputPath("right", 11, 3); 38 | puzzle.mouse.inputPath(7, 5, 11, 5, 11, 7, 5, 7); 39 | puzzle.mouse.inputPath( 40 | "right", 41 | 3, 42 | 7, 43 | 3, 44 | 9, 45 | 11, 46 | 9, 47 | 11, 48 | 7, 49 | 11, 50 | 9, 51 | 7, 52 | 9, 53 | 7, 54 | 7 55 | ); 56 | puzzle.mouse.inputPath(3, 11, 11, 11); 57 | 58 | assert.equal(puzzle.check().complete, true); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /test/variety/bosanowa_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/bosanowa_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:bosanowa", function() { 10 | it("loads styles", function() { 11 | puzzle.open("bosanowa/h/6/5/jo9037g2n2n3g4j3i"); 12 | puzzle.toBuffer("svg", 0, 30); 13 | assert.equal(puzzle.getConfig("disptype_bosanowa"), 2); 14 | 15 | puzzle.open("bosanowa/t/6/5/jo9037g2n2n3g4j3i"); 16 | puzzle.toBuffer("svg", 0, 30); 17 | assert.equal(puzzle.getConfig("disptype_bosanowa"), 3); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/variety/cbblock_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/cbblock_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:cbblock", function() { 10 | it("Check that errors are correct after editing", function() { 11 | puzzle.open("cbblock/2/2"); 12 | 13 | puzzle.setMode("edit"); 14 | puzzle.setConfig("multierr", true); 15 | 16 | var check = puzzle.check(true); 17 | assert.equal(check.length, 2); 18 | assert.equal(check[0], "bkSubLt2"); 19 | assert.equal(check[1], "bkRect"); 20 | 21 | puzzle.mouse.inputPath("left", 2, 0, 2, 4); 22 | puzzle.mouse.inputPath("left", 0, 2, 4, 2); 23 | 24 | // we used to still get bkSubLt2 here 25 | check = puzzle.check(true); 26 | assert.equal(check.length, 2); 27 | assert.equal(check[0], "bkRect"); 28 | assert.equal(check[1], "bkSubGt2"); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /test/variety/compass_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/compass_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:compass", function() { 10 | it("decodes empty cells", function() { 11 | puzzle.open("mukkonn/2/2/g_g..2./"); 12 | assert.equal(puzzle.board.getc(1, 1).ques, 0); 13 | assert.equal(puzzle.board.getc(1, 3).ques, 0); 14 | assert.equal(puzzle.board.getc(3, 1).ques, 7); 15 | assert.equal(puzzle.board.getc(3, 3).ques, 51); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /test/variety/fillomino_test.js: -------------------------------------------------------------------------------- 1 | var assert = require("assert"); 2 | 3 | var pzpr = require("../../"); 4 | 5 | var puzzle = new pzpr.Puzzle(); 6 | 7 | describe("Variety:fillomino", function() { 8 | it("can toggle forceallcell", function() { 9 | puzzle.open( 10 | "pzprv3/fillomino/6/6/. . 4 . . . /. 5 3 . 2 . /. . . . 5 2 /3 3 . . . . /. 2 . 1 4 . /. . . 3 . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /. . . . . . /0 1 0 0 0 /0 1 1 0 1 /1 1 0 1 1 /0 1 0 0 1 /0 1 1 1 0 /1 0 0 1 0 /0 0 1 1 1 1 /1 0 0 1 1 1 /0 1 1 1 0 0 /1 1 0 1 1 1 /1 1 1 1 0 0 /" 11 | ); 12 | 13 | puzzle.setConfig("forceallcell", false); 14 | var check = puzzle.check(true); 15 | assert.equal(check.length, 0); 16 | 17 | puzzle.setConfig("forceallcell", true); 18 | check = puzzle.check(true); 19 | assert.equal(check.length, 1); 20 | }); 21 | 22 | it("can add ghost borders", function() { 23 | puzzle.open( 24 | "pzprv3/fillomino/3/3/. . . /. 2 . /. . . /. . . /. . . /. . . /0 0 /0 0 /0 0 /0 0 0 /0 0 0 /" 25 | ); 26 | 27 | var center = puzzle.board.getc(3, 3); 28 | 29 | assert.equal(center.adjborder.top.qcmp, 0); 30 | 31 | center.adjacent.left.setNum(2); 32 | assert.equal(center.adjborder.top.qcmp, 1); 33 | 34 | center.adjacent.right.setNum(2); 35 | assert.equal(center.adjborder.top.qcmp, 0); 36 | 37 | center.adjborder.left.setQans(1); 38 | assert.equal(center.adjborder.top.qcmp, 1); 39 | 40 | center.adjacent.right.setNum(-1); 41 | assert.equal(center.adjborder.top.qcmp, 0); 42 | 43 | center.adjborder.left.setQans(0); 44 | assert.equal(center.adjborder.top.qcmp, 1); 45 | 46 | center.adjacent.left.setNum(-1); 47 | assert.equal(center.adjborder.top.qcmp, 0); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/variety/fivecells_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/fivecells_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:fivecells", function() { 10 | it("Check invalid cell export/import", function() { 11 | puzzle.open("fivecells/8/8"); 12 | 13 | var countNonEmpty = function() { 14 | var count = 0; 15 | for (var c = 0; c < puzzle.board.cell.length; c++) { 16 | if (!puzzle.board.cell[c].isEmpty()) { 17 | count++; 18 | } 19 | } 20 | return count; 21 | }; 22 | assert.equal(countNonEmpty() % 5, 0); 23 | 24 | // reset default empty cells 25 | for (var c = 0; c < puzzle.board.cell.length; c++) { 26 | puzzle.board.cell[c].setQues(0); 27 | } 28 | assert.equal(countNonEmpty() % 5, 4); 29 | 30 | // make another set of four cells empty 31 | puzzle.setMode("edit"); 32 | puzzle.mouse.setInputMode("empty"); 33 | 34 | puzzle.mouse.inputPath(1, 1); 35 | puzzle.mouse.inputPath(3, 1); 36 | puzzle.mouse.inputPath(5, 1); 37 | puzzle.mouse.inputPath(7, 1); 38 | assert.equal(countNonEmpty() % 5, 0); 39 | 40 | var puzzle2 = new pzpr.Puzzle(); 41 | puzzle2.open(puzzle.getURL()); 42 | for (c = 0; c < puzzle.board.cell.length; c++) { 43 | assert.equal( 44 | puzzle.board.cell[c].isEmpty(), 45 | puzzle2.board.cell[c].isEmpty() 46 | ); 47 | } 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/variety/gokigen_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/gokigen_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:gokigen", function() { 10 | it("Check loop resolving", function() { 11 | puzzle.open("gokigen/3/3"); 12 | 13 | puzzle.setMode("play"); 14 | puzzle.mouse.inputPath("right", 1, 3); 15 | puzzle.mouse.inputPath("left", 1, 5); 16 | puzzle.mouse.inputPath("right", 3, 5); 17 | puzzle.mouse.inputPath("left", 3, 3); 18 | puzzle.mouse.inputPath("right", 5, 1); 19 | 20 | assert.equal(puzzle.board.getc(1, 3).isloop, true); 21 | 22 | puzzle.mouse.inputPath("right", 3, 3); 23 | 24 | assert.equal(puzzle.board.getc(1, 3).isloop, false); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /test/variety/herugolf_test.js: -------------------------------------------------------------------------------- 1 | var assert = require("assert"); 2 | 3 | var pzpr = require("../../"); 4 | 5 | var puzzle = new pzpr.Puzzle(); 6 | 7 | describe("Variety:herugolf", function() { 8 | it("allows undoing through answer reset, #126", function() { 9 | puzzle.open("herugolf/3/3/002p"); 10 | 11 | puzzle.setMode("play"); 12 | puzzle.mouse.inputPath(1, 1, 5, 1, 5, 3); 13 | 14 | var getLine = function(border) { 15 | var s = ""; 16 | for (var i = 0; i < border.length; i++) { 17 | s = s + border[i].line; 18 | } 19 | return s; 20 | }; 21 | 22 | assert.equal("110000001000", getLine(puzzle.board.border)); 23 | 24 | puzzle.ansclear(); 25 | puzzle.undo(); 26 | 27 | assert.equal("110000001000", getLine(puzzle.board.border)); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /test/variety/myopia_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/myopia_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:myopia", function() { 10 | it("Outline shaded cells functions correctly", function() { 11 | puzzle.open("myopia/3/3/g6j1h"); 12 | puzzle.setMode("play"); 13 | puzzle.mouse.setInputMode("auto"); 14 | puzzle.mouse.inputPath("left", 0, 2, 0, 0, 2, 0, 2, 2, 4, 2); 15 | puzzle.mouse.inputPath("left", 0, 4, 2, 4, 2, 6, 0, 6); 16 | puzzle.mouse.inputPath("left", 1, 2); 17 | puzzle.mouse.inputPath("left", 3, 4); 18 | puzzle.mouse.inputPath("left", 6, 1); 19 | puzzle.mouse.inputPath("left", 6, 3); 20 | puzzle.mouse.setInputMode("bgcolor1"); 21 | puzzle.mouse.inputPath("left", 1, 1, 1, 3, 5, 3, 5, 5); 22 | puzzle.mouse.setInputMode("bgcolor2"); 23 | puzzle.mouse.inputPath("left", 1, 5, 3, 5); 24 | puzzle.mouse.inputPath("left", 5, 1); 25 | puzzle.board.operate("outlineshaded"); 26 | 27 | var bd = puzzle.board.freezecopy(); 28 | 29 | puzzle.open("myopia/3/3/g6j1h"); 30 | puzzle.setMode("play"); 31 | puzzle.mouse.setInputMode("auto"); 32 | puzzle.mouse.inputPath("left", 0, 0, 2, 0, 2, 2, 6, 2, 6, 6); 33 | puzzle.mouse.inputPath("left", 6, 6, 4, 6, 4, 4, 0, 4, 0, 0); 34 | puzzle.mouse.inputPath("left", 1, 2); 35 | puzzle.mouse.inputPath("left", 6, 1); 36 | puzzle.mouse.setInputMode("bgcolor1"); 37 | puzzle.mouse.inputPath("left", 1, 1, 1, 3, 5, 3, 5, 5); 38 | puzzle.mouse.setInputMode("bgcolor2"); 39 | puzzle.mouse.inputPath("left", 1, 5, 3, 5); 40 | puzzle.mouse.inputPath("left", 5, 1); 41 | 42 | puzzle.board.compareData(bd, function(group, c, a) { 43 | assert.equal( 44 | bd[group][c][a], 45 | puzzle.board[group][c][a], 46 | group + "[" + c + "]." + a 47 | ); 48 | }); 49 | }); 50 | }); 51 | -------------------------------------------------------------------------------- /test/variety/onsen_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/onsen_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:onsen", function() { 10 | it("Check area generating", function() { 11 | puzzle.open("onsen/5/5"); 12 | 13 | puzzle.setMode("edit"); 14 | puzzle.mouse.inputPath(0, 4, 4, 4, 4, 0); 15 | 16 | puzzle.setMode("play"); 17 | puzzle.mouse.inputPath(5, 1, 5, 3, 7, 3, 7, 1); 18 | 19 | assert.equal(puzzle.board.lineblkgraph.components.length, 1); 20 | 21 | puzzle.ansclear(); 22 | puzzle.setMode("play"); 23 | puzzle.mouse.inputPath(3, 1, 3, 3, 5, 3, 5, 1); 24 | 25 | assert.equal(puzzle.board.lineblkgraph.components.length, 2); 26 | 27 | puzzle.ansclear(); 28 | 29 | puzzle.setMode("play"); 30 | puzzle.mouse.inputPath(5, 1, 5, 3, 7, 3, 7, 1); 31 | 32 | puzzle.setMode("edit"); 33 | puzzle.mouse.inputPath(6, 0, 6, 4); 34 | 35 | assert.equal(puzzle.board.lineblkgraph.components.length, 2); 36 | 37 | puzzle.setMode("edit"); 38 | puzzle.mouse.inputPath(6, 0, 6, 4); 39 | 40 | assert.equal(puzzle.board.lineblkgraph.components.length, 1); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /test/variety/parquet_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/parquet_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:parquet", function() { 10 | it("sets autocmp", function() { 11 | puzzle.open("pzprv3/parquet/2/3/2 1 /0 1 /0 2 2 /# . . /# # . /"); 12 | assert(puzzle.board.getc(1, 1).spblock.clist.checkCmp()); 13 | assert(!puzzle.board.getc(5, 1).spblock.clist.checkCmp()); 14 | 15 | puzzle.setMode("play"); 16 | puzzle.mouse.inputPath(5, 1); 17 | assert(puzzle.board.getc(5, 1).spblock.clist.checkCmp()); 18 | }); 19 | 20 | it("rewrites undo history", function() { 21 | puzzle.open("pzprv3/parquet/2/3/2 1 /0 1 /0 2 2 /. . . /. . . /"); 22 | assert.equal(puzzle.opemgr.history.length, 0); 23 | 24 | puzzle.setMode("play"); 25 | puzzle.mouse.inputPath(5, 1); 26 | assert.equal(puzzle.opemgr.history.length, 1); 27 | 28 | puzzle.mouse.inputPath(1, 1, 3, 1); 29 | assert.equal(puzzle.opemgr.history.length, 2); 30 | }); 31 | 32 | it("rebuilds cell lists", function() { 33 | puzzle.open("pzprv3/parquet/2/2/0 /2 /0 2 /. . /. . /"); 34 | 35 | puzzle.setMode("edit"); 36 | puzzle.mouse.setInputMode("border"); 37 | puzzle.mouse.inputPath(2, 2, 4, 2); 38 | puzzle.mouse.inputPath(2, 2, 4, 2); 39 | 40 | puzzle.setMode("play"); 41 | puzzle.mouse.inputPath(1, 1); 42 | 43 | var result = "pzprv3/parquet/2/2/0 /2 /0 0 /# # /# # /"; 44 | var filestr = puzzle.getFileData(); 45 | var resultstr = result.replace(/\//g, "\n"); 46 | assert.equal(filestr, resultstr); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /test/variety/pmemory_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/pmemory_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:pmemory", function() { 10 | it("Moves the circles when reducing board", function() { 11 | puzzle.open("pmemory/4/4/00003o688"); 12 | 13 | puzzle.board.operate("reducert"); 14 | 15 | var url = puzzle.getURL().split("?")[1]; 16 | assert.equal(url, "pmemory/3/4/000e468"); 17 | }); 18 | 19 | it("Resets circles when expanding 1x1 grid", function() { 20 | puzzle.open("pmemory/1/1/00"); 21 | 22 | puzzle.board.operate("expandrt"); 23 | puzzle.board.operate("expandrt"); 24 | 25 | var url = puzzle.getURL().split("?")[1]; 26 | assert.equal(url, "pmemory/3/1/0010"); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/variety/railpool_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/railpool_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:railpool", function() { 10 | it("Can encode a clue in the last cell", function() { 11 | puzzle.open("pzprv3/railpool/1/3/1 1,2 1,2,3 /. . . /3/0 1 2 /0 0 /"); 12 | var bd2 = puzzle.board.freezecopy(); 13 | 14 | var urlstr = puzzle.getURL(); 15 | puzzle.open(urlstr); 16 | 17 | puzzle.board.compareData(bd2, function(group, c, a) { 18 | assert.equal( 19 | bd2[group][c][a], 20 | puzzle.board[group][c][a], 21 | group + "[" + c + "]." + a 22 | ); 23 | }); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /test/variety/ringring_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/ringring.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:ringring", function() { 10 | it("Check cross loop component behavior", function() { 11 | puzzle.open("ringring/4/4/0282"); 12 | puzzle.setMode("play"); 13 | puzzle.mouse.inputPath("left", 1, 3, 3, 3); 14 | puzzle.mouse.inputPath("left", 3, 1, 3, 3, 3, 5); 15 | puzzle.mouse.inputPath("left", 1, 3, 1, 5, 3, 5, 5, 5); 16 | puzzle.mouse.inputPath("left", 3, 5, 3, 7, 5, 7, 5, 5, 5, 3, 5, 1, 3, 1); 17 | puzzle.mouse.inputPath("left", 3, 3, 5, 3, 7, 3, 7, 5, 5, 5); 18 | 19 | assert.equal(puzzle.check(false).complete, true); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /test/variety/shwolf_test.js: -------------------------------------------------------------------------------- 1 | var assert = require("assert"); 2 | 3 | var pzpr = require("../../"); 4 | 5 | var puzzle = new pzpr.Puzzle(); 6 | 7 | describe("Variety:shwolf", function() { 8 | it("Encodes a small puzzle well", function() { 9 | puzzle.open("shwolf/1/1"); 10 | puzzle.setMode("edit"); 11 | puzzle.cursor.init(1, 1); 12 | puzzle.key.inputKeys("1"); 13 | assert.equal(puzzle.board.getc(1, 1).qnum, 1); 14 | var url = puzzle.getURL(); 15 | var puzzle2 = new pzpr.Puzzle(); 16 | puzzle2.open(url); 17 | assert.equal(puzzle2.board.getc(1, 1).qnum, 1); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/variety/slither_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/slither_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:slither", function() { 10 | it("Outline shaded cells functions correctly", function() { 11 | puzzle.open("slither/2/4/dbh"); 12 | puzzle.setMode("play"); 13 | puzzle.mouse.setInputMode("auto"); 14 | puzzle.mouse.inputPath("left", 4, 0, 4, 2); 15 | puzzle.mouse.inputPath("left", 2, 4, 4, 4); 16 | puzzle.mouse.inputPath("left", 2, 6, 4, 6); 17 | puzzle.mouse.inputPath("left", 0, 8, 4, 8); 18 | puzzle.mouse.inputPath("left", 2, 3); 19 | puzzle.mouse.inputPath("left", 2, 5); 20 | puzzle.mouse.inputPath("left", 1, 4); 21 | puzzle.mouse.inputPath("left", 1, 6); 22 | puzzle.mouse.setInputMode("bgcolor1"); 23 | puzzle.mouse.inputPath("left", 1, 1, 1, 7); 24 | puzzle.mouse.setInputMode("bgcolor2"); 25 | puzzle.mouse.inputPath("left", 3, 1); 26 | puzzle.mouse.inputPath("left", 3, 5); 27 | 28 | puzzle.board.operate("outlineshaded"); 29 | var bd = puzzle.board.freezecopy(); 30 | 31 | puzzle.open("slither/2/4/dbh"); 32 | puzzle.setMode("play"); 33 | puzzle.mouse.setInputMode("auto"); 34 | puzzle.mouse.inputPath("left", 2, 2, 2, 0, 0, 0, 0, 8, 4, 8); 35 | puzzle.mouse.inputPath("left", 4, 4, 2, 4, 2, 6, 4, 6); 36 | puzzle.mouse.inputPath("left", 2, 3); 37 | puzzle.mouse.inputPath("left", 1, 4); 38 | puzzle.mouse.inputPath("left", 1, 6); 39 | puzzle.mouse.setInputMode("bgcolor1"); 40 | puzzle.mouse.inputPath("left", 1, 1, 1, 7); 41 | puzzle.mouse.setInputMode("bgcolor2"); 42 | puzzle.mouse.inputPath("left", 3, 1); 43 | puzzle.mouse.inputPath("left", 3, 5); 44 | 45 | puzzle.board.compareData(bd, function(group, c, a) { 46 | assert.equal( 47 | bd[group][c][a], 48 | puzzle.board[group][c][a], 49 | group + "[" + c + "]." + a 50 | ); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /test/variety/tapa_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/tapa_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:tapa", function() { 10 | it("Check shaded cell length around numbers", function() { 11 | puzzle.open("tapa/3/3"); 12 | puzzle.setMode("edit"); 13 | puzzle.cursor.init(3, 3); 14 | puzzle.key.inputKeys("1", "-", "2"); 15 | 16 | // shaded cells = [1,1,3] 17 | puzzle.setMode("play"); 18 | puzzle.ansclear(); 19 | puzzle.mouse.inputPath(1, 1, 5, 1); 20 | puzzle.mouse.inputPath(1, 5); 21 | puzzle.mouse.inputPath(5, 5); 22 | assert.equal(puzzle.check(true)[0], "ceTapaNe"); 23 | 24 | // shaded cells = [1,2,2] 25 | puzzle.setMode("play"); 26 | puzzle.ansclear(); 27 | puzzle.mouse.inputPath(1, 1, 3, 1); 28 | puzzle.mouse.inputPath(1, 5); 29 | puzzle.mouse.inputPath(5, 3, 5, 5); 30 | assert.notEqual(puzzle.check(true)[0], "ceTapaNe"); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /test/variety/tentaisho_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/tentaisho.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:tentaisho", function() { 10 | it("Check star input resolves missing star error", function() { 11 | puzzle.open("tentaisho/5/5"); 12 | puzzle.setMode("edit"); 13 | puzzle.mouse.inputPath("left", 2, 5); 14 | 15 | puzzle.setMode("play"); 16 | puzzle.mouse.inputPath("left", 4, 0, 4, 10); 17 | assert.equal(puzzle.check(false)[0], "bkNoStar"); 18 | 19 | puzzle.setMode("edit"); 20 | puzzle.mouse.inputPath("left", 7, 5); 21 | assert.equal(puzzle.check(false).complete, true); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /test/variety/tontti_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/tontti_test.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:tontti", function() { 10 | describe("TonttiGraph", function() { 11 | it("can separate components", function() { 12 | puzzle.open("tontti/3/2/2j1"); 13 | assert.equal(puzzle.check(true)[0], "bkNumGe2"); 14 | 15 | puzzle.setMode("play"); 16 | puzzle.mouse.inputPath(3, 5, 3, 1, 7, 1); 17 | assert.equal(puzzle.check(true)[0], null); 18 | }); 19 | 20 | it("can join components", function() { 21 | puzzle.open("tontti/3/2/2j1"); 22 | puzzle.setMode("play"); 23 | puzzle.mouse.inputPath(3, 5, 3, 1, 7, 1); 24 | puzzle.mouse.inputPath(7, 1, 5, 1); 25 | assert.equal(puzzle.check(true)[0], "bkNumGe2"); 26 | }); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/variety/yajilin_test.js: -------------------------------------------------------------------------------- 1 | // test/variety/yajilin.js 2 | 3 | var assert = require("assert"); 4 | 5 | var pzpr = require("../../"); 6 | 7 | var puzzle = new pzpr.Puzzle(); 8 | 9 | describe("Variety:yajilin", function() { 10 | it("Clues are considered completed correctly", function() { 11 | puzzle.open("yajilin/7/1/41b30a"); 12 | puzzle.setMode("play"); 13 | assert.equal(puzzle.board.cell[0].isCmp(), false); 14 | assert.equal(puzzle.board.cell[3].isCmp(), false); 15 | puzzle.mouse.inputPath("left", 3, 1, 5, 1); 16 | puzzle.mouse.inputPath("left", 9, 1); 17 | puzzle.mouse.inputPath("right", 13, 1); 18 | assert.equal(puzzle.board.cell[0].isCmp(), true); 19 | assert.equal(puzzle.board.cell[3].isCmp(), true); 20 | }); 21 | it("Check irowake adds different color", function() { 22 | puzzle.open("yajilin/2/3/"); 23 | puzzle.setConfig("irowake", true); 24 | puzzle.irowake(); 25 | 26 | puzzle.mouse.inputPath("left", 1, 1, 3, 1); 27 | puzzle.mouse.inputPath("left", 1, 3, 3, 3); 28 | puzzle.mouse.inputPath("left", 1, 5, 3, 5); 29 | 30 | puzzle.irowake(); 31 | 32 | puzzle.setConfig("irowake", false); 33 | 34 | var items = puzzle.board.linegraph.components; 35 | assert.notEqual(items[0].color, items[1].color); 36 | assert.notEqual(items[0].color, items[2].color); 37 | assert.notEqual(items[1].color, items[2].color); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "redirects": [ 3 | { 4 | "source": "/", 5 | "destination": "/list.html" 6 | } 7 | ] 8 | } 9 | --------------------------------------------------------------------------------