├── README.md ├── css ├── screen.css ├── sokoban.css └── sprites.png ├── index.html └── js ├── jquery.processEach.js └── jquery.sokoban.js /README.md: -------------------------------------------------------------------------------- 1 | # Sōkoban 2 | 3 | An implementation of Sokōban in JavaScript, as a [jQuery] plugin. It parses and runs the de-facto standardized Sokoban puzzle notation, is capable of running multiple games and includes a separate undo buffer for each one. It's about 300 lines of code. 4 | 5 | ## How to use 6 | 7 | 1. Include a reference to the plugin (and jQuery) to the `
` section of your document: 8 | 9 | 10 | 11 | 12 | 13 | 2. Add a Sokoban puzzle to your HTML document: 14 | 15 |3 | 4 | 5 | 6 |Sōkoban: Microban levels 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 37 | 38 | 39 |40 | 41 |2229 | 2230 | -------------------------------------------------------------------------------- /js/jquery.processEach.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery processEach plugin 3 | * - Copyright (c) 2010 Borgar Þorsteinsson 4 | * 5 | * Description: A variation of the code each function for enormous or labour intensive 6 | * loops where the thread is yelded every iteration to prevent script timeouts. 7 | * 8 | * Licenced under the terms of the MIT/GPL software licenses. 9 | */ 10 | /*global jQuery */ 11 | jQuery.processEach = function ( obj, callback, done ) { 12 | 13 | if ( typeof obj === 'object' ) { 14 | 15 | var subject, keys; 16 | 17 | // for normal arrays, or jQuery objects, trust the length 18 | if ( $.isArray( obj ) ) { 19 | subject = obj.concat(); // array clone 20 | } 21 | else if ( obj instanceof jQuery ) { 22 | subject = obj.get(); 23 | } 24 | // copy regular objects into an array 25 | else { 26 | keys = []; 27 | subject = {}; 28 | for ( k in obj ) { 29 | keys[ keys.length ] = k; 30 | subject[ k ] = obj[ k ]; 31 | } 32 | } 33 | 34 | var i = 0, 35 | l = (keys || subject).length; 36 | 37 | (function f () { 38 | 39 | var res, timer = new Date(); 40 | while ( (res !== false) && (i < l) && (new Date() - timer < 100) ) { 41 | 42 | var key = keys ? keys[ i++ ] : i++; 43 | var res = callback.call( subject[ key ], key, subject[ key ] ); 44 | 45 | } 46 | if ( res !== false && i < l ) { 47 | setTimeout( f, 1 ); 48 | } 49 | else if ( $.isFunction( done ) ) { 50 | done.call( obj, res ); 51 | } 52 | 53 | })(); 54 | 55 | } 56 | 57 | }; 58 | 59 | jQuery.fn.processEach = function ( callback, done ) { 60 | jQuery.processEach( this, callback, done ); 61 | return this; 62 | }; -------------------------------------------------------------------------------- /js/jquery.sokoban.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Sokoban 3 | * http://galdrar.net/sokoban 4 | * 5 | * Copyright (c) 2009 Borgar Þorsteinsson 6 | * Licensed under the terms of the GPL v3 license. 7 | * http://www.gnu.org/licenses/gpl-3.0.html 8 | * 9 | */ 10 | (function($){ 11 | 12 | var _R = RegExp; 13 | var _LINE = /^(\s*)(\#|\#[ \.\@\+\$\*\#]*\#)(\s*)$/; 14 | var _CLS = 'soko-'; 15 | var _LC = $( '' ); 16 | 17 | function _obj () { return {}; } 18 | 19 | function reMap ( a ) { 20 | return { 21 | dock: "+*.".indexOf( a ) !== -1, 22 | box: "$*".indexOf( a ) !== -1, 23 | man: "+@".indexOf( a ) !== -1, 24 | wall: (a === '#') 25 | } 26 | } 27 | 28 | function Sokoban ( level ) { 29 | this.level = $( level ); 30 | this.original = this.level.text(); 31 | var ok = this.processLevelData(); 32 | if ( ok ) { 33 | this.level.bind( 'keydown', function ( e ) { // keypress doesn't work in safari 34 | $( this ).data( 'sokoban' ).keyhandler( e ); 35 | return false; 36 | }); 37 | } 38 | } 39 | Sokoban.prototype = { 40 | 41 | processLevelData: function () { 42 | var pre = [], post = [], level = [], wid = 0; 43 | var lines = this.level.text().split( '\n' ); 44 | for ( var line, i=0; iSokoban: Microban levels
42 | 43 |44 |56 | 57 |45 |
48 |- Sōkoban (倉庫番)
46 |- (n) warehouseman; storekeeper
47 |Sokoban was created in 1980 by Hiroyuki Imabayashi, and was published 49 | in 1982 by Thinking Rabbit, a software house based in Takarazuka, Japan.
50 |It spawned a genre of puzzle games, including the best selling 51 | Chips Challenge, 52 | Stone Age, and many others, in addition to having been cloned and ported to 53 | almost all computer and operating systems in existance.
54 |
55 |58 |69 | 70 |How to play:
59 | 62 |Move the warehouseman using the arrow keys and push all the boxes onto the 63 | colored part of the floor. Be careful not to get the boxes stuck in an unmovable 64 | position as they are to heavy to pull. If you make a mistake you can undo it with 65 | control + z or backspace and if you want to reset the level you 66 | can do so using Escape.
67 |
68 |71 |2219 | 2220 |72 | ; Microban levels 73 |74 |
75 |76 | ; 1 77 | 78 | #### 79 | # .# 80 | # ### 81 | #*@ # 82 | # $ # 83 | # ### 84 | #### 85 |86 |
87 |88 | ; 2 89 | 90 | ###### 91 | # # 92 | # #@ # 93 | # $* # 94 | # .* # 95 | # # 96 | ###### 97 |98 |
99 |100 | ; 3 101 | 102 | #### 103 | ### #### 104 | # $ # 105 | # # #$ # 106 | # . .#@ # 107 | ######### 108 |109 |
110 |111 | ; 4 112 | 113 | ######## 114 | # # 115 | # .**$@# 116 | # # 117 | ##### # 118 | #### 119 |120 |
121 |122 | ; 5 123 | 124 | ####### 125 | # # 126 | # .$. # 127 | ## $@$ # 128 | # .$. # 129 | # # 130 | ######## 131 |132 |
133 |134 | ; 6 135 | 136 | ###### ##### 137 | # ### # 138 | # $$ #@# 139 | # $ #... # 140 | # ######## 141 | ##### 142 |143 |
144 |145 | ; 7 146 | 147 | ####### 148 | # # 149 | # .$. # 150 | # $.$ # 151 | # .$. # 152 | # $.$ # 153 | # @ # 154 | ####### 155 |156 |
157 |158 | ; 8 159 | 160 | ###### 161 | # ..@# 162 | # $$ # 163 | ## ### 164 | # # 165 | # # 166 | #### # 167 | # ## 168 | # # # 169 | # # # 170 | ### # 171 | ##### 172 |173 |
174 |175 | ; 9 176 | 177 | ##### 178 | #. ## 179 | #@$$ # 180 | ## # 181 | ## # 182 | ##.# 183 | ### 184 |185 |
186 |187 | ; 10 188 | 189 | ##### 190 | #. # 191 | #.# # 192 | #######.# # 193 | # @ $ $ $ # 194 | # # # # ### 195 | # # 196 | ######### 197 |198 |
199 |200 | ; 11 201 | 202 | ###### 203 | # # 204 | # ##@## 205 | ### # $ # 206 | # ..# $ # 207 | # # 208 | # ###### 209 | #### 210 |211 |
212 |213 | ; 12 214 | 215 | ##### 216 | # ## 217 | # $ # 218 | ## $ #### 219 | ###@. # 220 | # .# # 221 | # # 222 | ####### 223 |224 |
225 |226 | ; 13 227 | 228 | #### 229 | #. ## 230 | #.@ # 231 | #. $# 232 | ##$ ### 233 | # $ # 234 | # # 235 | # ### 236 | #### 237 |238 |
239 |240 | ; 14 241 | 242 | ####### 243 | # # 244 | # # # # 245 | #. $*@# 246 | # ### 247 | ##### 248 |249 |
250 |251 | ; 15 252 | 253 | ### 254 | ######@## 255 | # .* # 256 | # # # 257 | #####$# # 258 | # # 259 | ##### 260 |261 |
262 |263 | ; 16 264 | 265 | #### 266 | # #### 267 | # ## 268 | ## ## # 269 | #. .# @$## 270 | # # $$ # 271 | # .# # 272 | ########## 273 |274 |
275 |276 | ; 17 277 | 278 | ##### 279 | # @ # 280 | #...# 281 | #$$$## 282 | # # 283 | # # 284 | ###### 285 |286 |
287 |288 | ; 18 289 | 290 | ####### 291 | # # 292 | #. . # 293 | # ## ## 294 | # $ # 295 | ###$ # 296 | #@ # 297 | # # 298 | #### 299 |300 |
301 |302 | ; 19 303 | 304 | ######## 305 | # .. # 306 | # @$$ # 307 | ##### ## 308 | # # 309 | # # 310 | # # 311 | #### 312 |313 |
314 |315 | ; 20 316 | 317 | ####### 318 | # ### 319 | # @$$..# 320 | #### ## # 321 | # # 322 | # #### 323 | # # 324 | #### 325 |326 |
327 |328 | ; 21 329 | 330 | #### 331 | # #### 332 | # . . # 333 | # $$#@# 334 | ## # 335 | ###### 336 |337 |
338 |339 | ; 22 340 | 341 | ##### 342 | # ### 343 | #. . # 344 | # # # 345 | ## # # 346 | #@$$ # 347 | # # 348 | # ### 349 | #### 350 |351 |
352 |353 | ; 23 354 | 355 | ####### 356 | # * # 357 | # # 358 | ## # ## 359 | #$@.# 360 | # # 361 | ##### 362 |363 |
364 |365 | ; 24 366 | 367 | # ##### 368 | # # 369 | ###$$@# 370 | # ### 371 | # # 372 | # . . # 373 | ####### 374 |375 |
376 |377 | ; 25 378 | 379 | #### 380 | # ### 381 | # $$ # 382 | ##... # 383 | # @$ # 384 | # ### 385 | ##### 386 |387 |
388 |389 | ; 26 390 | 391 | ##### 392 | # @ # 393 | # # 394 | ###$ # 395 | # ...# 396 | # $$ # 397 | ### # 398 | #### 399 |400 |
401 |402 | ; 27 403 | 404 | ###### 405 | # .# 406 | # ## ## 407 | # $$@# 408 | # # # 409 | #. ### 410 | ##### 411 |412 |
413 |414 | ; 28 415 | 416 | ##### 417 | # # 418 | # @ # 419 | # $$### 420 | ##. . # 421 | # # 422 | ###### 423 |424 |
425 |426 | ; 29 427 | 428 | ##### 429 | # ## 430 | # # 431 | ###### # 432 | ## #. # 433 | # $ $ @ ## 434 | # ######.# 435 | # # 436 | ########## 437 |438 |
439 |440 | ; 30 441 | 442 | #### 443 | # ### 444 | # $$ # 445 | #... # 446 | # @$ # 447 | # ## 448 | ##### 449 |450 |
451 |452 | ; 31 453 | 454 | #### 455 | ## # 456 | ##@$.## 457 | # $$ # 458 | # . . # 459 | ### # 460 | ##### 461 |462 |
463 |464 | ; 32 465 | 466 | #### 467 | ## ### 468 | # # 469 | #.**$@# 470 | # ### 471 | ## # 472 | #### 473 |474 |
475 |476 | ; 33 477 | 478 | ####### 479 | #. # # 480 | # $ # 481 | #. $#@# 482 | # $ # 483 | #. # # 484 | ####### 485 |486 |
487 |488 | ; 34 489 | 490 | #### 491 | ### #### 492 | # # 493 | #@$***. # 494 | # # 495 | ######### 496 |497 |
498 |499 | ; 35 500 | 501 | #### 502 | ## # 503 | #. $# 504 | #.$ # 505 | #.$ # 506 | #.$ # 507 | #. $## 508 | # @# 509 | ## # 510 | ##### 511 |512 |
513 |514 | ; 36 515 | 516 | #### 517 | # ############ 518 | # $ $ $ $ $ @ # 519 | # ..... # 520 | ############### 521 |522 |
523 |524 | ; 37 525 | 526 | ### 527 | ##### #.# 528 | # ###.# 529 | # $ #.# 530 | # $ $ # 531 | #####@# # 532 | # # 533 | ##### 534 |535 |
536 |537 | ; 38 538 | 539 | ########## 540 | # # 541 | # ##.### # 542 | # # $$ . # 543 | # . @$## # 544 | ##### # 545 | ###### 546 |547 |
548 |549 | ; 39 550 | 551 | ##### 552 | # #### 553 | # # # .# 554 | # $ ### 555 | ### #$. # 556 | # #@ # 557 | # # ###### 558 | # # 559 | ##### 560 |561 |
562 |563 | ; 40 564 | 565 | ##### 566 | # # 567 | ## ## 568 | # $$$ # 569 | # .+. # 570 | ####### 571 |572 |
573 |574 | ; 41 575 | 576 | ####### 577 | # # 578 | #@$$$ ## 579 | # #...# 580 | ## ## 581 | ###### 582 |583 |
584 |585 | ; 42 586 | 587 | #### 588 | # # 589 | #@ # 590 | ####$.# 591 | # $.# 592 | # # $.# 593 | # ## 594 | ###### 595 |596 |
597 |598 | ; 43 599 | 600 | #### 601 | # @# 602 | # # 603 | ###### .# 604 | # $ .# 605 | # $$# .# 606 | # #### 607 | ### # 608 | #### 609 |610 |
611 |612 | ; 44 613 | 'Duh!' 614 | 615 | ##### 616 | #@$.# 617 | ##### 618 |619 |
620 |621 | ; 45 622 | 623 | ###### 624 | #... # 625 | # $ # 626 | # #$## 627 | # $ # 628 | # @ # 629 | ###### 630 |631 |
632 |633 | ; 46 634 | 635 | ###### 636 | ## # 637 | # ## # 638 | # # $ # 639 | # * .# 640 | ## #@## 641 | # # 642 | ##### 643 |644 |
645 |646 | ; 47 647 | 648 | ####### 649 | ### # 650 | # $ $ # 651 | # ### ##### 652 | # @ . . # 653 | # ### # 654 | ##### ##### 655 |656 |
657 |658 | ; 48 659 | 660 | ###### 661 | # @ # 662 | # # ## 663 | # .# ## 664 | # .$$$ # 665 | # .# # 666 | #### # 667 | ##### 668 |669 |
670 |671 | ; 49 672 | 673 | ###### 674 | # @ # 675 | # $# # 676 | # $ # 677 | # $ ## 678 | ### #### 679 | # # # 680 | #... # 681 | # # 682 | ####### 683 |684 |
685 |686 | ; 50 687 | 688 | #### 689 | ### ##### 690 | # $ @..# 691 | # $ # # 692 | ### #### # 693 | # # 694 | ######## 695 |696 |
697 |698 | ; 51 699 | 700 | #### 701 | # ### 702 | # ### 703 | # $*@ # 704 | ### .# # 705 | # # 706 | ###### 707 |708 |
709 |710 | ; 52 711 | 712 | #### 713 | ### @# 714 | # $ # 715 | # *.# 716 | # *.# 717 | # $ # 718 | ### # 719 | #### 720 |721 |
722 |723 | ; 53 724 | 725 | ##### 726 | ##. .## 727 | # * * # 728 | # # # 729 | # $ $ # 730 | ## @ ## 731 | ##### 732 |733 |
734 |735 | ; 54 736 | 737 | ###### 738 | # # 739 | ##### . # 740 | ### ###. # 741 | # $ $ . ## 742 | # @$$ # . # 743 | ## ##### 744 | ###### 745 |746 |
747 |748 | ; 55 749 | 750 | ######## 751 | # @ # # 752 | # # 753 | #####$ # 754 | # ### 755 | ## #$ ..# 756 | ## # ### 757 | #### 758 |759 |
760 |761 | ; 56 762 | 763 | ##### 764 | # ### 765 | # $ # 766 | ##* . # 767 | # @# 768 | ###### 769 |770 |
771 |772 | ; 57 773 | 774 | #### 775 | # # 776 | #@ # 777 | # # 778 | ### #### 779 | # * # 780 | # $ # 781 | #####. # 782 | #### 783 |784 |
785 |786 | ; 58 787 | 788 | #### 789 | # #### 790 | #.*$ # 791 | # .$# # 792 | ## @ # 793 | # ## 794 | ##### 795 |796 |
797 |798 | ; 59 799 | 800 | ############ 801 | # # 802 | # ####### @## 803 | # # # 804 | # # $ # # 805 | # $$ ##### # 806 | ### # # ...# 807 | #### # # 808 | ###### 809 |810 |
811 |812 | ; 60 813 | 814 | ######### 815 | # # 816 | ##@##### # 817 | # # # # 818 | # # $.# 819 | # ##$##.# 820 | ##$## #.# 821 | # $ #.# 822 | # # ### 823 | ######## 824 |825 |
826 |827 | ; 61 828 | 829 | ######## 830 | # # 831 | # #### # 832 | # #...@# 833 | # ###$### 834 | # # # 835 | # $$ $ # 836 | #### ## 837 | #.### 838 | ### 839 |840 |
841 |842 | ; 62 843 | 844 | ########## 845 | #### ## # 846 | # $$$....$@# 847 | # ### # 848 | # #### #### 849 | ##### 850 |851 |
852 |853 | ; 63 854 | 855 | ##### #### 856 | # ##### .# 857 | # $ ######## 858 | ### #### .$ @ # 859 | # # # #### # 860 | #### #### ##### 861 |862 |
863 |864 | ; 64 865 | 866 | ###### 867 | ## # 868 | # $ # 869 | # $$ # 870 | ### .##### 871 | ##.# @ # 872 | #. $ # 873 | #. #### 874 | #### 875 |876 |
877 |878 | ; 65 879 | 880 | ###### 881 | # # 882 | # $ # 883 | ####$ # 884 | ## $ $ # 885 | #....# ## 886 | # @ # 887 | ## # # 888 | ######## 889 |890 |
891 |892 | ; 66 893 | 894 | ### 895 | #@# 896 | ###$### 897 | ## . ## 898 | # # # # 899 | # # # # 900 | # # # # 901 | # # # # 902 | # # # # 903 | ## $ $ ## 904 | ##. .## 905 | # # 906 | # # 907 | ##### 908 |909 |
910 |911 | ; 67 912 | 913 | ##### 914 | # ## 915 | # # # 916 | #@$*.## 917 | ## . # 918 | # $# # 919 | ## # 920 | ##### 921 |922 |
923 |924 | ; 68 925 | 926 | #### 927 | # ###### 928 | ## $ # 929 | # .# $ # 930 | # .#$##### 931 | # .@ # 932 | ###### 933 |934 |
935 |936 | ; 69 937 | 938 | #### #### 939 | # #### # 940 | # # # # 941 | # # $## 942 | # . .#$ # 943 | #@ ## # $ # 944 | # . # # 945 | ########### 946 |947 |
948 |949 | ; 70 950 | 951 | ##### 952 | # @ #### 953 | # # 954 | # $ $$ # 955 | ##$## # 956 | # #### 957 | # .. # 958 | ##.. # 959 | ### # 960 | #### 961 |962 |
963 |964 | ; 71 965 | 966 | ########### 967 | # # ### 968 | # $@$ # . .# 969 | # ## ### ## # 970 | # # # # 971 | # # # # # 972 | # ######### # 973 | # # 974 | ############# 975 |976 |
977 |978 | ; 72 979 | 980 | #### 981 | ## ##### 982 | # $ @ # 983 | # $# # 984 | #### ##### 985 | # # # 986 | # $ # 987 | # ..# # 988 | # .#### 989 | # ## 990 | #### 991 |992 |
993 |994 | ; 73 995 | 996 | #### 997 | # ##### 998 | # $$ $ # 999 | # # 1000 | ## ## ## 1001 | #...#@# 1002 | # ### ## 1003 | # # 1004 | # # # 1005 | ######## 1006 |1007 |
1008 |1009 | ; 74 1010 | 1011 | #### 1012 | # ####### 1013 | #$ @# .# 1014 | ## #$$ .# 1015 | # $ ##..# 1016 | # # ##### 1017 | ### # 1018 | ##### 1019 |1020 |
1021 |1022 | ; 75 1023 | 1024 | ####### 1025 | ## ....## 1026 | # ###### 1027 | # $ $ @# 1028 | ### $ $ # 1029 | ### # 1030 | ###### 1031 |1032 |
1033 |1034 | ; 76 1035 | 1036 | ##### 1037 | ## # 1038 | # ##### 1039 | # #.# # 1040 | #@ #.# $ # 1041 | # #.# ## 1042 | # # # 1043 | ## ##$$# 1044 | ## # 1045 | # #### 1046 | #### 1047 |1048 |
1049 |1050 | ; 77 1051 | 1052 | ########## 1053 | # @ .... # 1054 | # ####$## 1055 | ## # $ $ # 1056 | # $ # 1057 | # ###### 1058 | ##### 1059 |1060 |
1061 |1062 | ; 78 1063 | 1064 | ####### 1065 | ## ## 1066 | # $ $ # 1067 | # $ $ $ # 1068 | ## ### #### 1069 | #@ .....# 1070 | ## ### 1071 | ####### 1072 |1073 |
1074 |1075 | ; 79 1076 | 1077 | ######### 1078 | # # # 1079 | ## $#$# # 1080 | # .$.@ # 1081 | # .# # 1082 | ########## 1083 |1084 |
1085 |1086 | ; 80 1087 | 1088 | #### 1089 | # ####### 1090 | # . ## .# 1091 | # $# .# 1092 | ## ## # .# 1093 | # # # 1094 | #### # # 1095 | # @$ ### 1096 | # $$ # 1097 | # # 1098 | ###### 1099 |1100 |
1101 |1102 | ; 81 1103 | 1104 | ##### 1105 | # # 1106 | # . # 1107 | ## * # 1108 | # *## 1109 | # @## 1110 | ## $ # 1111 | # # 1112 | ##### 1113 |1114 |
1115 |1116 | ; 82 1117 | 1118 | ##### 1119 | # ### 1120 | # . ## 1121 | ##*#$ # 1122 | # .# $ # 1123 | # @## ## 1124 | # # 1125 | ####### 1126 |1127 |
1128 |1129 | ; 83 1130 | 1131 | ###### 1132 | # ## 1133 | # $ $ ## 1134 | ## $$ # 1135 | # # # 1136 | # ## ## 1137 | # . .# 1138 | # @. .# 1139 | # #### 1140 | #### 1141 |1142 |
1143 |1144 | ; 84 1145 | 1146 | ######## 1147 | # ... # 1148 | # ### ## 1149 | # # $ # 1150 | ## #@$ # 1151 | # # $ # 1152 | # ### ##### 1153 | # # 1154 | # ### # 1155 | ##### ##### 1156 |1157 |
1158 |1159 | ; 85 1160 | 1161 | #### 1162 | ####### # 1163 | # $ # 1164 | # $ $ # 1165 | # ######## 1166 | ## # . # 1167 | # # # # 1168 | # @ . ## 1169 | ## # # # 1170 | # . # 1171 | ####### 1172 |1173 |
1174 |1175 | ; 86 1176 | 1177 | #### 1178 | ### ## 1179 | ## $ # 1180 | ## $ # # 1181 | # @#$$ # 1182 | # .. ### 1183 | # ..### 1184 | ##### 1185 |1186 |
1187 |1188 | ; 87 1189 | 1190 | #### 1191 | ###### # 1192 | # # 1193 | # ... .# 1194 | ##$###### 1195 | # $ # 1196 | # $### 1197 | ## $ # 1198 | ## @ # 1199 | ###### 1200 |1201 |
1202 |1203 | ; 88 1204 | 1205 | #### 1206 | # ### # 1207 | # # # 1208 | # # # # 1209 | # #$ #.# 1210 | # # # # # 1211 | # #$ #.# # 1212 | # # # # 1213 | ####$ #.# # 1214 | # @ # # 1215 | # # ## # 1216 | ######## 1217 |1218 |
1219 |1220 | ; 89 1221 | 1222 | ########## 1223 | # ## # 1224 | # $ $@# # 1225 | #### # $ # 1226 | #.# ## 1227 | # #.# $# 1228 | # #. # 1229 | # #. # 1230 | ###### 1231 |1232 |
1233 |1234 | ; 90 1235 | 1236 | ######## 1237 | # @ # 1238 | # $ $ # 1239 | ### ## ### 1240 | # $..$ # 1241 | # .. # 1242 | ########## 1243 |1244 |
1245 |1246 | ; 91 1247 | 1248 | ########### 1249 | # .## # 1250 | # $$@..$$ # 1251 | # ##. # 1252 | ########### 1253 |1254 |
1255 |1256 | ; 92 1257 | 1258 | #### 1259 | # # ##### 1260 | # # # # 1261 | # ######.# # 1262 | #### $ . # 1263 | # $$# ###.# # 1264 | # # # # # 1265 | ######### #@ ## 1266 | # # 1267 | #### 1268 |1269 |
1270 |1271 | ; 93 1272 | 1273 | ######### 1274 | ## # ## 1275 | # # # 1276 | # $ # $ # 1277 | # *.* # 1278 | ####.@.#### 1279 | # *.* # 1280 | # $ # $ # 1281 | # # # 1282 | ## # ## 1283 | ######### 1284 |1285 |
1286 |1287 | ; 94 1288 | 1289 | ######### 1290 | # @ # # 1291 | # $ $ # 1292 | ##$### ## 1293 | # ... # 1294 | # # # 1295 | ###### # 1296 | #### 1297 |1298 |
1299 |1300 | ; 95 1301 | 1302 | ######## 1303 | #@ # 1304 | # .$$. # 1305 | # $..$ # 1306 | # $..$ # 1307 | # .$$. # 1308 | # # 1309 | ######## 1310 |1311 |
1312 |1313 | ; 96 1314 | 1315 | ###### 1316 | # # 1317 | # # 1318 | ##### # 1319 | # #.##### 1320 | # $@$ # 1321 | #####.# # 1322 | ## ## ## 1323 | # $.# 1324 | # ### 1325 | ##### 1326 |1327 |
1328 |1329 | ; 97 1330 | 1331 | #### 1332 | # ######## 1333 | #### $ $.....# 1334 | # $ ###### 1335 | #@### ### 1336 | # $ # 1337 | # $ # # 1338 | ## # # 1339 | # # 1340 | ###### 1341 |1342 |
1343 |1344 | ; 98 1345 | 1346 | ##### 1347 | # ## #### 1348 | # $ ### .# 1349 | # $ $ .# 1350 | ## $#####.# #### 1351 | # $ # # .### # 1352 | # # # .# @ # 1353 | ### # # # 1354 | #### ## ## 1355 | ####### 1356 |1357 |
1358 |1359 | ; 99 1360 | 1361 | ##### 1362 | # # 1363 | ####### ####### # # 1364 | # # # # # 1365 | # @ #### # #### 1366 | # # ....## #### # 1367 | # ##### ## $$ $ $ # 1368 | ###### # # 1369 | # ########## 1370 | #### 1371 |1372 |
1373 |1374 | ; 100 1375 | 1376 | ####### 1377 | # @# # 1378 | #.$ # 1379 | #. # $## 1380 | #.$# # 1381 | #. # $ # 1382 | # # # 1383 | ######## 1384 |1385 |
1386 |1387 | ; 101 1388 | 'Lockdown' 1389 | 1390 | ##### 1391 | # # 1392 | # # ####### 1393 | # * # # 1394 | ## ## # # 1395 | # #* # 1396 | ### # # # ### 1397 | # *#$+ # 1398 | # # ## ## 1399 | # # * # 1400 | ####### # # 1401 | # # 1402 | ##### 1403 |1404 |
1405 |1406 | ; 102 1407 | 1408 | ########### 1409 | #....# # 1410 | # # $$ # 1411 | # @ ## # 1412 | # ##$ # 1413 | ###### $ # 1414 | # # 1415 | ###### 1416 |1417 |
1418 |1419 | ; 103 1420 | 1421 | ##### 1422 | # . ## 1423 | ### $ # 1424 | # . $#@# 1425 | # #$ . # 1426 | # $ ### 1427 | ## . # 1428 | ##### 1429 |1430 |
1431 |1432 | ; 104 1433 | 1434 | ##### 1435 | ##### # 1436 | # $ # 1437 | # $#$#@# 1438 | ### # # 1439 | # ... # 1440 | ### ## 1441 | # # 1442 | #### 1443 |1444 |
1445 |1446 | ; 105 1447 | 1448 | #### #### 1449 | ## ### ## 1450 | # # # # 1451 | # *. .* # 1452 | ###$ $### 1453 | # @ # 1454 | ###$ $### 1455 | # *. .* # 1456 | # # # # 1457 | ## ### ## 1458 | #### #### 1459 |1460 |
1461 |1462 | ; 106 1463 | 1464 | ######## 1465 | # # 1466 | #@ $ # 1467 | ## ###$ # 1468 | # .....### 1469 | # $ $ $ # 1470 | ###### # # 1471 | # # 1472 | ##### 1473 |1474 |
1475 |1476 | ; 107 1477 | 1478 | ######## 1479 | # # 1480 | # $*** # 1481 | # * * # 1482 | # * * # 1483 | # ***. # 1484 | # @# 1485 | ######## 1486 |1487 |
1488 |1489 | ; 108 1490 | 1491 | #### ##### 1492 | # ### # ## 1493 | # # #$ $ # 1494 | #..# ##### # # 1495 | # @ # $ $ # 1496 | #..# ## 1497 | ## ######### 1498 | ##### 1499 |1500 |
1501 |1502 | ; 109 1503 | 1504 | ####### 1505 | # # # 1506 | # # # # # 1507 | # @ $ # 1508 | ### ### # 1509 | # ### # 1510 | # $ ##.# 1511 | ## $ #.# 1512 | ## $ .# 1513 | # ## $#.# 1514 | ## ## #.# 1515 | ### # # 1516 | ### ##### 1517 |1518 |
1519 |1520 | ; 110 1521 | 1522 | #### 1523 | # # 1524 | # $#### 1525 | ###. . # 1526 | # $ # $ # 1527 | # . .### 1528 | ####$ # 1529 | # @# 1530 | #### 1531 |1532 |
1533 |1534 | ; 111 1535 | 1536 | ###### 1537 | # #### 1538 | # ...# 1539 | # ...# 1540 | ###### # 1541 | # # # 1542 | # $$ ## 1543 | # @$ # 1544 | # $$ # 1545 | ## $# # 1546 | # # 1547 | ###### 1548 |1549 |
1550 |1551 | ; 112 1552 | 1553 | ##### 1554 | ## #### 1555 | # $$$ # 1556 | # # $ # 1557 | # $## ## 1558 | ### #. # 1559 | # # # 1560 | ##### ### 1561 | # # ## 1562 | # @....# 1563 | # # 1564 | # # # 1565 | ######## 1566 |1567 |
1568 |1569 | ; 113 1570 | 1571 | ##### 1572 | ## # 1573 | ### # # 1574 | # . # 1575 | # ## ##### 1576 | # . . # ## 1577 | # # @ $ ### 1578 | #####. # $ # 1579 | #### $ # 1580 | ## $ ## 1581 | # ## 1582 | # # 1583 | #### 1584 |1585 |
1586 |1587 | ; 114 1588 | 1589 | ###### 1590 | # ### 1591 | # # $ # 1592 | # $ @ # 1593 | ## ## ##### 1594 | # #......# 1595 | # $ $ $ $ # 1596 | ## ###### 1597 | ##### 1598 |1599 |
1600 |1601 | ; 115 1602 | 1603 | ##### 1604 | ##### #### 1605 | # # # 1606 | # #..... # 1607 | ## ## # ### 1608 | #$$@$$$ # 1609 | # ### 1610 | ####### 1611 |1612 |
1613 |1614 | ; 116 1615 | 1616 | ##### 1617 | ### # 1618 | ####.....# 1619 | # @$$$$$ # 1620 | # # ## 1621 | ##### # 1622 | ##### 1623 |1624 |
1625 |1626 | ; 117 1627 | 1628 | #### #### 1629 | # ### ## 1630 | # @ # 1631 | ##..### # 1632 | # # # 1633 | #...#$ # # 1634 | # ## $$ $ # 1635 | # $ ### 1636 | #### ### 1637 | #### 1638 |1639 |
1640 |1641 | ; 118 1642 | 1643 | ##### 1644 | ## ## 1645 | # $ ## 1646 | # $ $ ## 1647 | ###$# . ## 1648 | # # . # 1649 | ## ##. # 1650 | # @ . ## 1651 | # # # 1652 | ######## 1653 |1654 |
1655 |1656 | ; 119 1657 | 1658 | ###### 1659 | # ## 1660 | ## ## # 1661 | # $$ # # 1662 | # @$ # # 1663 | # # # 1664 | #### # # 1665 | # ... ## 1666 | # ## 1667 | ####### 1668 |1669 |
1670 |1671 | ; 120 1672 | 1673 | #### 1674 | ####### # 1675 | # $ ## 1676 | # $##### # 1677 | # @# # # 1678 | ## ##.. # 1679 | # # ..#### 1680 | # $ ### 1681 | # $### 1682 | # # 1683 | #### 1684 |1685 |
1686 |1687 | ; 121 1688 | 1689 | ###### 1690 | # . # 1691 | ##$.# # 1692 | # * # 1693 | # ..### 1694 | ##$ # ##### 1695 | ## ## # # 1696 | # #### # # 1697 | # @ $ $ # 1698 | ## # # 1699 | ########## 1700 |1701 |
1702 |1703 | ; 122 1704 | 1705 | ##### 1706 | # ### 1707 | # #$ # 1708 | # $ # 1709 | # $ $ # 1710 | # $# # 1711 | # @### 1712 | ## ######## 1713 | # ...# 1714 | # # 1715 | ########..# 1716 | #### 1717 |1718 |
1719 |1720 | ; 123 1721 | 1722 | ######## 1723 | # # 1724 | # $ $$ ######## 1725 | ##### @##. . # 1726 | #$ # . # 1727 | # #. . ## 1728 | #$# ## # # 1729 | # # 1730 | # ### ## 1731 | # # #### 1732 | #### 1733 |1734 |
1735 |1736 | ; 124 1737 | 1738 | ############## 1739 | # # # 1740 | # $@$$ # . ..# 1741 | ## ## ### ## # 1742 | # # # # 1743 | # # # # # 1744 | # ######### # 1745 | # # 1746 | ############# 1747 |1748 |
1749 |1750 | ; 125 1751 | 1752 | ##### 1753 | # ## 1754 | # $ # 1755 | ######## #@## 1756 | # . # $ $ # 1757 | # $# # 1758 | #...##### # 1759 | ##### ##### 1760 |1761 |
1762 |1763 | ; 126 1764 | 1765 | ########### 1766 | ##....... # 1767 | # $$$$$$$@ # 1768 | # # # # ## 1769 | # # # # 1770 | # ####### 1771 | ##### 1772 |1773 |
1774 |1775 | ; 127 1776 | 1777 | ## #### 1778 | #### #### 1779 | # $ $. # 1780 | ## # .$ # 1781 | # ##.### 1782 | # $ . # 1783 | # @ # # 1784 | # ###### 1785 | #### 1786 |1787 |
1788 |1789 | ; 128 1790 | 1791 | ######### 1792 | ### # # 1793 | # * $ . . # 1794 | # $ ## ## 1795 | ####*# # 1796 | # @ ### 1797 | # ### 1798 | ##### 1799 |1800 |
1801 |1802 | ; 129 1803 | 1804 | ######### 1805 | ### @ # # 1806 | # * $ *.. # 1807 | # $ # # 1808 | ####*# ### 1809 | # ## 1810 | # ### 1811 | ##### 1812 |1813 |
1814 |1815 | ; 130 1816 | 1817 | ##### ##### 1818 | # ####.. # 1819 | # $$$ # 1820 | # $# .. # 1821 | ### @# ## # 1822 | # ## # 1823 | ########## 1824 |1825 |
1826 |1827 | ; 131 1828 | 1829 | ##### 1830 | # # 1831 | # . # 1832 | #.@.### 1833 | ##.# # 1834 | # $ # 1835 | # $ # 1836 | ##$$ # 1837 | # ### 1838 | # # 1839 | #### 1840 |1841 |
1842 |1843 | ; 132 1844 | 1845 | #### 1846 | # @### 1847 | #.* ##### 1848 | #..#$$ $ # 1849 | ## # 1850 | # # ## # 1851 | # ##### 1852 | ##### 1853 |1854 |
1855 |1856 | ; 133 1857 | 1858 | ####### 1859 | # . .### 1860 | # . . . # 1861 | ### #### # 1862 | # @$ $ # 1863 | # $$ $ # 1864 | #### ### 1865 | ##### 1866 |1867 |
1868 |1869 | ; 134 1870 | 1871 | #### 1872 | ######### # 1873 | # ## $ # 1874 | # $ ## # 1875 | ### #. .# ## 1876 | # #. .#$## 1877 | # # # # 1878 | # @ $ # 1879 | # ####### 1880 | #### 1881 |1882 |
1883 |1884 | ; 135 1885 | 1886 | ####### 1887 | # ##### 1888 | # $$#@##..# 1889 | # # # 1890 | # $ # # # 1891 | #### $ ..# 1892 | ######## 1893 |1894 |
1895 |1896 | ; 136 1897 | 1898 | ####### 1899 | # # 1900 | ## ###$## 1901 | #.$ @ # 1902 | # .. #$ # 1903 | #.## $ # 1904 | # #### 1905 | ###### 1906 |1907 |
1908 |1909 | ; 137 1910 | 1911 | #### 1912 | ## ### 1913 | #### # $ # 1914 | # #### $ $ # 1915 | # ..# #$ # 1916 | # # @ ### 1917 | ## #..# ### 1918 | # ## # # 1919 | # # 1920 | ######## 1921 |1922 |
1923 |1924 | ; 138 1925 | 1926 | #### 1927 | ### # 1928 | # ### 1929 | # # . .# 1930 | # @ ...#### 1931 | # # # # ## 1932 | # # $$ # 1933 | ##### $ $ # 1934 | ##$ # ## 1935 | # # 1936 | ###### 1937 |1938 |
1939 |1940 | ; 139 1941 | 1942 | #### 1943 | ## #### 1944 | # ...# 1945 | # ...# 1946 | # # ## 1947 | # #@ #### #### 1948 | ##### $ ### # 1949 | # ##$ $ # 1950 | ### $$ # 1951 | # $ ## ### 1952 | # ###### 1953 | ###### 1954 |1955 |
1956 |1957 | ; 140 1958 | 1959 | ######## ##### 1960 | # # ### # 1961 | # ## $ # 1962 | #.# @ ## $ ## 1963 | #.# # $ ## 1964 | #.# $ ## 1965 | #. ## ##### 1966 | ## # 1967 | ###### 1968 |1969 |
1970 |1971 | ; 141 1972 | 1973 | ######## 1974 | # # . # 1975 | # .*.# 1976 | # # * # 1977 | ####$##.## 1978 | # $ # 1979 | # $ ## $ # 1980 | # @# # 1981 | ########## 1982 |1983 |
1984 |1985 | ; 142 1986 | 1987 | #### 1988 | # # 1989 | # #### 1990 | ###$.$ # 1991 | # .@. # 1992 | # $.$### 1993 | #### # 1994 | # # 1995 | #### 1996 |1997 |
1998 |1999 | ; 143 2000 | 2001 | #### 2002 | # #### 2003 | # $ # 2004 | # .# # 2005 | # $# ## 2006 | # . # 2007 | #### # 2008 | # # 2009 | ### ### 2010 | # $ # 2011 | ## #$# ## 2012 | # $ @ $ # 2013 | # ..#.. # 2014 | ### ### 2015 | ##### 2016 |2017 |
2018 |2019 | ; 144 2020 | 2021 | #### 2022 | ### ##### 2023 | # $$ # # 2024 | # $ . .$$## 2025 | # .. #. $ # 2026 | ### #** . # 2027 | # . **# ### 2028 | # $ .# .. # 2029 | ##$$.@. $ # 2030 | # # $$ # 2031 | ##### ### 2032 | #### 2033 |2034 |
2035 |2036 | ; 145 2037 | 2038 | ##### 2039 | # @ # 2040 | ## ## 2041 | ###.$$$.### 2042 | # $...$ # 2043 | # $.#.$ # 2044 | # $...$ # 2045 | ###.$$$.### 2046 | ## ## 2047 | # # 2048 | ##### 2049 |2050 |
2051 |2052 | ; 146 2053 | 2054 | ####### 2055 | ## . ## 2056 | # .$$$. # 2057 | # $. .$ # 2058 | #.$ @ $.# 2059 | # $. .$ # 2060 | # .$$$. # 2061 | ## . ## 2062 | ####### 2063 |2064 |
2065 |2066 | ; 147 2067 | 'reduction of (Mas Sasquatch 8)' 2068 | 2069 | ##### 2070 | ######## # 2071 | #. . @#.# 2072 | # ### # 2073 | ## $ # # 2074 | # $ ##### 2075 | # $# # 2076 | ## # # 2077 | # ## 2078 | ##### 2079 |2080 |
2081 |2082 | ; 148 2083 | 'from (Original 18)' 2084 | 2085 | ########### 2086 | # . # # 2087 | # #. @ # 2088 | # #..# ####### 2089 | ## ## $$ $ $ # 2090 | ## # 2091 | ############# 2092 |2093 |
2094 |2095 | ; 149 2096 | 'from (Boxxle 43)' 2097 | 2098 | #### 2099 | ## ### 2100 | #@$ # 2101 | ### $ # 2102 | # ###### 2103 | # $....# 2104 | # # #### 2105 | ## # # 2106 | # $# # 2107 | # # 2108 | # ### 2109 | #### 2110 |2111 |
2112 |2113 | ; 150 2114 | 'from (Original 47)' 2115 | 2116 | #### 2117 | ##### # 2118 | # $####### 2119 | ## ## ..# ...# 2120 | # $ $$#$ @ # 2121 | # ### # 2122 | ####### # #### 2123 | #### 2124 |2125 |
2126 |2127 | ; 151 2128 | 'from (Original 47)' 2129 | 2130 | #### 2131 | # # 2132 | ### # 2133 | ## $ # 2134 | # # # 2135 | # #$$ ###### 2136 | # # # .# 2137 | # $ @ .# 2138 | ### ####..# 2139 | #### #### 2140 |2141 |
2142 |2143 | ; 152 2144 | 'reduced (Mas Sasquatch 23)' 2145 | 2146 | ###### #### 2147 | # # # 2148 | #.## #$## # 2149 | # # # # 2150 | #$ # ### # # 2151 | # # # # # 2152 | # # #### # # # 2153 | #. @ $ * . # 2154 | ############### 2155 |2156 |
2157 |2158 | ; 153 2159 | 'reduction of (Revenge 306)' 2160 | 2161 | ############# 2162 | #.# @# # # 2163 | #.#$$ # $ # 2164 | #.# # $# # 2165 | #.# $# # $## 2166 | #.# # $# # 2167 | #.# $# # $# 2168 | #.. # $ # 2169 | #.. # # # 2170 | ############ 2171 |2172 |
2173 |2174 | ; 154 2175 | 'Take the long way home.' 2176 | 2177 | ############################ 2178 | # # 2179 | # ######################## # 2180 | # # # # 2181 | # # #################### # # 2182 | # # # # # # 2183 | # # # ################ # # # 2184 | # # # # # # # # 2185 | # # # # ############ # # # # 2186 | # # # # # # # # # 2187 | # # # # # ############ # # # 2188 | # # # # # # # # 2189 | # # # # ################ # # 2190 | # # # # # # 2191 | ##$# # #################### # 2192 | #. @ # # 2193 | ############################# 2194 |2195 |
2196 |2197 | ; 155 2198 | 'The Dungeon' 2199 | 2200 | ###### #### 2201 | #####*# ################# ## 2202 | # ### # 2203 | # ######## #### ## # 2204 | ### #### # #### #### ## 2205 | #*# # .# # # # # # # 2206 | #*# # # # ## # ## ## # 2207 | ### ### ### # ## # ## ## 2208 | # # #*# # # # # 2209 | # # ### ##### #### # # 2210 | ##### ##### ####### ###### 2211 | # # # #**# # 2212 | ## # # #**# ####### ## # 2213 | # ######### # ##### ### 2214 | # # # $ #*# 2215 | # ######### ### @##### #*# 2216 | ##### #### #### ###### 2217 |2218 |2221 | 2222 |2227 | 2228 |
2223 | 2224 |This version of Sokoban was written by Borgar Þorsteinsson one 2225 | boring evening in 2009. It is licenced under the GNU General Public Licence v3.0.
2226 |0 ) { 55 | post = lines.slice( i ); 56 | break; 57 | } 58 | pre.push( line ); 59 | } 60 | } 61 | this.levelData = level; 62 | this.height = level.length; 63 | this.width = wid; 64 | this.indentCleanup(); 65 | this.levelContainer = _LC.clone(); 66 | this.moves = 0; 67 | this.pushes = 0; 68 | var men = this.count( 'man' ), 69 | docks = this.count( 'dock' ), 70 | boxes = this.count( 'box' ); 71 | if ( men !== 1 || docks !== boxes || this.height < 3 || this.width < 3 ) { 72 | // this is an unplayable level 73 | return false; 74 | } 75 | this.level 76 | .empty() 77 | .append( ' ' + pre.join( '\n' ) + '\n' ) 78 | .append( this.levelContainer.empty() ) 79 | .append( '' + post.join( '\n' ) + '' ); 80 | this.undoBuffer = []; 81 | this.levelContainer 82 | .append( this.renderLevel() ) 83 | .attr( 'tabindex', 1 ); // focusable 84 | this.reTitle(); 85 | return true; 86 | }, 87 | 88 | indentCleanup: function () { 89 | this.scanLevel(function ( t, x, y ) { 90 | if ( x === 0 || y === 0 || 91 | x === this.width -1 || y === this.height -1 ) { 92 | this.floodFill( x, y ); 93 | } 94 | }); 95 | }, 96 | 97 | floodFill: function ( x, y ) { 98 | if ( x > -1 && y > -1 && y < this.height && x < this.width ) { 99 | var c = this.levelData[ y ][ x ] || {}; 100 | if ( !c.wall && !c.box && !c.man && !c.dock && !c.overflow ) { 101 | c.overflow = true; 102 | this.levelData[ y ][ x ] = c; 103 | this.floodFill( x - 1, y ).floodFill( x, y - 1 ) 104 | .floodFill( x + 1, y ).floodFill( x, y + 1 ); 105 | } 106 | } 107 | return this; 108 | }, 109 | 110 | reTitle: function () { 111 | var s = this.boxesLeft ? '' : 'Solved: '; 112 | this.levelContainer.attr( 'title', s + this.moves + ' / ' + this.pushes ); 113 | }, 114 | 115 | renderLevel: function () { 116 | var r = '', P = ' ' + _CLS; 117 | this.boxesLeft = 0; 118 | for ( var y=0; y'; 120 | for ( var x=0; x ' + s + ''; 154 | } 155 | r += '\n'; 156 | } 157 | return r; 158 | }, 159 | 160 | count: function ( attr ) { 161 | var r = 0; 162 | this.scanLevel(function ( t ) { r += t[attr] ? 1 : 0; }); 163 | return r; 164 | }, 165 | 166 | manPos: function () { 167 | var pos; 168 | this.scanLevel(function ( t, x, y ) { 169 | if ( t.man ) { 170 | pos = { x:x, y:y }; 171 | return false; 172 | } 173 | }); 174 | if ( !pos ) { throw 'man overboard'; } 175 | return pos; 176 | }, 177 | 178 | scanLevel: function ( callback ) { 179 | var x, y, t, r; 180 | for ( y=0; y