diff options
Diffstat (limited to 'js/lost.js')
-rw-r--r-- | js/lost.js | 296 |
1 files changed, 254 insertions, 42 deletions
@@ -5,10 +5,56 @@ | |||
5 | // Helper functions | 5 | // Helper functions |
6 | // | 6 | // |
7 | 7 | ||
8 | // | ||
9 | // Class: RandomLcg | ||
10 | // | ||
11 | function RandomLcg() | ||
12 | { | ||
13 | this.iState = 0; | ||
14 | this.iSeed = 0; | ||
15 | |||
16 | this.inventSeed(); | ||
17 | } | ||
18 | |||
19 | RandomLcg.prototype.setSeed = function setSeed( iSeed ) | ||
20 | { | ||
21 | this.iState = this.iSeed = iSeed; | ||
22 | } | ||
23 | |||
24 | RandomLcg.prototype.getSeed = function getSeed() | ||
25 | { | ||
26 | return this.iSeed; | ||
27 | } | ||
28 | |||
29 | RandomLcg.prototype.inventSeed = function inventSeed() | ||
30 | { | ||
31 | // Based on my reading it's safest to assume that we can get 16 bits worth | ||
32 | // of random data reliably. Let's build a 32 bit number from two 16 bit | ||
33 | // numbers. | ||
34 | this.setSeed( | ||
35 | (Math.floor(Math.random()*0xffff)) | | ||
36 | (Math.floor(Math.random()*0xffff)<<16) | ||
37 | ); | ||
38 | } | ||
39 | |||
40 | RandomLcg.prototype.random = function random() | ||
41 | { | ||
42 | this.iState = ((this.iState * 1103515245) + 12345) & 0x7fffffff; | ||
43 | return this.iState/(0x7fffffff+1); | ||
44 | } | ||
45 | |||
46 | RandomLcg.prototype.randInt = function randInt( max ) | ||
47 | { | ||
48 | return Math.floor(this.random() * max); | ||
49 | } | ||
50 | |||
51 | let lRand = new RandomLcg(); | ||
52 | |||
8 | // Just return a random integer between 0 and max, exclusive on the upper bound. | 53 | // Just return a random integer between 0 and max, exclusive on the upper bound. |
9 | function randInt( max ) | 54 | function randInt( max ) |
10 | { | 55 | { |
11 | return Math.floor(Math.random() * max); | 56 | return lRand.randInt( max ); |
57 | // return Math.floor(Math.random() * max); | ||
12 | } | 58 | } |
13 | 59 | ||
14 | // Return the id for the opposite direction of the direction given. | 60 | // Return the id for the opposite direction of the direction given. |
@@ -55,34 +101,47 @@ function Cell() | |||
55 | // | 101 | // |
56 | function Position( iDims, ...Vals ) | 102 | function Position( iDims, ...Vals ) |
57 | { | 103 | { |
58 | // Store dimension count | 104 | if( typeof iDims === 'string' ) |
59 | this.iDims = iDims; | ||
60 | |||
61 | // Check to see if Vals is a non-empty array | ||
62 | if( Array.isArray(Vals) && Vals.length > 0 ) | ||
63 | { | 105 | { |
64 | // Make sure Vals has the right number of elements | 106 | let sChunks = iDims.split(','); |
65 | if( Vals.length != iDims ) | 107 | this.iDims = sChunks.length; |
108 | this.aiValues = new Array(this.iDims); | ||
109 | for( let j = 0; j < this.iDims; j++ ) | ||
66 | { | 110 | { |
67 | throw new Error( | 111 | this.aiValues[j] = parseInt( sChunks[j].trim(), 10 ); |
68 | 'Position must be initialized with no dimensional data, '+ | ||
69 | 'or the correct number of elements.'); | ||
70 | } | 112 | } |
71 | |||
72 | // If it does have the correct number of elements, just | ||
73 | // use it instead of creating a new array | ||
74 | this.aiValues = Vals; | ||
75 | } | 113 | } |
76 | else | 114 | else |
77 | { | 115 | { |
78 | // We don't have values from the constructor, let's just | 116 | // Store dimension count |
79 | // create a new blank one... | 117 | this.iDims = iDims; |
80 | this.aiValues = new Array( this.iDims ); | ||
81 | 118 | ||
82 | // ...and set the position to zero in all dimensions. | 119 | // Check to see if Vals is a non-empty array |
83 | for( let j = 0; j < this.iDims; j++ ) | 120 | if( Array.isArray(Vals) && Vals.length > 0 ) |
121 | { | ||
122 | // Make sure Vals has the right number of elements | ||
123 | if( Vals.length != iDims ) | ||
124 | { | ||
125 | throw new Error( | ||
126 | 'Position must be initialized with no dimensional data, '+ | ||
127 | 'or the correct number of elements.'); | ||
128 | } | ||
129 | |||
130 | // If it does have the correct number of elements, just | ||
131 | // use it instead of creating a new array | ||
132 | this.aiValues = Vals; | ||
133 | } | ||
134 | else | ||
84 | { | 135 | { |
85 | this.aiValues[j] = 0; | 136 | // We don't have values from the constructor, let's just |
137 | // create a new blank one... | ||
138 | this.aiValues = new Array( this.iDims ); | ||
139 | |||
140 | // ...and set the position to zero in all dimensions. | ||
141 | for( let j = 0; j < this.iDims; j++ ) | ||
142 | { | ||
143 | this.aiValues[j] = 0; | ||
144 | } | ||
86 | } | 145 | } |
87 | } | 146 | } |
88 | } | 147 | } |
@@ -135,6 +194,17 @@ Position.prototype.equals = function equals( rhs ) | |||
135 | return true; | 194 | return true; |
136 | } | 195 | } |
137 | 196 | ||
197 | Position.prototype.toString = function toString() | ||
198 | { | ||
199 | let ret = this.aiValues[0].toString(); | ||
200 | for( let j = 1; j < this.aiValues.length; j++ ) | ||
201 | { | ||
202 | ret += ',' + this.aiValues[j].toString(); | ||
203 | } | ||
204 | |||
205 | return ret; | ||
206 | } | ||
207 | |||
138 | // | 208 | // |
139 | // Class: Map | 209 | // Class: Map |
140 | // | 210 | // |
@@ -144,7 +214,10 @@ function Map( Dimensions ) | |||
144 | this.Dimensions = Dimensions; | 214 | this.Dimensions = Dimensions; |
145 | this.aWorms = new Array(); | 215 | this.aWorms = new Array(); |
146 | this.pPlayer = null; | 216 | this.pPlayer = null; |
217 | this.pGoal = null; | ||
147 | this.ePlayerMoved = new Signal(); | 218 | this.ePlayerMoved = new Signal(); |
219 | this.eVictory = new Signal(); | ||
220 | this.ePlayerSetup = new Signal(); | ||
148 | 221 | ||
149 | // Compute the total number of cells | 222 | // Compute the total number of cells |
150 | let iTotalSize = 1; | 223 | let iTotalSize = 1; |
@@ -199,6 +272,11 @@ Map.prototype.movePlayer = function movePlayer( iDim, iDelta ) | |||
199 | 272 | ||
200 | this.pPlayer.add( iDim, iDelta ); | 273 | this.pPlayer.add( iDim, iDelta ); |
201 | this.ePlayerMoved.call(); | 274 | this.ePlayerMoved.call(); |
275 | |||
276 | if( this.pPlayer.equals( this.pGoal ) ) | ||
277 | { | ||
278 | this.eVictory.call(); | ||
279 | } | ||
202 | } | 280 | } |
203 | 281 | ||
204 | Map.prototype.isInside = function isInside( Position ) | 282 | Map.prototype.isInside = function isInside( Position ) |
@@ -245,9 +323,14 @@ Map.prototype.get = function get( Position ) | |||
245 | 323 | ||
246 | Map.prototype.addWorm = function addWorm( pStart ) | 324 | Map.prototype.addWorm = function addWorm( pStart ) |
247 | { | 325 | { |
248 | if( this.aWorms.length === 0 ) | 326 | if( this.pPlayer === null ) |
249 | { | 327 | { |
250 | this.pPlayer = pStart; | 328 | this.pPlayer = pStart; |
329 | this.ePlayerSetup.call(); | ||
330 | } | ||
331 | else if( this.pGoal === null ) | ||
332 | { | ||
333 | this.pGoal = pStart; | ||
251 | } | 334 | } |
252 | let iNewId = this.aWorms.length+1; | 335 | let iNewId = this.aWorms.length+1; |
253 | this.aWorms.push( | 336 | this.aWorms.push( |
@@ -513,9 +596,16 @@ function RenderCanvas2D( rMap, eParent ) | |||
513 | this.rMap.ePlayerMoved.connect( | 596 | this.rMap.ePlayerMoved.connect( |
514 | RenderCanvas2D.prototype.render.bind( this ) | 597 | RenderCanvas2D.prototype.render.bind( this ) |
515 | ); | 598 | ); |
599 | this.rMap.ePlayerMoved.connect( | ||
600 | RenderCanvas2D.prototype.updateButtons.bind( this ) | ||
601 | ); | ||
602 | this.rMap.eVictory.connect( | ||
603 | RenderCanvas2D.prototype.setVictory.bind( this ) | ||
604 | ); | ||
516 | 605 | ||
517 | this.eCanvas = null; | 606 | this.eCanvas = null; |
518 | this.ctx = null; | 607 | this.ctx = null; |
608 | this.isSolved = false; | ||
519 | 609 | ||
520 | this.pExtPosition = new Position( rMap.getDims() ); | 610 | this.pExtPosition = new Position( rMap.getDims() ); |
521 | 611 | ||
@@ -535,13 +625,17 @@ function RenderCanvas2D( rMap, eParent ) | |||
535 | eParent.appendChild( this.eCanvas ); | 625 | eParent.appendChild( this.eCanvas ); |
536 | this.ctx = this.eCanvas.getContext("2d"); | 626 | this.ctx = this.eCanvas.getContext("2d"); |
537 | this.ctx.lineWidth = 1.0; | 627 | this.ctx.lineWidth = 1.0; |
628 | this.ctx.font = Math.ceil(this.iIconSize) + 'px sans serif'; | ||
629 | this.ctx.textBaseline = 'top'; | ||
630 | |||
631 | this.aMoveButtons = []; | ||
538 | 632 | ||
539 | this.render(); | 633 | this.render(); |
540 | 634 | ||
541 | let btnBox = document.createElement('div'); | 635 | this.btnBox = document.createElement('div'); |
542 | eParent.appendChild( document.createElement('br') ); | 636 | eParent.appendChild( document.createElement('br') ); |
543 | eParent.appendChild( document.createElement('br') ); | 637 | eParent.appendChild( document.createElement('br') ); |
544 | eParent.appendChild( btnBox ); | 638 | eParent.appendChild( this.btnBox ); |
545 | 639 | ||
546 | let cardTbl; | 640 | let cardTbl; |
547 | let cardRow; | 641 | let cardRow; |
@@ -552,24 +646,32 @@ function RenderCanvas2D( rMap, eParent ) | |||
552 | cardTbl.appendChild( cardRow ); | 646 | cardTbl.appendChild( cardRow ); |
553 | cardRow.appendChild( document.createElement('td') ); | 647 | cardRow.appendChild( document.createElement('td') ); |
554 | cardTd = document.createElement('td'); | 648 | cardTd = document.createElement('td'); |
555 | cardTd.appendChild( createMoveButton( this.rMap, 1, -1, "North" ) ); | 649 | this.aMoveButtons[2] = cardTd.appendChild( |
650 | createMoveButton( this.rMap, 1, -1, "North" ) | ||
651 | ); | ||
556 | cardRow.appendChild( cardTd ); | 652 | cardRow.appendChild( cardTd ); |
557 | cardRow.appendChild( document.createElement('td') ); | 653 | cardRow.appendChild( document.createElement('td') ); |
558 | if( this.rMap.getDims() >= 3 ) | 654 | if( this.rMap.getDims() >= 3 ) |
559 | { | 655 | { |
560 | cardTd = document.createElement('td'); | 656 | cardTd = document.createElement('td'); |
561 | cardTd.appendChild( createMoveButton( this.rMap, 2, -1, "Up" ) ); | 657 | this.aMoveButtons[4] = cardTd.appendChild( |
658 | createMoveButton( this.rMap, 2, -1, "Up (^)" ) | ||
659 | ); | ||
562 | cardRow.appendChild( cardTd ); | 660 | cardRow.appendChild( cardTd ); |
563 | } | 661 | } |
564 | 662 | ||
565 | cardRow = document.createElement('tr'); | 663 | cardRow = document.createElement('tr'); |
566 | cardTbl.appendChild( cardRow ); | 664 | cardTbl.appendChild( cardRow ); |
567 | cardTd = document.createElement('td'); | 665 | cardTd = document.createElement('td'); |
568 | cardTd.appendChild( createMoveButton( this.rMap, 0, -1, "West" ) ); | 666 | this.aMoveButtons[0] = cardTd.appendChild( |
667 | createMoveButton( this.rMap, 0, -1, "West" ) | ||
668 | ); | ||
569 | cardRow.appendChild( cardTd ); | 669 | cardRow.appendChild( cardTd ); |
570 | cardRow.appendChild( document.createElement('td') ); | 670 | cardRow.appendChild( document.createElement('td') ); |
571 | cardTd = document.createElement('td'); | 671 | cardTd = document.createElement('td'); |
572 | cardTd.appendChild( createMoveButton( this.rMap, 0, 1, "East" ) ); | 672 | this.aMoveButtons[1] = cardTd.appendChild( |
673 | createMoveButton( this.rMap, 0, 1, "East" ) | ||
674 | ); | ||
573 | cardRow.appendChild( cardTd ); | 675 | cardRow.appendChild( cardTd ); |
574 | if( this.rMap.getDims() >= 3 ) | 676 | if( this.rMap.getDims() >= 3 ) |
575 | { | 677 | { |
@@ -580,23 +682,25 @@ function RenderCanvas2D( rMap, eParent ) | |||
580 | cardTbl.appendChild( cardRow ); | 682 | cardTbl.appendChild( cardRow ); |
581 | cardRow.appendChild( document.createElement('td') ); | 683 | cardRow.appendChild( document.createElement('td') ); |
582 | cardTd = document.createElement('td'); | 684 | cardTd = document.createElement('td'); |
583 | cardTd.appendChild( createMoveButton( this.rMap, 1, 1, "South" ) ); | 685 | this.aMoveButtons[3] = cardTd.appendChild( |
686 | createMoveButton( this.rMap, 1, 1, "South" ) | ||
687 | ); | ||
584 | cardRow.appendChild( cardTd ); | 688 | cardRow.appendChild( cardTd ); |
585 | cardRow.appendChild( document.createElement('td') ); | 689 | cardRow.appendChild( document.createElement('td') ); |
586 | if( this.rMap.getDims() >= 3 ) | 690 | if( this.rMap.getDims() >= 3 ) |
587 | { | 691 | { |
588 | cardTd = document.createElement('td'); | 692 | cardTd = document.createElement('td'); |
589 | cardTd.appendChild( createMoveButton( this.rMap, 2, 1, "Down" ) ); | 693 | this.aMoveButtons[5] = cardTd.appendChild( |
694 | createMoveButton( this.rMap, 2, 1, "Down (v)" ) | ||
695 | ); | ||
590 | cardRow.appendChild( cardTd ); | 696 | cardRow.appendChild( cardTd ); |
591 | } | 697 | } |
592 | 698 | ||
593 | btnBox.appendChild( cardTbl ); | 699 | this.btnBox.appendChild( cardTbl ); |
594 | 700 | ||
595 | let names = []; | 701 | let names = []; |
596 | names[6] = 'In'; | 702 | // names[6] = 'In (<)'; |
597 | names[7] = 'Out'; | 703 | // names[7] = 'Out (>)'; |
598 | names[8] = 'Through'; | ||
599 | names[9] = 'Around'; | ||
600 | 704 | ||
601 | cardTbl = document.createElement('table'); | 705 | cardTbl = document.createElement('table'); |
602 | for( let j = 3; j < this.rMap.getDims(); j++ ) | 706 | for( let j = 3; j < this.rMap.getDims(); j++ ) |
@@ -607,24 +711,30 @@ function RenderCanvas2D( rMap, eParent ) | |||
607 | let label; | 711 | let label; |
608 | 712 | ||
609 | if( typeof names[j*2] === 'undefined' ) | 713 | if( typeof names[j*2] === 'undefined' ) |
610 | label = 'Dim ' + (j+1) + ': -'; | 714 | label = (j+1) + '-'; |
611 | else | 715 | else |
612 | label = names[j*2]; | 716 | label = names[j*2]; |
613 | 717 | ||
614 | cardTd = document.createElement('td'); | 718 | cardTd = document.createElement('td'); |
615 | cardTd.appendChild( createMoveButton( this.rMap, j, -1, label ) ); | 719 | this.aMoveButtons[j*2] = cardTd.appendChild( |
720 | createMoveButton( this.rMap, j, -1, label ) | ||
721 | ); | ||
616 | cardRow.appendChild( cardTd ); | 722 | cardRow.appendChild( cardTd ); |
617 | 723 | ||
618 | if( typeof names[j*2+1] === 'undefined' ) | 724 | if( typeof names[j*2+1] === 'undefined' ) |
619 | label = 'Dim ' + (j+1) + ': +'; | 725 | label = (j+1) + '+'; |
620 | else | 726 | else |
621 | label = names[j*2+1]; | 727 | label = names[j*2+1]; |
622 | 728 | ||
623 | cardTd = document.createElement('td'); | 729 | cardTd = document.createElement('td'); |
624 | cardTd.appendChild( createMoveButton( this.rMap, j, 1, label ) ); | 730 | this.aMoveButtons[j*2+1] = cardTd.appendChild( |
731 | createMoveButton( this.rMap, j, 1, label ) | ||
732 | ); | ||
625 | cardRow.appendChild( cardTd ); | 733 | cardRow.appendChild( cardTd ); |
626 | } | 734 | } |
627 | btnBox.appendChild( cardTbl ); | 735 | this.btnBox.appendChild( cardTbl ); |
736 | |||
737 | this.updateButtons(); | ||
628 | } | 738 | } |
629 | 739 | ||
630 | RenderCanvas2D.prototype = Object.create(Render.prototype); | 740 | RenderCanvas2D.prototype = Object.create(Render.prototype); |
@@ -649,6 +759,15 @@ RenderCanvas2D.prototype.render = function render() | |||
649 | p.set( 0, x ); | 759 | p.set( 0, x ); |
650 | p.set( 1, y ); | 760 | p.set( 1, y ); |
651 | let c = this.rMap.get( p ); | 761 | let c = this.rMap.get( p ); |
762 | |||
763 | if( p.equals( this.rMap.pGoal ) ) | ||
764 | { | ||
765 | let oldStyle = this.ctx.fillStyle; | ||
766 | this.ctx.fillStyle = 'palegreen'; | ||
767 | this.ctx.fillRect( x*iSize+2, y*iSize+2, iSize-4, iSize-4 ); | ||
768 | this.ctx.fillStyle = oldStyle; | ||
769 | } | ||
770 | |||
652 | if( (c.iWalls&1) === 0 && x === 0) | 771 | if( (c.iWalls&1) === 0 && x === 0) |
653 | { | 772 | { |
654 | this.ctx.moveTo( x*iSize, y*iSize ); | 773 | this.ctx.moveTo( x*iSize, y*iSize ); |
@@ -704,7 +823,7 @@ RenderCanvas2D.prototype.render = function render() | |||
704 | 0, | 823 | 0, |
705 | Math.PI*2.0, | 824 | Math.PI*2.0, |
706 | false | 825 | false |
707 | ); | 826 | ); |
708 | this.ctx.fill(); | 827 | this.ctx.fill(); |
709 | } | 828 | } |
710 | } | 829 | } |
@@ -753,7 +872,7 @@ RenderCanvas2D.prototype.renderDirIcon = function renderDirIcon( | |||
753 | by | 872 | by |
754 | ); | 873 | ); |
755 | break; | 874 | break; |
756 | 875 | /* | |
757 | case 6: | 876 | case 6: |
758 | // In | 877 | // In |
759 | this.ctx.moveTo( | 878 | this.ctx.moveTo( |
@@ -785,9 +904,42 @@ RenderCanvas2D.prototype.renderDirIcon = function renderDirIcon( | |||
785 | by+this.iIconSize | 904 | by+this.iIconSize |
786 | ); | 905 | ); |
787 | break; | 906 | break; |
907 | */ | ||
908 | default: | ||
909 | let label = | ||
910 | Math.floor((iDir/2.0)+1).toString() + | ||
911 | (((iDir%2)===0)?'-':'+'); | ||
912 | this.ctx.fillText( | ||
913 | label, | ||
914 | bx, by | ||
915 | ); | ||
916 | break; | ||
917 | } | ||
918 | } | ||
919 | |||
920 | RenderCanvas2D.prototype.updateButtons = function updateButtons() | ||
921 | { | ||
922 | let c = this.rMap.get( this.rMap.pPlayer ); | ||
923 | for( let j = 0; j < this.rMap.getDims()*2; j++ ) | ||
924 | { | ||
925 | this.aMoveButtons[j].disabled = (c.iWalls&(1<<j)) === 0; | ||
788 | } | 926 | } |
789 | } | 927 | } |
790 | 928 | ||
929 | RenderCanvas2D.prototype.setVictory = function setVictory() | ||
930 | { | ||
931 | while( this.btnBox.hasChildNodes() ) | ||
932 | { | ||
933 | this.btnBox.removeChild( this.btnBox.firstChild ); | ||
934 | } | ||
935 | |||
936 | let h1 = document.createElement('h1'); | ||
937 | h1.appendChild( | ||
938 | document.createTextNode('You win!') | ||
939 | ); | ||
940 | this.btnBox.appendChild( h1 ); | ||
941 | } | ||
942 | |||
791 | RenderCanvas2D.prototype.setFloor = function setFloor( aFloor ) | 943 | RenderCanvas2D.prototype.setFloor = function setFloor( aFloor ) |
792 | { | 944 | { |
793 | for( let j = 0; j < aFloor.length; j++ ) | 945 | for( let j = 0; j < aFloor.length; j++ ) |
@@ -800,7 +952,30 @@ RenderCanvas2D.prototype.setFloor = function setFloor( aFloor ) | |||
800 | // | 952 | // |
801 | // Initialize | 953 | // Initialize |
802 | // | 954 | // |
955 | |||
803 | let p = new Position( 4, 3, 3, 3, 3 ); | 956 | let p = new Position( 4, 3, 3, 3, 3 ); |
957 | |||
958 | if( document.location.search !== '' ) | ||
959 | { | ||
960 | let dat = document.location.search.slice(1); | ||
961 | let datChunks = dat.split('&'); | ||
962 | for( let j = 0; j < datChunks.length; j++ ) | ||
963 | { | ||
964 | let pair = datChunks[j].split('='); | ||
965 | if( pair.length == 2 ) | ||
966 | { | ||
967 | if( pair[0] == 'seed' ) | ||
968 | { | ||
969 | lRand.setSeed( parseInt( decodeURIComponent( pair[1] ), 10 ) ); | ||
970 | } | ||
971 | else if( pair[0] == 'dims' ) | ||
972 | { | ||
973 | p = new Position( decodeURIComponent( pair[1] ) ); | ||
974 | } | ||
975 | } | ||
976 | } | ||
977 | } | ||
978 | |||
804 | let m = new Map( p ); | 979 | let m = new Map( p ); |
805 | let exit1 = new Position( p.getDims() ); | 980 | let exit1 = new Position( p.getDims() ); |
806 | let exit2 = new Position( p.getDims() ); | 981 | let exit2 = new Position( p.getDims() ); |
@@ -810,3 +985,40 @@ m.addWorm( exit2 ); | |||
810 | m.buildMaze(); | 985 | m.buildMaze(); |
811 | 986 | ||
812 | let rend = new RenderCanvas2D( m, document.body ); | 987 | let rend = new RenderCanvas2D( m, document.body ); |
988 | |||
989 | let formDiv = document.createElement('div'); | ||
990 | let form = document.createElement('form'); | ||
991 | let dims = document.createElement('input'); | ||
992 | dims.name = 'dims'; | ||
993 | dims.value = p.toString(); | ||
994 | let sub = document.createElement('input'); | ||
995 | sub.type = 'submit'; | ||
996 | sub.value = 'New maze!'; | ||
997 | form.appendChild( dims ); | ||
998 | form.appendChild( document.createTextNode(' ') ); | ||
999 | form.appendChild( sub ); | ||
1000 | let pExp = document.createElement('p'); | ||
1001 | pExp.appendChild( | ||
1002 | document.createTextNode( | ||
1003 | 'Provide a number below for each dimension in the new maze. The numbers are the size of each dimension. Entering "10, 3" will create a maze that is 10 wide and 3 tall. Entering "5, 5, 5, 5, 5" will create a 5 dimensional maze, every dimension will be 5 wide.' | ||
1004 | ) | ||
1005 | ); | ||
1006 | formDiv.appendChild( pExp ); | ||
1007 | formDiv.appendChild( form ); | ||
1008 | document.body.appendChild( document.createElement('br') ); | ||
1009 | document.body.appendChild( formDiv ); | ||
1010 | |||
1011 | let d = document.createElement('div'); | ||
1012 | let dLink = document.createElement('a'); | ||
1013 | let trgUrl = document.location.toString(); | ||
1014 | let query = trgUrl.indexOf('?'); | ||
1015 | if( query >= 0 ) | ||
1016 | { | ||
1017 | trgUrl = trgUrl.substring(0, query); | ||
1018 | } | ||
1019 | trgUrl += '?seed=' + lRand.getSeed() + '&dims=' + p.toString(); | ||
1020 | dLink.href = trgUrl; | ||
1021 | dLink.appendChild( document.createTextNode('Share this maze!') ); | ||
1022 | d.appendChild(dLink); | ||
1023 | document.body.appendChild( document.createElement('br') ); | ||
1024 | document.body.appendChild( d ); | ||