Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////
- // //
- // Recursive backtracing maze generation //
- // //
- // Feel free to use and or modify the //
- // script for your own needs //
- // //
- // Only thing I ask is for you to //
- // keep this header here //
- // //
- // Script by: DarkAngel2096 //
- // SteamID: id/DarkAngel2096 //
- // //
- //////////////////////////////////////////////////////////
- main()
- {
- thread mazeGen();
- level.rows = 15;
- level.colums = 15;
- }
- mazeGen()
- {
- activator = getEnt("mazeGenActivate", "targetname");
- mazeWalls = getEntArray("mazeWall", "targetname");
- building = 0;
- while(true)
- {
- activator waittill("trigger", player);
- switch(building)
- {
- case 0:
- {
- building = 1;
- makeMaze();
- wait 1;
- generateRandomMaze();
- wait 1;
- setSpawnAndEnd();
- wait 1;
- doubledPlacement();
- wait 5;
- placeWalls(mazeWalls);
- wait 1;
- break;
- }
- case 1:
- {
- building = 0;
- destroyMaze(mazeWalls);
- break;
- }
- }
- }
- }
- makeMaze()
- {
- level.mazeGrid = [];
- for(i = 0; i < level.rows; i++)
- {
- level.mazeGrid[i] = [];
- for(j = 0; j < level.colums; j++)
- {
- level.mazeGrid[i][j] = cellElement(i, j);
- }
- }
- iPrintLnBold("Grid done.");
- }
- cellElement(i, j)
- {
- wallPlacement[0] = true; //west
- wallPlacement[1] = true; //south
- wallPlacement[2] = true; //east
- wallPlacement[3] = true; //north
- cell = spawnStruct();
- cell.xPlace = i;
- cell.yPlace = j;
- cell.visited = false;
- cell.walls = wallPlacement;
- return cell;
- }
- generateRandomMaze()
- {
- current = level.mazeGrid[0][0];
- current.visited = true;
- path = [];
- path[0] = current;
- while(true)
- {
- unvisitedNearby = unvisitedNeighbours(current.xPlace, current.yPlace);
- if(unvisitedNearby.size)
- {
- nextCell = unvisitedNearby[randomInt(unvisitedNearby.size)];
- removeWalls(current, nextCell);
- nextCell.visited = true;
- path[path.size] = nextCell;
- current = nextCell;
- }
- else if(path.size > 1)
- {
- path[path.size - 1] = undefined;
- current = path[path.size - 1];
- }
- else
- break;
- }
- iPrintLnBold("Generation done.");
- }
- unvisitedNeighbours(xAxis, yAxis)
- {
- array = [];
- if(xAxis > 0 && level.mazeGrid[xAxis - 1][yAxis].visited == false)
- array[array.size] = level.mazeGrid[xAxis - 1][yAxis];
- if(xAxis < level.mazeGrid.size - 1 && level.mazeGrid[xAxis + 1][yAxis].visited == false)
- array[array.size] = level.mazeGrid[xAxis + 1][yAxis];
- if(yAxis > 0 && level.mazeGrid[xAxis][yAxis - 1].visited == false)
- array[array.size] = level.mazeGrid[xAxis][yAxis - 1];
- if(yAxis < level.mazeGrid[0].size - 1 && level.mazeGrid[xAxis][yAxis + 1].visited == false)
- array[array.size] = level.mazeGrid[xAxis][yAxis + 1];
- return array;
- }
- removeWalls(start, end)
- {
- if(end.xPlace - start.xPlace == 1)
- {
- level.mazeGrid[end.xPlace][end.yPlace].walls[0] = false;
- level.mazeGrid[start.xPlace][start.yPlace].walls[2] = false;
- }
- else if(end.xPlace - start.xPlace == -1 )
- {
- level.mazeGrid[end.xPlace][end.yPlace].walls[2] = false;
- level.mazeGrid[start.xPlace][start.yPlace].walls[0] = false;
- }
- else if(end.yPlace - start.yPlace == 1)
- {
- level.mazeGrid[end.xPlace][end.yPlace].walls[1] = false;
- level.mazeGrid[start.xPlace][start.yPlace].walls[3] = false;
- }
- else
- {
- level.mazeGrid[end.xPlace][end.yPlace].walls[3] = false;
- level.mazeGrid[start.xPlace][start.yPlace].walls[1] = false;
- }
- }
- setSpawnAndEnd()
- {
- randomEnd = randomInt(level.mazeGrid.size - 1);
- lastRow = level.mazeGrid[0].size - 1;
- level.mazeGrid[0][0].walls[1] = false;
- level.mazeGrid[randomEnd][lastRow].walls[3] = false;
- iPrintLnBold("Spawn and end made.");
- }
- doubledPlacement()
- {
- for(i = 0; i < level.mazeGrid.size; i++)
- {
- for(j = 0; j < level.mazeGrid[0].size; j++)
- {
- if(j < level.mazeGrid[0].size - 1)
- {
- if(level.mazeGrid[i][j].walls[3] == true && level.mazeGrid[i][j + 1].walls[1] == true)
- {
- level.mazeGrid[i][j + 1].walls[1] = false;
- }
- }
- if(i < level.mazeGrid.size - 1)
- {
- if(level.mazeGrid[i][j].walls[2] == true && level.mazeGrid[i + 1][j].walls[0] == true)
- {
- level.mazeGrid[i + 1][j].walls[0] = false;
- }
- }
- }
- }
- iPrintLnBold("Double walls checked.");
- }
- placeWalls(mazeWalls)
- {
- mazeOrigin = getEnt("mazeOrigin", "targetname");
- yAxisOffset = 0;
- xAxisOffset = 0;
- wallNumber = 0;
- moveTime = 0.05;
- for(i = 0; i < level.mazeGrid.size; i++)
- {
- xAxisOffset = (i * 200) * -1;
- for(j = 0; j < level.mazeGrid[0].size; j++)
- {
- yAxisOffset = j * 200;
- for(k = 0; k < 4; k++)
- {
- if(level.mazeGrid[i][j].walls[k])
- {
- switch(k)
- {
- case 0:
- mazeWalls[wallNumber] moveTo(mazeOrigin.origin + (yAxisOffset + 0, xAxisOffset + 100, 0), moveTime);
- mazeWalls[wallNumber] rotateTo((0, 90, 0), moveTime);
- mazeWalls[wallNumber] waittill("movedone");
- wallNumber++;
- break;
- case 1:
- mazeWalls[wallNumber] moveTo(mazeOrigin.origin + (yAxisOffset - 100, xAxisOffset + 0, 0), moveTime);
- mazeWalls[wallNumber] rotateTo((0, 0, 0), moveTime);
- mazeWalls[wallNumber] waittill("movedone");
- wallNumber++;
- break;
- case 2:
- mazeWalls[wallNumber] moveTo(mazeOrigin.origin + (yAxisOffset + 0, xAxisOffset - 100, 0), moveTime);
- mazeWalls[wallNumber] rotateTo((0, 90, 0), moveTime);
- mazeWalls[wallNumber] waittill("movedone");
- wallNumber++;
- break;
- case 3:
- mazeWalls[wallNumber] moveTo(mazeOrigin.origin + (yAxisOffset + 100, xAxisOffset + 0, 0), moveTime);
- mazeWalls[wallNumber] rotateTo((0, 0, 0), moveTime);
- mazeWalls[wallNumber] waittill("movedone");
- wallNumber++;
- break;
- }
- }
- }
- }
- }
- iPrintLnBold("MAZE DONE!");
- }
- destroyMaze(mazeWalls)
- {
- wallSpawn = getEnt("wallSpawns", "targetname");
- for(i = 0; i < mazeWalls.size; i++)
- {
- mazeWalls[i] moveTo(wallSpawn.origin + (i * 12, 0, 0), 0.05);
- mazeWalls[i] rotateTo((0, 0, 0), 0.05);
- mazeWalls[i] waittill("movedone");
- }
- iPrintLnBold("Destroying complete.");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement