예제 #1
0
        public CaveGenerator(int width, int height, String name, double fillPercentage, int smoothness, Quinoa quinoa)
        {
            header = new RegionHeader(name);
            region = new Region(width, height);
            header.setRegion(region);
            entrance = new RegionExit(width / 2, height / 2, 0, 0, "", ExitDecorator.UP_STAIR);
            exit = new RegionExit(width / 2, (height / 2) + 1, 0, 0, "", ExitDecorator.DOWN_STAIR);
            header.getExits().Add(entrance);
            header.getExits().Add(exit);
            region.setLightingModel(LightingModel.CAVE);
            this.quinoa = quinoa;
            this.fillPercentage = fillPercentage;
            this.smoothness = smoothness;

            chambers = new List<Chamber>();

            //fill with solid rock
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    region.setTerrain(x, y, new Terrain());
                    region.getTerrain(x, y).setCode(TerrainCode.ROCK);
                }
            }
        }
예제 #2
0
        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;
            }
        }