Exemplo n.º 1
0
    public void spawnTrees(Fairway fairway)
    {
        for (int i = 0; i < treeOptions.numberOfTrees; i++)
        {
            var pos = MathfEx.RandomPointOnTerrain(terrain);

            if (fairway.isPointInsideOuterHull(pos))
            {
                continue;
            }

            var randPrefab = treeOptions.randomTreePrefab;

            Quaternion rot = Quaternion.identity * Quaternion.Euler(0, Random.value * 360, 0);

            var obj = GameObject.Instantiate(randPrefab, pos, rot);

            obj.transform.localScale = Vector3.one * (1f + Random.Range(-treeOptions.treeScaleVariance, treeOptions.treeScaleVariance));
        }
    }
Exemplo n.º 2
0
    /// <summary>
    /// Generates a random golf course
    /// </summary>
    private void GenerateCourse()
    {
        //Save the seed
        RNGStateManager.Push(seed);

        //Generate a new fairway
        fairway = new Fairway(transform, fairwayOptions);

        //Generate sandtraps
        this.GenerateSandtraps();

        //Generate the terrain
        terrainGenerator = new TerrainGenerator(terrain, splatOptions, treeOptions);
        terrainGenerator.setMaps(sandtraps, fairway, terrain);

        //Move the flag up a bit
        fairway.flagObject.transform.Translate(Vector3.up * sandtrapOptions.sinkDepth * terrain.terrainData.size.y);

        //Now spawn the trees
        terrainGenerator.spawnTrees(fairway);

        //Return it
        RNGStateManager.Pop();
    }
Exemplo n.º 3
0
        public void GenerateMap()
        {
            map          = new Map();
            map.mapSizeX = 13;
            map.mapSizeY = 10;
            map.fields   = new SortedDictionary <int, SortedDictionary <int, Field> >();

            // First row only water.
            int y = 0;
            SortedDictionary <int, Field> row = new SortedDictionary <int, Field>();

            for (int x = 0; x <= 12; x++)
            {
                row[x] = new Water(x, y);
            }
            map.fields[y] = row;


            // Second row ship track fairway. Track goes from right to left.
            y   = 1;
            row = new SortedDictionary <int, Field>();
            // First fairway (left side) doesn't have a next track.
            row[0] = new Fairway(0, y, null);
            for (int x = 1; x <= 12; x++)
            {
                row[x] = new Fairway(x, y, (Fairway)row[x - 1]);
            }
            map.fields[y] = row;


            // 12 train rails going left.
            y   = 2;
            row = new SortedDictionary <int, Field>();
            // First train rail (left side) doesn't have a next track.
            row[0] = new TrainRails(0, y, null, TrainRails.Axis.HORIZONTAL);
            for (int x = 1; x <= 11; x++)
            {
                // Ninth is the dock.
                if (x == 9)
                {
                    row[x] = new Dock(x, y, (TrainRails)row[x - 1], TrainRails.Axis.HORIZONTAL);
                }
                else
                {
                    row[x] = new TrainRails(x, y, (TrainRails)row[x - 1], TrainRails.Axis.HORIZONTAL);
                }
            }
            map.fields[y] = row;


            // Next row is only one track downwards.
            y             = 3;
            row           = new SortedDictionary <int, Field>();
            row[11]       = new TrainRails(11, y, (TrainRails)map.fields[y - 1][11], TrainRails.Axis.VERTICAL);
            map.fields[y] = row;


            // Rows 4, 5, 6, 7 and 8 are a bit weird because of switches. Going to have to work a bit different now...
            for (y = 4; y <= 9; y++)
            {
                map.fields[y] = new SortedDictionary <int, Field>();
            }

            map.fields[4][11] = new TrainRails(11, 4, (TrainRails)map.fields[3][11], TrainRails.Axis.VERTICAL);
            map.fields[5][11] = new TrainRails(11, 5, (TrainRails)map.fields[4][11], TrainRails.Axis.HORIZONTAL);
            map.fields[5][10] = new TrainRails(10, 5, (TrainRails)map.fields[5][11], TrainRails.Axis.HORIZONTAL);
            TrainRails upperRails  = new TrainRails(9, 4, null, TrainRails.Axis.HORIZONTAL);
            TrainRails lowerRails  = new TrainRails(9, 6, null, TrainRails.Axis.HORIZONTAL);
            Switch     trainSwitch = new Switch(9, 5, (TrainRails)map.fields[5][10], Switch.Direction.LEFT, upperRails, lowerRails);

            upperRails.nextTrack = trainSwitch;
            lowerRails.nextTrack = trainSwitch;
            map.fields[4][9]     = upperRails;
            map.fields[6][9]     = lowerRails;
            map.fields[5][9]     = trainSwitch;

            map.fields[4][8] = new TrainRails(8, 4, (TrainRails)map.fields[4][9], TrainRails.Axis.HORIZONTAL);
            map.fields[4][7] = new TrainRails(7, 4, (TrainRails)map.fields[4][8], TrainRails.Axis.HORIZONTAL);
            map.fields[4][6] = new TrainRails(6, 4, (TrainRails)map.fields[4][7], TrainRails.Axis.HORIZONTAL);

            upperRails  = new TrainRails(5, 4, (TrainRails)map.fields[4][6], TrainRails.Axis.HORIZONTAL);
            lowerRails  = new TrainRails(5, 6, null, TrainRails.Axis.HORIZONTAL);
            trainSwitch = new Switch(5, 5, null, Switch.Direction.RIGHT, upperRails, lowerRails);

            map.fields[4][5] = upperRails;
            map.fields[6][5] = lowerRails;
            map.fields[5][5] = trainSwitch;

            map.fields[5][4] = new TrainRails(4, 5, trainSwitch, TrainRails.Axis.HORIZONTAL);

            upperRails           = new TrainRails(3, 4, null, TrainRails.Axis.HORIZONTAL);
            lowerRails           = new TrainRails(3, 6, null, TrainRails.Axis.HORIZONTAL);
            trainSwitch          = new Switch(3, 5, (TrainRails)map.fields[5][4], Switch.Direction.LEFT, upperRails, lowerRails);
            upperRails.nextTrack = trainSwitch;
            lowerRails.nextTrack = trainSwitch;
            map.fields[4][3]     = upperRails;
            map.fields[6][3]     = lowerRails;
            map.fields[5][3]     = trainSwitch;

            map.fields[4][2] = new TrainRails(2, 4, upperRails, TrainRails.Axis.HORIZONTAL);
            map.fields[4][1] = new TrainRails(1, 4, (TrainRails)map.fields[4][2], TrainRails.Axis.HORIZONTAL);
            map.fields[4][0] = new Warehouse(0, 4, 'A');

            map.fields[6][2] = new TrainRails(2, 6, lowerRails, TrainRails.Axis.HORIZONTAL);
            map.fields[6][1] = new TrainRails(1, 6, (TrainRails)map.fields[4][2], TrainRails.Axis.HORIZONTAL);
            map.fields[6][0] = new Warehouse(0, 6, 'B');

            upperRails       = new TrainRails(8, 6, (TrainRails)map.fields[6][9], TrainRails.Axis.HORIZONTAL);
            lowerRails       = new TrainRails(8, 8, null, TrainRails.Axis.HORIZONTAL);
            trainSwitch      = new Switch(8, 7, null, Switch.Direction.RIGHT, upperRails, lowerRails);
            map.fields[6][8] = upperRails;
            map.fields[8][8] = lowerRails;
            map.fields[7][8] = trainSwitch;

            map.fields[7][7] = new TrainRails(7, 7, trainSwitch, TrainRails.Axis.HORIZONTAL);

            upperRails           = new TrainRails(6, 6, null, TrainRails.Axis.HORIZONTAL);
            lowerRails           = new TrainRails(6, 8, null, TrainRails.Axis.HORIZONTAL);
            trainSwitch          = new Switch(6, 7, (TrainRails)map.fields[7][7], Switch.Direction.LEFT, upperRails, lowerRails);
            upperRails.nextTrack = trainSwitch;
            lowerRails.nextTrack = trainSwitch;
            map.fields[6][6]     = upperRails;
            map.fields[8][6]     = lowerRails;
            map.fields[7][6]     = trainSwitch;

            TrainRails rails = (TrainRails)map.fields[6][5];

            rails.nextTrack = upperRails;

            map.fields[8][5] = new TrainRails(5, 8, lowerRails, TrainRails.Axis.HORIZONTAL);
            map.fields[8][4] = new TrainRails(4, 8, (TrainRails)map.fields[8][5], TrainRails.Axis.HORIZONTAL);
            map.fields[8][3] = new TrainRails(3, 8, (TrainRails)map.fields[8][4], TrainRails.Axis.HORIZONTAL);
            map.fields[8][2] = new TrainRails(2, 8, (TrainRails)map.fields[8][3], TrainRails.Axis.HORIZONTAL);
            map.fields[8][1] = new TrainRails(1, 8, (TrainRails)map.fields[8][2], TrainRails.Axis.HORIZONTAL);
            map.fields[8][0] = new Warehouse(0, 8, 'C');

            // Parking
            map.fields[9][1] = new Parking(1, 9, null, TrainRails.Axis.HORIZONTAL);
            map.fields[9][2] = new Parking(2, 9, (TrainRails)map.fields[9][1], TrainRails.Axis.HORIZONTAL);
            map.fields[9][3] = new Parking(3, 9, (TrainRails)map.fields[9][2], TrainRails.Axis.HORIZONTAL);
            map.fields[9][4] = new Parking(4, 9, (TrainRails)map.fields[9][3], TrainRails.Axis.HORIZONTAL);
            map.fields[9][5] = new Parking(5, 9, (TrainRails)map.fields[9][4], TrainRails.Axis.HORIZONTAL);
            map.fields[9][6] = new Parking(6, 9, (TrainRails)map.fields[9][5], TrainRails.Axis.HORIZONTAL);
            map.fields[9][7] = new Parking(7, 9, (TrainRails)map.fields[9][6], TrainRails.Axis.HORIZONTAL);
            map.fields[9][8] = new Parking(8, 9, (TrainRails)map.fields[9][7], TrainRails.Axis.HORIZONTAL);

            map.fields[9][9]  = new TrainRails(9, 9, (TrainRails)map.fields[9][8], TrainRails.Axis.HORIZONTAL);
            map.fields[9][10] = new TrainRails(10, 9, (TrainRails)map.fields[9][9], TrainRails.Axis.HORIZONTAL);
            map.fields[9][11] = new TrainRails(11, 9, (TrainRails)map.fields[9][10], TrainRails.Axis.VERTICAL);
            map.fields[8][11] = new TrainRails(11, 8, (TrainRails)map.fields[9][11], TrainRails.Axis.VERTICAL);
            map.fields[8][10] = new TrainRails(10, 8, (TrainRails)map.fields[8][11], TrainRails.Axis.HORIZONTAL);
            map.fields[8][9]  = new TrainRails(9, 8, (TrainRails)map.fields[8][10], TrainRails.Axis.HORIZONTAL);

            rails           = (TrainRails)map.fields[8][8];
            rails.nextTrack = (TrainRails)map.fields[8][9];
        }
Exemplo n.º 4
0
    public void setMaps(List <Sandtrap> sandtraps, Fairway fairway, Terrain terrain)
    {
        //Alias for terrain data
        TerrainData tdata = terrain.terrainData;

        //Get terrain detail size
        int terrainDetailSize = tdata.alphamapWidth;

        //Not the best way to deal with this, but it is being done before
        //the game starts.. so not that bad

        //Outside = 0 (rough)
        //Inside = 1 (green)
        //Inside, last node = 2 (green hole)
        //Inside, sandtrap = 3  (sandtrap)

        //Array for height map
        var heightMap = tdata.GetHeights(0, 0, tdata.heightmapResolution, tdata.heightmapResolution);

        //Array for detail maps, get the first layer
        var detailLayer = new int[tdata.detailWidth, tdata.detailHeight];

        //Get the maps
        float[,,] maps = new float[tdata.alphamapWidth, tdata.alphamapHeight, 4];

        for (int y = 0; y < terrainDetailSize; y++)
        {
            //Get normalised y
            var normY = (y / (float)terrain.terrainData.alphamapHeight);

            for (int x = 0; x < terrainDetailSize; x++)
            {
                //Get normalised x
                var normX = (x / (float)terrain.terrainData.alphamapWidth);

                //Calculate world pos
                var nx = terrain.transform.position.x + normX * Terrain.activeTerrain.terrainData.size.x;
                var ny = terrain.transform.position.z + normY * Terrain.activeTerrain.terrainData.size.z;

                var point = new Vector3(nx, 0, ny);

                //Running through each (x, y) in the detail map
                //..

                heightMap[y, x] = sandtraps[0].options.sinkDepth;

                //Is it inside a sandtrap?
                if (sandtraps.Any(s => s.isPointInside(point)))
                {
                    maps[y, x, 3] = 1.0f;

                    //Make it a bit lower
                    heightMap[y, x] -= sandtraps[0].options.sinkDepth;
                }

                //Is the point inside the hole?
                else if (fairway.isPointInsideHole(point))
                {
                    maps[y, x, 2] = 1.0f;
                }

                //Otherwise, is it inside the fairway?
                else if (fairway.isPointInside(point))
                {
                    maps[y, x, 1] = 1.0f;
                }

                //It's not in the hole, fairway or sandtraps
                else
                {
                    maps[y, x, 0] = 1.0f;

                    if (!fairway.isPointInsideOuterHull(point))
                    {
                        detailLayer[y, x] = splatOptions.densityPerPixel;
                    }
                    // else
                    //     detailLayer[y, x] = 1;
                }
            }
        }

        //Set the detail layer map
        tdata.SetDetailLayer(0, 0, 0, detailLayer);

        //Set the heightmap
        tdata.SetHeights(0, 0, heightMap);

        //And set the alphamaps
        tdata.SetAlphamaps(0, 0, maps);
        terrain.Flush();
    }