public override void generate() { clearTo(AsciiMapSymbols.WALKABLE); // SET IT ALL TO (WALKABLE) TO START int numRooms = Mathf.Max(width / 10, height/10); int maxRoomSize = numRooms - 2; int minRoomSize = 3; maxRoomSize = Mathf.Clamp(maxRoomSize, minRoomSize, maxRoomSize); PseudoLinearLevel psl = new PseudoLinearLevel((uint)width,(uint)height,(uint)numRooms, (uint)minRoomSize,(uint)maxRoomSize, (uint)minRoomSize,(uint)maxRoomSize, 1,1,r,4); //This line isn't really useful but has to be here createStartingDungeonMap(psl); RandomFill(-1, AsciiMapSymbols.WALKABLE, r.getIntInRange(15,25)); OutlineMap(BASELAYER,AsciiMapSymbols.MOUNTAIN); // Outline the map with a blocking or warping tile placeTreasure(r.getIntInRange(1,numRooms/2), 4, psl); // UPDATE THIS TO TAKE ADVANTAGE OF THE PSL INFORMATION placeExitArea(r.getIntInRange(4,6)); //The start is a safe zone. //SET THE COLOR FOR THE ASCII TEXT THING UColor.HSL theMainColor = new UColor.HSL((float)r.getRandom(),0.7f,0.3f); //Choose a main color MainColor = theMainColor.toColor(); md = new AsciiMapSymbols(LevelData.TYPE_CAVE, MainColor); base.generate(); }
private void createStartingCaveMap(PseudoLinearLevel psl) { for(int yy=0; yy < height; yy++) { for(int xx=0; xx < width; xx++) { int placeType = AsciiMapSymbols.WALKABLE; if(psl.bitMap[xx,yy] == 0) { placeType = AsciiMapSymbols.MOUNTAIN; } placeTile(xx,yy, placeType, BASELAYER); }//for }//for }
//Places 3D Tiles void place3DFloorTilesTest(PseudoLinearLevel psl) { //TEMP PLAYER PLACING STUFF. bool placedPlayer = false; for (int z = 0; z < psl.height; z++) { for (int x = 0; x < psl.width; x++) { Transform tileToPlace = null; double _rot = 0.0f; string objname = ""; //0 is dead space, don't do anything for it. if(psl.bitMap[x,z] == 0) { continue; }//if //Store the placement spot (the grid is 5mx5m Vector3 spot = new Vector3(x*-5.0f, -1.0f, z*5.0f); //1 is empty floor if(psl.bitMap[x,z] ==1) { if(!placedPlayer) { Vector3 playerSpot = new Vector3(spot.x-2.5f, spot.y+1.0f, spot.z + 2.5f); player.transform.position = playerSpot; placedPlayer = true; } tileToPlace = floors[r.getIntInRange(0,floors.Length-1)]; // FLOOR SPOT objname += "floor_"; if(r.getBoolean()) // 50% chance of rotating it { if(r.getBoolean()) // 50% it goes clockwise { _rot=Mathf.PI/2; } else { _rot=0-Mathf.PI/2; } } }//if else if(psl.bitMap[x,z] == 2) // U SHAPE { tileToPlace = UShapedWalls[r.getIntInRange(0,UShapedWalls.Length-1)]; } else if(psl.bitMap[x,z] == 3) // U SHAPE { tileToPlace = UShapedWalls[r.getIntInRange(0,UShapedWalls.Length-1)]; _rot=Mathf.PI/2; } else if(psl.bitMap[x,z] == 5) // U SHAPE { tileToPlace = UShapedWalls[r.getIntInRange(0,UShapedWalls.Length-1)]; _rot=Mathf.PI; } else if(psl.bitMap[x,z] == 9) // U SHAPE { tileToPlace = UShapedWalls[r.getIntInRange(0,UShapedWalls.Length-1)]; _rot=0-Mathf.PI/2; } else if(psl.bitMap[x,z] == 6) // EQUAL SIGN HALLWAY { tileToPlace = SmallHalls[r.getIntInRange(0,SmallHalls.Length-1)]; //rot=Mathf.PI; } else if(psl.bitMap[x,z] == 11) //EQUAL SIGN HALLWAY { tileToPlace = SmallHalls[r.getIntInRange(0,SmallHalls.Length-1)]; } else if(psl.bitMap[x,z] == 4) // INNER CORNER { tileToPlace = InnerCorners[r.getIntInRange(0,InnerCorners.Length-1)]; } else if(psl.bitMap[x,z] == 7) // INNER CORNER { tileToPlace = InnerCorners[r.getIntInRange(0,InnerCorners.Length-1)]; _rot= Mathf.PI/2; } else if(psl.bitMap[x,z] == 10) // INNER CORNER { tileToPlace = InnerCorners[r.getIntInRange(0,InnerCorners.Length-1)]; _rot=0-Mathf.PI/2; } else if(psl.bitMap[x,z] == 13) // INNER CORNER { tileToPlace = InnerCorners[r.getIntInRange(0,InnerCorners.Length-1)]; _rot=Mathf.PI; } else if(psl.bitMap[x,z] == 8) // JUST A WALL { tileToPlace = SingleWalls[r.getIntInRange(0,SingleWalls.Length-1)]; _rot=Mathf.PI/2; } else if(psl.bitMap[x,z] == 12) // JUST A WALL { tileToPlace = SingleWalls[r.getIntInRange(0,SingleWalls.Length-1)]; //_rot=0-Mathf.PI; } else if(psl.bitMap[x,z] == 14) // JUST A WALL { tileToPlace = SingleWalls[r.getIntInRange(0,SingleWalls.Length-1)]; _rot=0-Mathf.PI/2; } else if(psl.bitMap[x,z] == 15) // JUST A WALL { tileToPlace = SingleWalls[r.getIntInRange(0,SingleWalls.Length-1)]; _rot=0-Mathf.PI; } else if(psl.bitMap[x,z] == 16) // CORNER WALL { tileToPlace = OuterCornerWalls[r.getIntInRange(0,OuterCornerWalls.Length-1)]; } else if(psl.bitMap[x,z] == 17) // CORNER WALL { tileToPlace = OuterCornerWalls[r.getIntInRange(0,OuterCornerWalls.Length-1)]; _rot=Mathf.PI/2; } else if(psl.bitMap[x,z] == 18) // CORNER WALL { tileToPlace = OuterCornerWalls[r.getIntInRange(0,OuterCornerWalls.Length-1)]; _rot=Mathf.PI; } else if(psl.bitMap[x,z] == 19)// CORNER WALL { tileToPlace = OuterCornerWalls[r.getIntInRange(0,OuterCornerWalls.Length-1)]; _rot=0-Mathf.PI/2; } else if(psl.bitMap[x,z] == 20) // BIG INNER CORNER { tileToPlace = LargeInnerCorners[r.getIntInRange(0,LargeInnerCorners.Length-1)]; } else if(psl.bitMap[x,z] == 21) // BIG INNER CORNER { tileToPlace = LargeInnerCorners[r.getIntInRange(0,LargeInnerCorners.Length-1)]; _rot=Mathf.PI/2; } else if(psl.bitMap[x,z] == 22) // BIG INNER CORNER { tileToPlace = LargeInnerCorners[r.getIntInRange(0,LargeInnerCorners.Length-1)]; _rot=Mathf.PI; } else if(psl.bitMap[x,z] == 23) // BIG INNER CORNER { tileToPlace = LargeInnerCorners[r.getIntInRange(0,LargeInnerCorners.Length-1)]; _rot=0-Mathf.PI/2; } else if(psl.bitMap[x,z] == 24) // ENCLOSED { tileToPlace = EnclosedWalls[r.getIntInRange(1,EnclosedWalls.Length-1)]; } else { //LETS JUST PLACE CUBE WALLS TO START. //tileToPlace = walls[psl.bitMap[x,z]+1]; tileToPlace = EnclosedWalls[0]; spot.y+=2.5f; }//if Transform obj = (Transform)Instantiate(tileToPlace,spot , Quaternion.identity); obj.gameObject.layer = this.gameObject.layer; if(objname == "") objname = "wall_"; obj.name = objname + psl.bitMap[x,z]; //obj.transform.RotateAround(Vector3.up, (float)_rot); obj.transform.rotation = Quaternion.AngleAxis((float)_rot, Vector3.up); }//for }//for }
void Start() { long seed = System.DateTime.Now.Ticks; r = new RandomSeed(seed); player = GameObject.Find("Player"); //tiles = new Transform[1]; PseudoLinearLevel psl = new PseudoLinearLevel((uint)numberOfTilesWide,(uint)numberOfTilesHigh,(uint)numberOfLG_RoomsToSpawn, (uint)minimumLG_RoomWidthInTiles,(uint)maximumLG_RoomWidthInTiles, (uint)minimumLG_RoomHeightInTiles,(uint)maximumLG_RoomHeightInTiles, 1,1,r,4); //This line isn't really useful but has to be here string baseMap = psl.toReadableMap(); print("SEED:" + seed + "\n" +"--CLICK HERE FOR PRINTED ASCII MAP--\n"+ baseMap); place3DFloorTilesTest(psl); placeFurnitureTest(psl); placeEnemyTest(psl); }
void placeFurnitureTest(PseudoLinearLevel psl) { //BASIC LG_Room FURNITURE PLACEMENT (IN THE MIDDLE OF THE LG_Room, RANDOMLY ROTATED foreach( LG_Room theRoom in psl.rooms) { Vector3 spot = new Vector3(theRoom.center.x*-5.0f, -1, theRoom.center.y*5.0f); //LOOP THROUGH AND PLACE FURNITURE NEAR THE CENTER OF EACH ONE WITH RANDOM ROTATIONS AND CRAP Transform tileToPlace = RoomFurniture[r.getIntInRange(0,RoomFurniture.Length-1)]; Transform furniture = (Transform)Instantiate(tileToPlace,spot , Quaternion.identity); furniture.gameObject.layer = this.gameObject.layer; furniture.name = "furniture_" + furniture.name; float _rot = 0.0f; if(r.getBoolean()) // 50% chance of rotating it { if(r.getBoolean()) // 50% it goes clockwise { _rot=Mathf.PI/2; }//if else { _rot=0-Mathf.PI/2; }//else }//if furniture.transform.Rotate(Vector3.up, (float)_rot); }//foreach }
// Enemies can be optional, but print a message void placeEnemyTest(PseudoLinearLevel psl) { //BASIC LG_Room FURNITURE PLACEMENT (IN THE MIDDLE OF THE LG_Room, RANDOMLY ROTATED if(Enemies.Length <=0) { //No enemies specified in dungeon maker. This is just a notification and is not an error. return; } foreach(LG_Room theRoom in psl.rooms) { Vector3 spot = new Vector3((theRoom.center.x+1)*-5.0f, -1, (theRoom.center.y+1)*5.0f); //LOOP THROUGH AND PLACE FURNITURE NEAR THE CENTER OF EACH ONE WITH RANDOM ROTATIONS AND CRAP Transform enemyToPlace = Enemies[Mathf.Min(0,r.getIntInRange(0,Enemies.Length-1))]; Transform enemy = (Transform)Instantiate(enemyToPlace,spot , Quaternion.identity); enemy.gameObject.layer = this.gameObject.layer; enemy.name = "enemy_" + enemy.name; }//foreach }
private void createStartingDungeonMap(PseudoLinearLevel psl) { for(int yy=0; yy < height; yy++) { for(int xx=0; xx < width; xx++) { int tileCode = AsciiMapSymbols.WALKABLE; if(psl.bitMap[xx,yy] == 0) { tileCode = AsciiMapSymbols.MOUNTAIN; } placeTile(xx,yy, tileCode, -1); }//for }//for }
public void placeTreasure(int numberOfTreasures, int iconCode, PseudoLinearLevel psl) { Vector2 endPoint = psl.roomTree.allPoints[psl.numRooms-1]; placeATreasure((int)endPoint.x, (int)endPoint.y, iconCode); numberOfTreasures = Mathf.Clamp(numberOfTreasures,0, psl.numRooms); // make sure it's always valid for(int i=2; i <= numberOfTreasures; i++) { Vector2 spot = psl.roomTree.allPoints[psl.numRooms-i]; placeATreasure((int)spot.x, (int)spot.y, iconCode); }//foreach }