コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
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;
            }
        }