@@ -6,7 +6,6 @@ enum MazeAlgorithm {
66
77//% weight=100 color=#0fbc11 icon="╬"
88namespace maze {
9-
109 /**
1110 * Generates a maze using the chosen algorithm
1211 * @param mazeWidth width of maze
@@ -15,15 +14,16 @@ namespace maze {
1514 * @param floor tile to use for floors
1615 * @param corridorSize width of corridors
1716 */
18- //% block="Create $algorithm maze tilemap, width $mazeWidth height $mazeHeight wall $wall floor $floor || corridorSize $corridorSize"
17+ //% block="Create $algorithm maze tilemap, width $mazeWidth height $mazeHeight wall $wall floor $floor || corridorSize $corridorSize seed $seed "
1918 //% wall.shadow=tileset_tile_picker
2019 //% floor.shadow=tileset_tile_picker
2120 //% corridorSize.defl=2
2221 //% inlineInputMode=inline
23- export function generateTilemap ( algorithm : MazeAlgorithm , mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize ?: number ) : tiles . TileMapData {
24- return algorithm === MazeAlgorithm . BinaryTree ? generateBinaryTreeTilemap ( mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) :
25- algorithm === MazeAlgorithm . Sidewinder ? generateSidewinderTilemap ( mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) :
26- generateEllersTilemap ( mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) ;
22+ export function generateTilemap ( algorithm : MazeAlgorithm , mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize ?: number , seed ?:number | undefined ) : tiles . TileMapData {
23+ const rng = new Math . FastRandom ( seed ) ;
24+ return algorithm === MazeAlgorithm . BinaryTree ? generateBinaryTreeTilemap ( rng , mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) :
25+ algorithm === MazeAlgorithm . Sidewinder ? generateSidewinderTilemap ( rng , mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) :
26+ generateEllersTilemap ( rng , mazeWidth , mazeHeight , wall , floor , corridorSize || 2 ) ;
2727 }
2828
2929 function createTilemap ( mazeWidth : number , mazeHeight : number , corridorSize : number , tmTiles : Image [ ] ) : tiles . TileMapData {
@@ -51,7 +51,7 @@ namespace maze {
5151 return arr
5252 }
5353
54- function generateBinaryTreeTilemap ( mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
54+ function generateBinaryTreeTilemap ( rng : Math . FastRandom , mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
5555 let tmData = createTilemap ( mazeWidth , mazeHeight , corridorSize , [ floor , wall ] ) ;
5656 fillWalls ( tmData ) ;
5757
@@ -69,7 +69,7 @@ namespace maze {
6969 // If right edge, carve down
7070 x === xMax ? [ 0 , 1 ] :
7171 // Pick random
72- Math . randomRange ( 0 , 1 ) ? [ 1 , 0 ] : [ 0 , 1 ] ;
72+ rng . randomBool ( ) ? [ 1 , 0 ] : [ 0 , 1 ] ;
7373 // Set floor
7474 for ( let by = 0 ; by < corridorSize + cy ; ++ by )
7575 for ( let bx = 0 ; bx < corridorSize + cx ; ++ bx ) {
@@ -81,7 +81,7 @@ namespace maze {
8181 return tmData ;
8282 }
8383
84- function generateSidewinderTilemap ( mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
84+ function generateSidewinderTilemap ( rng : Math . FastRandom , mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
8585 // https://weblog.jamisbuck.org/2011/2/3/maze-generation-sidewinder-algorithm.html
8686 let tmData = createTilemap ( mazeWidth , mazeHeight , corridorSize , [ floor , wall ] ) ;
8787 fillWalls ( tmData ) ;
@@ -106,7 +106,7 @@ namespace maze {
106106 // If right edge, carve down
107107 x === xMax ? [ 0 , 1 ] :
108108 // Pick random
109- Math . randomRange ( 0 , 1 ) ? [ 1 , 0 ] : [ 0 , 1 ] ;
109+ rng . randomBool ( ) ? [ 1 , 0 ] : [ 0 , 1 ] ;
110110
111111 if ( cx === 1 ) {
112112 tx += corridorSize ;
@@ -118,7 +118,7 @@ namespace maze {
118118 }
119119 if ( cy === 1 ) {
120120 ty += corridorSize ;
121- tx = Math . randomRange ( start , end ) * ( corridorSize + 1 ) + 1 ;
121+ tx = rng . randomRange ( start , end ) * ( corridorSize + 1 ) + 1 ;
122122 for ( let i = 0 ; i < corridorSize ; ++ i ) {
123123 tmData . setTile ( tx + i , ty , 0 ) ;
124124 tmData . setWall ( tx + i , ty , false ) ;
@@ -130,7 +130,7 @@ namespace maze {
130130 return tmData ;
131131 }
132132
133- function generateEllersTilemap ( mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
133+ function generateEllersTilemap ( rng : Math . FastRandom , mazeWidth : number , mazeHeight : number , wall : Image , floor : Image , corridorSize : number ) : tiles . TileMapData {
134134 // https://weblog.jamisbuck.org/2010/12/29/maze-generation-eller-s-algorithm#
135135 let tmData = createTilemap ( mazeWidth , mazeHeight , corridorSize , [ floor , wall ] ) ;
136136 fillWalls ( tmData ) ;
@@ -144,7 +144,7 @@ namespace maze {
144144 for ( let x = 0 ; x < mazeWidth ; x ++ ) {
145145 let tx = x * ( corridorSize + 1 ) + 1 ;
146146
147- const shouldMergeRight = x < xMax && currentRow [ x ] !== currentRow [ x + 1 ] && ( y == yMax || Math . randomRange ( 0 , 1 ) ) ;
147+ const shouldMergeRight = x < xMax && currentRow [ x ] !== currentRow [ x + 1 ] && ( y == yMax || rng . randomBool ( ) ) ;
148148
149149 if ( shouldMergeRight ) {
150150 const setToAbsorb = currentRow [ x + 1 ] ;
@@ -175,13 +175,13 @@ namespace maze {
175175 for ( const s of Object . keys ( sets ) ) {
176176 let xs = sets [ s ] ;
177177 for ( let i = xs . length - 1 ; i > 0 ; i -- ) {
178- const j = Math . floor ( Math . random ( ) * i ) ;
178+ const j = Math . floor ( rng . randomRange ( 0 , i ) ) ;
179179 const k = xs [ i ] ;
180180 xs [ i ] = xs [ j ] ;
181181 xs [ j ] = k ;
182182 }
183183
184- xs = xs . slice ( 0 , Math . randomRange ( 1 , xs . length ) ) ;
184+ xs = xs . slice ( 0 , rng . randomRange ( 1 , xs . length ) ) ;
185185
186186 for ( const x of xs ) {
187187 let tx = x * ( corridorSize + 1 ) + 1 ;
0 commit comments