| Random Map Generator | |||||||||||||||||||||
| **BEFORE YOU PUT THIS IN, BE SURE TO PUT NEAR FANTASTICA'S DYNAMIC MAPS SCRIPT IN YOUR GAME!!!** | |||||||||||||||||||||
| Create a new class above 'Main' and call it Random Map Generator, make a new class under that and call it this ----------------------------. now, under that calss make a new one called Game_Map*** and put this in it: | |||||||||||||||||||||
| Ill put the instructions at the end | |||||||||||||||||||||
| =begin
====================== Random Map Generator - version 0.51 ====================== by Wachunga, based on Jamis Buck's D&D dungeon generator ============== Instructions ============== To indicate a map is to be randomly generated, include <rand> in its name. You may also optionally specify custom randomness, sparsity and deadend removal parameters to guide how the map is generated (see comments within for more details). These may also be included in the map name, as in this example: "XYZ <rand><0.8><5><0.8>" (from left to right, randomness, sparsity and deadend removal in that order). Finally, the optional parameter <save> may immediately follow <rand> to indicate that the map should be generated randomly the first time but then saved and remain the same thereafter instead of randomizing again. Events are not erased on the map which will be randomly generated, but there is no way to guarantee they'll be positioned correctly. (The only exceptions to this are two events which determine the start and end of the maze.) Place an event named <start> to specify a location you'd like the player to begin the maze (else a default is chosen). To avoid appearing inside a wall, the start location should not be at any of the four corners of the map nor any tile where x is even or y is odd (exceptions occur along an edge of the map, i.e. when x=0, x=width-1, y=0 or y=height-1). The diagram below may clarify, where discouraged starting points are marked with an X: y\x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 X X X X X X X X X X X 1 X X X X X X X X X X X X X X X X X X X X 2 X X X X X X X X X 3 X X X X X X X X X X X X X X X X X X X X 4 X X X X X X X X X 5 X X X X X X X X X X X X X X X X X X X X 6 X X X X X X X X X 7 X X X X X X X X X X X X X X X X X X X X 8 X X X X X X X X X 9 X X X X X X X X X X X X X X X X X X X X 10 X X X X X X X X X 11 X X X X X X X X X X X X X X X X X X X X 12 X X X X X X X X X 13 X X X X X X X X X X X X X X X X X X X X 14 X X X X X X X X X X X (These restrictions are unfortunate, but necessary. Note as well that if you're not using a wall face then y SHOULD BE even. Either way, you should get a warning message if you've placed a start/end incorrectly.) If you want there to be a passage leading off the map, the start location must be placed on an edge (i.e. x=0, y=0, x=width-1 or y=height-1). Alternatively, the start and/or exit locations can be somewhere in the interior of the map... in this case the player arrives/exits by magic, falling, climbing, etc. All the above also applies for the exit location, except the event is named <end>. Again, a default end is chosen if one is not supplied. Of course, if the player is to be able to exit the map from either of these two points, you must make the event teleport appropriately. Also, the teleport into the maze should point at same square as the <start> event, or else you may get stuck in a wall. You can specify which tiles to use for the floor, walls, etc in the Maze class (just add an appropriate 'elsif'). Questions and feedback should be directed to the thread in the "User-Submitted RGSS Scripts" forum at http://www.rmxp.net/forums =end $save_map_list = [] class Game_Map alias old_setup_map setup_map def setup_map(map_id) old_setup_map(map_id) tags = map_name.delete(' ').scan(/<[A-Za-z0-9_.]+>/) # get all the tags if not tags.empty? and tags[0].upcase == '<RAND>' tags.shift # remove the first element if not tags.empty? and tags[0].upcase == '<SAVE>' $save_map_list.push(@map_id) tags.shift end if not tags.empty? for i in 0...tags.length tags[i] = tags[i].delete("<>").to_f end end startX = 0; startY = 2 # default starting position endX = @map.width-1; endY = @map.height-1 # default ending position # note that these defaults haven't yet been tested much for i in @map.events.keys if @map.events[i].name.upcase == '<START>' startX = @map.events[i].x startY = @map.events[i].y elsif @map.events[i].name.upcase == '<END>' endX = @map.events[i].x endY = @map.events[i].y end end # note that *tags will expand the array, passing individual elements # (if any) as arguments (randomness, sparsity and chance to remove deadends) # e.g. if map name includes "<rand><0.5><10><0.6>", then the call is: # maze = Maze.new( @map.width, @map.height, startX, startY, endX, endY, 0.5, 10, 0.6) maze = Maze.new( @map.tileset_id, @map.width, @map.height, startX, startY, endX, endY, *tags) # set these up for teleports into the maze maze.draw end end def data=(newdata) @map.data = newdata end def map_name return load_data("Data/MapInfos.rxdata")[@map_id].name end end |
|||||||||||||||||||||
| Now, under that class make a new one called 'Maze' and put this into it: | |||||||||||||||||||||
| class Maze
WALL = 0 PASSAGE = 1 attr_reader :width attr_reader :height attr_reader :startX attr_reader :startY attr_reader :endX attr_reader :endY def initialize(pTileset, pWidth, pHeight, pStartX, pStartY, pEndX, pEndY, pRandomness=0.5, pSparsity=3, pRemovalChance=0.5) @tileset = pTileset @width = pWidth @height = pHeight @startX = pStartX @startY = pStartY @endX = pEndX @endY = pEndY # prepare the base matrix @base = Direction_Matrix.new(@width, @height, @startX, @startY, @endX, @endY, pRandomness, pSparsity, pRemovalChance) # reset everything in the Tile module to 0 Tile.floor = 0 Tile.wall = 0 Tile.wallFace = 0 # prepare the tiles depending on the tileset if @tileset == 27 Tile.setFloor(2,1) # 384 Tile.setWall(1,2) # 48-95 Tile.setWallFace(4,2) # 401 elsif @tileset == 51 Tile.setFloor(2,2) # 384 Tile.setWall(2,1) # 385 #elsif @tileset == 'y' # others go here else # nothing specified so just use default Tile.setFloor(2,1) # 384 Tile.setWall(1,2) # 48-95 end # if no wall face is being used, then Y locations should be ODD (opposite of # when using a wall face) if (@startX % 2) == 0 and @startX != 0 and @startX != @width-1 print 'Warning: player may start in a wall (starting X location is even).' end if Tile.wallFace != 0 if (@startY % 2) != 0 and @startY != 0 and @startY != @height-1 print 'Warning: player may start in a wall (starting Y location is odd).' end else if (@startY % 2) == 0 and @startY != 0 and @startY != @height-1 print 'Warning: player may start in a wall (starting Y location is even).' end end if (@endX % 2) == 0 and @endX != 0 and @endX != @width-1 print 'Warning: maze end may be unreachable (X location is even).' end if Tile.wallFace != 0 if (@endY % 2) != 0 and @endY != 0 and @endY != @height-1 print 'Warning: maze end may be unreachable (Y location is odd).' end else if (@endY % 2) == 0 and @endY != 0 and @endY != @height-1 print 'Warning: maze end may be unreachable (Y location is even).' end end # initialized with all walls @matrix = Array.new(@width, WALL) for i in 0...@width @matrix[i] = Array.new(@height, WALL) end setup end =begin Sets up the actual maze from a base matrix of only directions. (Basic algorithm from Jamis Buck's D&D dungeon generator.) =end def setup for x in [email protected] for y in [email protected] dir = @base.matrix[x][y] if (dir != 0) # not sparsified @matrix[x*2+1][y*2+1] = PASSAGE end if ((dir & Direction_Matrix::NORTH) != 0) @matrix[x*2+1][y*2] = PASSAGE end if ((dir & Direction_Matrix::WEST) != 0) @matrix[x*2][y*2+1] = PASSAGE end # only necessary for right edge start/exit if ((dir & Direction_Matrix::EAST) != 0) @matrix[x*2+2][y*2+1] = PASSAGE # if extra wall is there, need to "dig deeper" if (@width % 2) == 0 and x*2+3 == @width-1 @matrix[x*2+3][y*2+1] = PASSAGE end end # only necessary for bottom edge start/exit if ((dir & Direction_Matrix::SOUTH) != 0) @matrix[x*2+1][y*2+2] = PASSAGE # if extra wall is there, need to "dig deeper" if (@height % 2) == 0 and y*2+3 == @height-1 @matrix[x*2+1][y*2+3] = PASSAGE end end end end end =begin Display the matrix in an ASCII table (useful for debugging). (Much more readable if you're using a monospaced font for dialog boxes.) =end def display char_array = Array.new(@width, 0) for i in 0...@width char_array[i] = Array.new(@height, 0) end for x in 0...@width for y in 0...@height tile = @matrix[x][y] char = ' ' if ((tile == WALL)) then char << '#' end if ((tile == PASSAGE)) then char << ' ' end char_array[y][x] = char end end display = '' for i in 0...@height display << char_array[i].flatten.to_s << "\n" end print display end =begin Draw the maze using the map's tileset. =end def draw newdata = Table.new(@width, @height, 3) # put down the floor on the first layer (z=0) z = 0 for x in 0...@width for y in 0...@height newdata[x,y,z] = Tile.floor end end # now for the walls on the second layer (z=1) z = 1 if Tile.wall.type.to_s.upcase != "HASH" # not autotiles for x in 0...@width for y in 0...@height newdata[x,y,z] = Tile.wall if (@matrix[x][y] == WALL) end end else # autotiles... for x in 0...@width for y in 0...@height # skip passages if (@matrix[x][y] == PASSAGE) then next end # calculate adjacent walls adj = '' if (x == 0) adj << '147' else if (y == 0) then adj << '1' else if (@matrix[x-1][y-1] == WALL) then adj << '1' end end if (@matrix[x-1][y] == WALL) then adj << '4' end if (y == @height-1) then adj << '7' else if (@matrix[x-1][y+1] == WALL) then adj << '7' end end end if (x == @width-1) adj << '369' else if (y == 0) then adj << '3' else if (@matrix[x+1][y-1] == WALL) then adj << '3' end end if (@matrix[x+1][y] == WALL) then adj << '6' end if (y == @height-1) then adj << '9' else if (@matrix[x+1][y+1] == WALL) then adj << '9' end end end if (y == 0) adj << '2' else if (@matrix[x][y-1] == WALL) then adj << '2' end end if (y == @height-1) adj << '8' else if (@matrix[x][y+1] == WALL) then adj << '8' end end # if no adjacent walls, set it as 0 if (adj == '') then adj = '0' end # convert to an array, sort, and then back to a string adj = adj.split(//).sort.join newdata[x,y,z] = eval 'Tile.wall[adj.to_i]' # show single wall tile beneath bottom-facing walls if Tile.wallFace > 0 if not adj.include?('8') newdata[x,y+1,z] = Tile.wallFace end end end # for end # for end # if-else $game_map.data = newdata end # draw method end |
|||||||||||||||||||||
| Under this class make another new one called 'Direction Matrix' and put this into it: | |||||||||||||||||||||
| =begin
A matrix whose elements each contains 1-4 directions (north, east, south, west) forming the basis for a maze or dungeon. (Basic algorithms from Jamis Buck's D&D dungeon generator.) =end class Direction_Matrix NORTH = 0b00001 EAST = 0b00010 SOUTH = 0b00100 WEST = 0b01000 ALL_DIRS = NORTH | EAST | SOUTH | WEST FLAG = 0b10000 attr_reader :width attr_reader :height attr_reader :matrix def initialize(pWidth, pHeight, pStartX, pStartY, pEndX, pEndY, pRandomness, pSparsity, pRemovalChance) @width = pWidth/2 @height = pHeight/2 # convert to Direction_Matrix's dimensions @startX = pStartX/2 @startY = pStartY/2 @endX = pEndX/2 @endY = pEndY/2 # if even, decrement by 1 @width -= 1 if (pWidth % 2 == 0) @height -= 1 if (pHeight % 2 == 0) if @startX != 0 @startX -= 1 if (pStartX % 2 == 0) end if @startY != 0 @startY -= 1 if (pStartY % 2 == 0) end if @endX != 0 @endX -= 1 if (pEndX % 2 == 0) end if @endY != 0 @endY -= 1 if (pEndY % 2 == 0) end # handle a weird situation if @startX >= @width then @startX = @width-1 end if @endX >= @width then @endX = @width-1 end @randomness = pRandomness @sparsity = pSparsity @removalChance = pRemovalChance @matrix = Array.new(@width, 0) for i in 0...@width @matrix[i] = Array.new(@height, 0) end generate # we need the original start/end locations and width/height in these cases if pStartY == 0 @matrix[@startX][@startY] |= NORTH elsif pStartX == 0 @matrix[@startX][@startY] |= WEST elsif (pStartX == @width*2+1 and (pWidth % 2) == 0) or (pStartX == @width*2 and (pWidth % 2) != 0) @matrix[@startX][@startY] |= EAST elsif (pStartY == @height*2+1 and (pHeight % 2) == 0) or (pStartY == @height*2 and (pHeight % 2) != 0) @matrix[@startX][@startY] |= SOUTH end if pEndY == 0 @matrix[@endX][@endY] |= NORTH elsif pEndX == 0 @matrix[@endX][@endY] |= WEST elsif (pEndX == @width*2+1 and (pWidth % 2) == 0) or (pEndX == @width*2 and (pWidth % 2) != 0) @matrix[@endX][@endY] |= EAST elsif (pEndY == @height*2+1 and (pHeight % 2) == 0) or (pEndY == @height*2 and (pHeight % 2) != 0) @matrix[@endX][@endY] |= SOUTH end sparsify removeDeadends end =begin The algorithm for generating random mazes is as follows: (1) randomly pick a starting tile from the map (2) pick a random direction and move that way as long as there is a new tile in that direction and hasn't been visited yet (3) perform (2) until there is no valid direction to move in, then pick a new tile that HAS been visited before and perform (2) and (3) until all the tiles have been visited =end def generate testedDirs = lastDir = straightStretch = 0 x = @startX y = @startY remaining = @width * @height - 1 # loop for all remaining tiles while (remaining > 0) if (testedDirs == ALL_DIRS) # we're stuck so choose an already-visited tile while true x = rand(@width) y = rand(@height) break if @matrix[x][y] != 0 end testedDirs = @matrix[x][y] end # eliminate impossible directions if (x < 1) then testedDirs |= WEST elsif (x+1 > @width) then testedDirs |= EAST end if (y < 1) then testedDirs |= NORTH elsif (y+1 > @height) then testedDirs |= SOUTH end randomSelection = false # depending on randomness parameter of map, # either select direction randomly or continue straight # (but no stretch can be longer than half the width/height) if ( rand < @randomness) randomSelection = true else case lastDir when NORTH if ( y>0 and straightStretch < @height/2 and @matrix[x][y-1]==0 ) direction = lastDir else randomSelection = true end when EAST if ( x+1<@width and straightStretch < @width/2 and @matrix[x+1][y]==0 ) direction = lastDir else randomSelection = true end when SOUTH if ( y+1<@height and straightStretch < @height/2 and @matrix[x][y+1]==0 ) direction = lastDir else randomSelection = true end when WEST if ( x>0 and straightStretch < @width/2 and @matrix[x-1][y]==0 ) direction = lastDir else randomSelection = true end else randomSelection = true end end if (randomSelection) # reset direction = 0 straightStretch = 0 # pick random direction # keep trying until a valid one is found while ( (direction == 0) or ((testedDirs & direction) != 0) ) temp_x = x temp_y = y case rand(4) when 0 # north if (y > 0) then direction = NORTH; temp_y-=1 else testedDirs |= NORTH end when 1 # east if (x+1 < @width) then direction = EAST; temp_x+=1 else testedDirs |= EAST end when 2 # south if (y+1 < @height) then direction = SOUTH; temp_y+=1 else testedDirs |= SOUTH end when 3 # west if (x > 0) then direction = WEST; temp_x-=1 else testedDirs |= WEST end end # check next square to ensure it's valid if ( @matrix[temp_x][temp_y] != 0 ) # record direction as tested testedDirs |= direction # if all directions are invalid, impossible to # select random direction so break out if (testedDirs == ALL_DIRS) then break end direction = 0 end end else straightStretch+=1 end # if all directions are tested, move on to next # iteration where an already-visited tile will be picked if (testedDirs == ALL_DIRS) then next end lastDir = direction # set selected direction in maze at both current tile # and destination tile @matrix[x][y] |= direction case direction when NORTH then y-=1; direction = SOUTH when EAST then x+=1; direction = WEST when SOUTH then y+=1; direction = NORTH when WEST then x-=1; direction = EAST end @matrix[x][y] |= direction testedDirs = @matrix[x][y] remaining-=1 end end =begin Sparsify the maze by the given amount ("sparsity") representing the number of times to sparsify (i.e. shorten deadends, creating empty areas so the maze isn't perfectly dense). A smaller maze will sparsify faster than a larger maze, so the smaller the maze, the smaller the number should be to accomplish the same relative amount of "sparsification". =end def sparsify for i in 0...@sparsity for x in 0...@width for y in 0...@height # don't sparsify from the beginning or end points -- # this guarantees a solution to the maze if (x == @startX) and (y == @startY) then next end if (x == @endX) and (y == @endY) then next end dir = @matrix[x][y] # if only one direction, found a deadend # so otherwise, go to next tile if not [NORTH, EAST, SOUTH, WEST].include?(dir) next end # remove deadend @matrix[x][y] = 0 # for previous tile, remove direction to removed deadend # also temporarily flag it as visited so any new deadends # created aren't sparsified in the same pass case dir when NORTH @matrix[x][y-1] &= ~SOUTH @matrix[x][y-1] |= FLAG when EAST @matrix[x+1][y] &= ~WEST @matrix[x+1][y] |= FLAG when SOUTH @matrix[x][y+1] &= ~NORTH @matrix[x][y+1] |= FLAG when WEST @matrix[x-1][y] &= ~EAST @matrix[x-1][y] |= FLAG end end end # clear the flags for the next sparsifying pass for x in 0...@width for y in 0...@height @matrix[x][y] &= ~FLAG end end end end =begin Display the matrix in an ASCII table (useful for debugging) (Much more readable if you're using a monospaced font for dialog boxes.) =end def display char_array = Array.new(@width, 0) for i in 0...@width char_array[i] = Array.new(@height, 0) end for x in 0...@width for y in 0...@height dir = @matrix[x][y] char = '[' if ((dir & NORTH) != 0) then char << 'N' else char << ' ' end if ((dir & EAST) != 0) then char << 'E' else char << ' ' end if ((dir & WEST) != 0) then char << 'W' else char << ' ' end if ((dir & SOUTH) != 0) then char << 'S' else char << ' ' end char << ']' char_array[y][x] = char end end display = '' for i in 0...@height display << char_array[i].flatten.to_s << "\n" end print display end =begin Clears the given percentage ("removalChance") of deadends from the maze by causing the deadends to extend until they hit another passage. As this causes cycles in the maze, it can result in multiple possible solutions to the maze (but makes it seem more natural). =end def removeDeadends for x in 0...@width for y in 0...@height dir = @matrix[x][y] # if only one direction, found a deadend # so otherwise, go to next tile if not [NORTH, EAST, SOUTH, WEST].include?(dir) next end # random roll to see if this deadend is skipped if (rand > @removalChance) then next end cur_x = x; cur_y = y back_dir = dir # continue as long as new corridor not reached while (@matrix[cur_x][cur_y] == back_dir) direction = 0 testedDirs = 0 # pick random direction # keep trying until a valid one is found while (direction == 0) temp_x = cur_x temp_y = cur_y case rand(4) when 0 # north if (cur_y > 0) then direction = NORTH; back_dir = SOUTH; temp_y-=1 else testedDirs |= NORTH end when 1 # east if (cur_x+1 < @width) then direction = EAST; back_dir = WEST; temp_x+=1 else testedDirs |= EAST end when 2 # south if (cur_y+1 < @height) then direction = SOUTH; back_dir = NORTH; temp_y+=1 else testedDirs |= SOUTH end when 3 # west if (cur_x > 0) then direction = WEST; back_dir = EAST; temp_x-=1 else testedDirs |= WEST end end # check if deadend tile already goes this way if ( @matrix[cur_x][cur_y] == direction ) # record direction as tested testedDirs |= direction direction = 0 end # if all directions are invalid, impossible to # select random direction so break out if (testedDirs == ALL_DIRS) then break end end if (testedDirs == ALL_DIRS) then break end # add new direction to deadend @matrix[cur_x][cur_y] |= direction # add new direction to tile adjacent to deadend @matrix[temp_x][temp_y] |= back_dir # move on to next tile cur_x = temp_x; cur_y = temp_y end end end end end |
|||||||||||||||||||||
| Now, under this class put one more called 'Tile' and then put this script into that: | |||||||||||||||||||||
| module Tile
@floor = 0 @wallFace = 0 @wall = 0 # to be extended with others to make maps "pretty", e.g. random ground features =begin The following array lists systematic keys which are based on adjacent walls (where 'W' is the wall itself): 1 2 3 4 W 6 7 8 9 e.g. 268 is the key that will be used to refer to the autotile which has adjacent walls north, east, and south. For the Castle Prison tileset (autotile #1), this is 67. (It's a bit unwieldy, but it works.) =end Autotile_Keys = [ 12346789, 2346789, 1246789, 246789, 1234678, 234678, 124678, 24678, 1234689, 234689, 124689, 24689, 123468, 23468, 12468, 2468, 23689, 2689, 2368, 268, 46789, 4678, 4689, 468, 12478, 1248, 2478, 248, 12346, 2346, 1246, 246, 28, 46, 689, 68, 478, 48, 124, 24, 236, 26, 8, 6, 2, 4, 0 ] # many autotiles handle multiple situations # this hash keeps track of which keys are identical # to ones already defined above Duplicate_Keys = { 123689 => 23689, 236789 => 23689, 1236789 => 23689, 34689 => 4689, 14689 => 4689, 134689 => 4689, 14678 => 4678, 34678 => 4678, 134678 => 4678, 146789 => 46789, 346789 => 46789, 1346789 => 46789, 23467 => 2346, 23469 => 2346, 234679 => 2346, 123467 => 12346, 123469 => 12346, 1234679 => 12346, 12467 => 1246, 12469 => 1246, 124679 => 1246, 124789 => 12478, 123478 => 12478, 1234789 => 12478, 146 => 46, 346 => 46, 467 => 46, 469 => 46, 1346 => 46, 1467 => 46, 1469 => 46, 3467 => 46, 3469 => 46, 4679 => 46, 13467 => 46, 13469 => 46, 14679 => 46, 34679 => 46, 134679 => 46, 128 => 28, 238 => 28, 278 => 28, 289 => 28, 1238 => 28, 1278 => 28, 1289 => 28, 2378 => 28, 2389 => 28, 2789 => 28, 12378 => 28, 12389 => 28, 12789 => 28, 23789 => 28, 123789 => 28, 1247 => 124, 2369 => 236, 147 => 4, 247 => 24, 14 => 4, 47 => 4, 1478 => 478, 3478 => 478, 4789 => 478, 134789 => 478, 14789 => 478, 13478 => 478, 34789 => 478, 1234 => 124, 1247 => 124, 1249 => 124, 12347 => 124, 12349 => 124, 12479 => 124, 123479 => 124, 1236 => 236, 2367 => 236, 2369 => 236, 12367 => 236, 12369 => 236, 23679 => 236, 123679 => 236, 12368 => 2368, 23678 => 2368, 123678 => 2368, 12348 => 1248, 12489 => 1248, 123489 => 1248, 1689 => 689, 3689 => 689, 6789 => 689, 13689 => 689, 16789 => 689, 36789 => 689, 136789 => 689, 12689 => 2689, 26789 => 2689, 126789 => 2689, 23478 => 2478, 24789 => 2478, 234789 => 2478 } def Tile.setFloor(row, col) if row > 1 @floor = Tile.index(row, col) else # autotiles @floor = Hash.new(0) j = Tile.index(row, col) for i in Autotile_Keys @floor[i] = j j += 1 end # add duplicates for i in Duplicate_Keys.keys @floor[i] = @floor[Duplicate_Keys[i]] end end end def Tile.floor @floor end def Tile.floor=(value) @floor = value end def Tile.wall=(value) @wall = value end def Tile.wallFace=(value) @wallFace = value end def Tile.setWallFace(row, col) if row > 1 @wallFace = Tile.index(row, col) else # autotiles @wallFace = Hash.new(0) j = Tile.index(row, col) for i in Autotile_Keys @wallFace[i] = j j += 1 end # add duplicates for i in Duplicate_Keys.keys @wallFace[i] = @wallFace[Duplicate_Keys[i]] end end end def Tile.wallFace @wallFace end def Tile.setWall(row, col) if row > 1 @wall = Tile.index(row, col) else # autotiles @wall = Hash.new(0) j = Tile.index(row, col) for i in Autotile_Keys @wall[i] = j j += 1 end # add duplicates for i in Duplicate_Keys.keys @wall[i] = @wall[Duplicate_Keys[i]] end end end def Tile.wall @wall end =begin This method returns the index of a specific tile in the tileset, or the base index for one of the 7 autotiles. Parameters: row - row where the tile is found within the tileset ( 1+ ) col - column where the tile is found within the tileset ( 1-8 ) Note: this method is NOT zero-indexed, i.e. rows and columns start at 1 e.g. index(1,2) returns 48 index(2,1) returns 384 index(4,8) returns 407 By the way, here's an example of how autotile indexes work... Autotile in column 2: row\col| 1 2 3 4 5 6 7 8 --------------------------- 1 | 48 49 50 51 52 53 54 55 2 | 56 57 58 59 60 61 62 63 3 | 64 65 66 67 68 69 70 71 4 | 72 73 74 75 76 77 78 79 5 | 80 81 82 83 84 85 86 87 6 | 88 89 90 91 92 93 94 95 The function to return the index of a single tile within an autotile (given by at_index) is (at_index-1)*48 + col-1 + (row-1)*8 (where row, col, and at_index are again NOT zero-indexed) =end def Tile.index(row, col) if row > 1 # if not autotiles return 383 + col + 8*(row-2) else return (col-1)*48 end end end |
|||||||||||||||||||||
| One more thing, place a last class under this one called ------------------------------, for orginization purposes. | |||||||||||||||||||||
| Now, instructions, in order to use this you must place <rand> in the map name, just like in the fog of war script. but there are other things as well. first of all these maps can be saved by putting <save> in the name before <rand>. Now, if you want to control the randomness of the maze (this only does mazes for now, but Wachunga is now working on a full map generator) you have 3 options. the first <#> after <rand> controls the chances of curves and twists. the second <#> after <rand> decreases the number of dead ends. And the last <#> after <rand> increases the chance that dead ends will connect to another pathway. Each time you enter or exit a map that doesnt have <save> in it, it will change, so keep that in mind, also, you must place <start> in an event (i put it in the teleport) name where the begging of the maze is, carful thuogh, the entrance and exits have to be in certain areas, otherwise your going to get a warning message when you try to enter it. Same thing with the exit, put <end> in an event name where you want the end to be at (again, i would put it in the teleport). |
|||||||||||||||||||||