public override void generate(Quinoa quinoa) { //Fill the overworld cell array int owWidth = quinoa.getMap().getOverworldWidth(); int owHeight = quinoa.getMap().getOverworldHeight(); OverworldCell[,] owc = quinoa.getMap().getOverworldCells(); for(int x=0; x < owWidth; x++) { for(int y=0; y < owHeight; y++) { owc[x,y] = new OverworldCell(); } } //choose a random spot to be town, set as cross int townX = owWidth / 2 + ((int)(RandomNumber.RandomDouble() * 3) - 1); int townY = owHeight / 2 + ((int)(RandomNumber.RandomDouble() * 3) - 1); owc[townX,townY].cellType = CellType.MAIN_TOWN; owc[townX,townY].nExit = true; owc[townX,townY].eExit = true; owc[townX,townY].sExit = true; owc[townX,townY].wExit = true; //generate paths recursively this.addPathBranch(townX-1, townY, owWidth, owHeight, owc, 0, 2, 7); this.addPathBranch(townX+1, townY, owWidth, owHeight, owc, 0, 2, 7); this.addPathBranch(townX, townY-1, owWidth, owHeight, owc, 0, 2, 7); this.addPathBranch(townX, townY+1, owWidth, owHeight, owc, 0, 2, 7); //generate regions for each overworld cell for(int x=0; x < owWidth; x++) { for(int y=0; y < owHeight; y++) { if(owc[x,y].cellType == CellType.MAIN_TOWN) { TownGenerator townGen = new TownGenerator(100, 100, "main", 3, 0.75, 0.01, owc[x,y], quinoa); townGen.generate(); owc[x,y].header = townGen.header; townGen.header.storeRegion(true); this.addCaveBranch(townGen.header, 14, 14, 3 + (int)(RandomNumber.RandomDouble() * 3), quinoa); quinoa.getMap().addRegionHeader(owc[x,y].header); } else if(owc[x,y].cellType == CellType.TOWN) { TownGenerator townGen = new TownGenerator(100, 100, "town" + RandomNumber.RandomUUID().ToString(), 3, 0.75, 0.01, owc[x,y], quinoa); townGen.generate(); owc[x,y].header = townGen.header; townGen.header.storeRegion(true); quinoa.getMap().addRegionHeader(owc[x,y].header); } else if(owc[x,y].cellType == CellType.FOREST) { String forestName = "forest" + RandomNumber.RandomUUID().ToString(); int depthCount = 0; int depthTotal = 0; if(owc[x,y].nExit) { depthCount++; depthTotal = depthTotal + owc[x,y-1].depth; } if(owc[x,y].eExit) { depthCount++; depthTotal = depthTotal + owc[x + 1,y].depth; } if(owc[x,y].sExit) { depthCount++; depthTotal = depthTotal + owc[x,y+1].depth; } if(owc[x,y].wExit) { depthCount++; depthTotal = depthTotal + owc[x-1,y].depth; } depthTotal = depthTotal + owc[x,y].depth; depthCount = depthCount + 1; double treeDensity = 0.01 + ((depthTotal / depthCount) * 0.02); if(treeDensity > 0.55) { treeDensity = 0.55; } ForestGenerator forGen = new ForestGenerator(100, 100, forestName, treeDensity, quinoa); double waterDensity = 0.15 + (RandomNumber.RandomDouble() * 0.35); if(waterDensity > 0.65) { waterDensity = 0.65; } forGen.addWater(waterDensity, 4); forGen.generate(owc[x,y].nExit, owc[x,y].eExit, owc[x,y].sExit, owc[x,y].wExit); forGen.addSprings(); forGen.header.setName("Forest"); owc[x,y].header = forGen.header; //add cave branches if only one exit is present int exitCount = 0; if(owc[x,y].nExit) {exitCount++;} if(owc[x,y].eExit) {exitCount++;} if(owc[x,y].sExit) {exitCount++;} if(owc[x,y].wExit) {exitCount++;} if(exitCount == 1 && RandomNumber.RandomDouble() < 0.50) { this.addCaveBranch(owc[x,y].header, owc[x,y].header.getRegion().getWidth() / 2, owc[x,y].header.getRegion().getHeight() / 2, 2 + (int)(RandomNumber.RandomDouble() * (depthTotal / depthCount)), quinoa); } forGen.header.storeRegion(true); quinoa.getMap().addRegionHeader(owc[x,y].header); } } } //connect exits for(int x=0; x < owWidth; x++) { for(int y=0; y < owHeight; y++) { if(owc[x,y].header != null) { if(owc[x,y].nExit && y > 0) { this.connectExits(owc[x,y], owc[x,y-1], Direction.N); } if(owc[x,y].sExit && y < owHeight-1) { this.connectExits(owc[x,y], owc[x,y+1], Direction.S); } if(owc[x,y].eExit && x < owWidth-1) { this.connectExits(owc[x,y], owc[x+1,y], Direction.E); } if(owc[x,y].wExit && x > 0) { this.connectExits(owc[x,y], owc[x-1,y], Direction.W); } } } } //place the brother this.placeBrother(quinoa); this.initializePlayer(quinoa); }
public void placeBrother(Quinoa quinoa) { String caveID = caveBottomIDs[RandomNumber.RandomInteger(caveBottomIDs.Count)]; RegionHeader header = quinoa.getMap().getRegionHeaderByID(caveID); header.recallRegion(); Position pos = new Position(); List<Position> tempPos = MapGenerator.getTerrainPositions(TerrainCode.STONE_FLOOR, header.getRegion(), false); if (tempPos.Count > 0) { pos = tempPos[RandomNumber.RandomInteger(tempPos.Count)]; } Monster monster = new Monster(); monster.monsterCode = MonsterCode.HUMAN; MonsterActionManager.initialize(monster); monster.role = MonsterRole.BROTHER; monster.setPosition(pos.x, pos.y); Item lantern = new Item(); lantern.itemClass = ItemClass.LANTERN; monster.inventory.equipItem(lantern, ItemSlot.BELT_1); header.getRegion().getMonsters().Add(monster); header.storeRegion(true); }
public void addCaveBranch(RegionHeader topLevel, int topX, int topY, int depth, Quinoa quinoa) { CaveGenerator lastGen = null; for(int deep=0; deep < depth; deep++) { int width = 80 + (int)(RandomNumber.RandomDouble() * 40); int height = 80 + (int)(RandomNumber.RandomDouble() * 40); int chamberCount = 3 + (int)(RandomNumber.RandomDouble() * 4); int smoothness = (int)(RandomNumber.RandomDouble() * 2); double fillPercentage = 0.45 + (RandomNumber.RandomDouble() * 0.20); CaveGenerator caveGen = new CaveGenerator(width, height, topLevel.getId() + "-cave" + deep, fillPercentage, smoothness, quinoa); caveGen.addChamber(new Chamber(5,5,caveGen.region.getWidth() - 10,caveGen.region.getHeight() - 10, ChamberType.OPEN)); for(int i=0; i < chamberCount; i++) { int caveX = 5 + (int)(RandomNumber.RandomDouble() * (caveGen.region.getWidth() - 41)); int caveY = 5 + (int)(RandomNumber.RandomDouble() * (caveGen.region.getHeight() - 41)); ChamberType type = ChamberType.NULL; if(RandomNumber.RandomDouble() < 0.20) { type = ChamberType.MUSHROOM; } else { type = ChamberType.FLOODED; } caveGen.addChamber(new Chamber(caveX,caveY,(int)(RandomNumber.RandomDouble() * 20) + 10,(int)(RandomNumber.RandomDouble() * 20) + 10, type)); } caveGen.smoothWater(); caveGen.placeExits(); caveGen.addTorches(); caveGen.addMinerals(deep+1); if(deep == depth - 1) { caveGen.addTreasure(); this.caveBottomIDs.Add(caveGen.header.getId()); } caveGen.header.setName("Cave (level " + (deep + 1) + ")"); caveGen.header.setRegion(caveGen.region); caveGen.header.storeRegion(true); if(deep == 0) { caveGen.getEntrance().setDx(topX); caveGen.getEntrance().setDy(topY+1); caveGen.getEntrance().setDestinationRegionID(topLevel.getId()); topLevel.getExits().Add(new RegionExit(topX,topY,caveGen.getEntrance().getX(),caveGen.getEntrance().getY()+1,caveGen.header.getId(), ExitDecorator.CAVE)); } else { caveGen.getEntrance().setDx(lastGen.exit.getX()); caveGen.getEntrance().setDy(lastGen.exit.getY()+1); caveGen.getEntrance().setDestinationRegionID(lastGen.header.getId()); lastGen.exit.setDx(caveGen.entrance.getX()); lastGen.exit.setDy(caveGen.entrance.getY()+1); lastGen.exit.setDestinationRegionID(caveGen.header.getId()); if(deep == depth-1) { caveGen.header.setName("Cave (bottom level)"); caveGen.header.getExits().Remove(caveGen.exit); } } quinoa.getMap().addRegionHeader(caveGen.header); lastGen = caveGen; } }