Beispiel #1
0
    public GUIRiver(GUIManager gm)
    {
        this.gm = gm;

        menuWidth = gm.menuWidth;
        rightMenuOffset = gm.rightOffset;
        topOffset = gm.topOffset;
        buttonHeight = gm.smallButtonHeight;
        sideOffset = 10;
        scaleY = gm.scaleY;
        visibleArea = gm.visibleArea;

        rg = gm.cm.riverGenerator;
        rg.riverGui = this;

        riverFlags = new List<bool>();

        //width = 15;
        //areaEffect = 1;
        //depth = 0.2f;

        defaultRiver = new RiverInfo(rg);
        defaultRiver.SetDefaultValues();
        selectedRiver = defaultRiver;
    }
Beispiel #2
0
 public void GenerateRiver()
 {
     // Creates a new river. Skip if river has already been created.
     if (River != null)
     {
         return;
     }
     River = new RiverGenerator();
 }
    public void AssignFunctions(TerrainGenerator terrainGenerator, FilterGenerator filterGenerator, 
        RiverGenerator riverGenerator, ErosionGenerator erosionGenerator)
    {
        tg = terrainGenerator;
        fg = filterGenerator;
        rg = riverGenerator;
        eg = erosionGenerator;
        lt = tg.localTerrain;

        UpdateLayers();
    }
    public void AssignFunctions(RiverGenerator rg)
    {
        this.rg = rg;

        lc = rg.localCoordinates;
        //globalRiverC = rg.globalRiverC;

        lt = rg.lt;
        fmc = rg.fmc;
        ftm = rg.ftm;
        fd = rg.fd;
    }
    public void AssignFunctions(GlobalCoordinates globalTerrainC, TerrainGenerator terrainGenerator, 
        FilterGenerator filterGenerator, RiverGenerator riverGenerator, ErosionGenerator erosionGenerator)
    {
        this.globalTerrainC = globalTerrainC;

        tg = terrainGenerator;
        fg = filterGenerator;
        rg = riverGenerator;
        eg = erosionGenerator;

        lm.AssignFunctions(tg, fg, rg, eg);
    }
        /// <summary>
        /// The actual world generation process
        /// </summary>
        protected override void DoOperation()
        {
            // Generate empty world object
            var world = new World(this.WorldDimensions, this.Seed);

            this.SignalNextStage("Generating height map..", 0.0);
            var heightMap = new HeightMap(this.WorldDimensions, this.Seed, this.Parameters);

            this.SignalNextStage("Generating temperature map..", 0.25);
            var temperatureMap = new TemperatureMap(this.WorldDimensions, this.Seed, this.Parameters, heightMap);

            this.SignalNextStage("Generating drainage map..", 0.30);
            var drainageMap = new DrainageMap(this.WorldDimensions, this.Seed, this.Parameters, heightMap);

            this.SignalNextStage("Generating rainfall map..", 0.45);
            var rainfallMap = new RainfallMap(this.WorldDimensions, this.Seed, this.Parameters, heightMap);

            // Generate rivers, readjust rainfall map and rebuild levels
            this.SignalNextStage("Generating biomes..", 0.60);
            var biomeMapper = new BiomeMapper(this.WorldDimensions, this.Seed, heightMap, rainfallMap, drainageMap, temperatureMap);

            this.SignalNextStage("Generating rivers..", 0.70);
            var riverGenerator = new RiverGenerator(this.WorldDimensions, this.Seed, heightMap, temperatureMap, rainfallMap, biomeMapper.TerrainTypes);

            riverGenerator.GenerateRivers();

            this.SignalNextStage("Placing resources..", 0.75);
            var resourceGenerator = new ResourceGenerator(this.WorldDimensions, this.Seed, biomeMapper.TerrainTypes, this.Parameters);

            this.SignalNextStage("Storing data..", 0.80);
            world.DetailedMap.Temperature   = temperatureMap.TemperatureTiles;
            world.DetailedMap.Drainage      = drainageMap.DrainageTiles;
            world.DetailedMap.Rainfall      = rainfallMap.RainfallTiles;
            world.DetailedMap.Terrain       = biomeMapper.TerrainTypes;
            world.DetailedMap.RiverTileInfo = riverGenerator.RiverTileInfo;
            world.DetailedMap.Resources     = resourceGenerator.Resources;

            this.SignalNextStage("Updating terrain tiles..", 0.85);
            world.UpdateTiles();

            this.SignalNextStage("Finding start continent..", 0.90);
            world.DiscoverInitialContinent();

            this.SignalNextStage("Building overview map..", 1.0);
            world.BuildOverview();



            // Signal that world generation has finished
            this.SignalFinished(world);
        }
    public void AssignFunctions(RiverGenerator rg)
    {
        this.rg = rg;
        fd = rg.fd;
        ftm = rg.ftm;
        fmc = rg.fmc;
        frd = rg.frd;

        errorRiver = new RiverInfo(rg);
        errorRiver.errorMessage = "-";

        terrainWidth = rg.lt.terrainWidth;
        terrainHeight = rg.lt.terrainHeight;
    }
Beispiel #8
0
    public RiverInfo(RiverGenerator rg)
    {
        riverPath = new List<Vertex>();
        //reachTop = false;
        //reachRight = false;
        //reachBot = false;
        //reachLeft = false;

        fd = rg.fd;
        frp = rg.frp;
        ftm = rg.ftm;
        fmc = rg.fmc;
        reachedSides = new List<Direction>();
        shape = RiverShape.atan;

        lowestPoint = new Vertex(666, 666, 666);

        globalRiverC = new GlobalCoordinates(100);
    }
Beispiel #9
0
    public void GenerateMap()
    {
        if (!Application.isPlaying)
        {
            return;
        }

        float[,] noiseMap = NoiseGenerator.GenerateNoise(mapChunkSize, mapChunkSize, seed, noiseScale, octaves, persistance, lacunarity, offset);
        Color[]       colorMap   = new Color[mapChunkSize * mapChunkSize];
        TileTerrain[] terrainMap = new TileTerrain[(mapChunkSize - 1) * (mapChunkSize - 1)];


        for (int x = 0; x < mapChunkSize; x++)
        {
            for (int y = 0; y < mapChunkSize; y++)
            {
                if (useFallOff)
                {
                    noiseMap[x, y] = Mathf.Clamp01(noiseMap[x, y] - fallOffMap[x, y]);
                }

                float currentHeight = noiseMap[x, y];
                for (int i = 0; i < TerrainSettingsManager.Instance.regions.Length; i++)
                {
                    if (currentHeight <= TerrainSettingsManager.Instance.regions[i].height && currentHeight <= 1)
                    {
                        colorMap[y * mapChunkSize + x] = TerrainSettingsManager.Instance.regions[i].color;
                        if (x < (mapChunkSize - 1) && y < (mapChunkSize - 1))
                        {
                            terrainMap[y * (mapChunkSize - 1) + x] = TerrainSettingsManager.Instance.regions[i].type;
                        }
                        break;
                    }
                }
            }
        }

        RiverReturn river = RiverGenerator.GenerateRivers(noiseMap);

        int t;

        for (t = 0; t < river.riverPoints.Length; t++)
        {
            int x = (int)river.riverPoints[t].x;
            int y = (int)river.riverPoints[t].y;
            //Instantiate(GameObject.CreatePrimitive(PrimitiveType.Cube), new Vector3(y,5,x), Quaternion.identity);
            colorMap[y * mapChunkSize + x]         = TerrainSettingsManager.Instance.regions[9].color;
            terrainMap[y * (mapChunkSize - 1) + x] = TerrainSettingsManager.Instance.regions[9].type;
        }

        MapDisplay mapDisplay = FindObjectOfType <MapDisplay>();

        if (drawmode == DrawMode.noiseMap)
        {
            mapDisplay.DrawTexture(TextureGenerator.NoiseTextureFromHeightMap(noiseMap));
        }
        else if (drawmode == DrawMode.ColorMap)
        {
            mapDisplay.DrawTexture(TextureGenerator.TextureFromColorMap(colorMap, mapChunkSize, mapChunkSize));
        }
        else if (drawmode == DrawMode.Mesh)
        {
            map.Initialize(noiseMap, meshHeightMultiplier, meshHeightCurve, levelOfDetail, terrainMap);
            map.BuildMesh();
            GameTile[] tiles = map.GenerateGameTiles();
            map.ApplyTexture(TextureGenerator.TextureFromColorMap(colorMap, mapChunkSize, mapChunkSize));

            fogofwar.Initialize(map.Vertices, map.Triangles, map.Uvs, noiseMap.GetLength(0), noiseMap.GetLength(1));
            TerrainFeaturePlacer.Instance.PlaceFeatures();


            player.Instantiate(map.GetNearestTile(tiles[((mapChunkSize - 1) * (mapChunkSize - 1)) / 2], TileTerrain.Land, TileFeatures.Village, 30));
            fogofwar.ClearFog(player.Tile, 3);
        }
        else if (drawmode == DrawMode.FallOffMap)
        {
            mapDisplay.DrawTexture(TextureGenerator.NoiseTextureFromHeightMap(FallOffGenerator.GenerateFallOffMap(mapChunkSize)));
        }
    }
Beispiel #10
0
    void Start()
    {
        // Initialise main Class object
        terrain = new TerrainGenerator();

        // Calling the constructor (Unity's C# does not allow conventional constructors)
        terrain.initialise(patchSize, patchMatrixSize);

        // Updating end-point of main mesh
        endPoint = new Vector3(terrain.terrainSize - 1, 0, terrain.terrainSize - 1);

        // Generate fractal Diamond-Square turbulence
        terrain.applyDiamondSquare(diSqStrength);

        // Initialise procedural texture variables
        terrain.applyProceduralTex(true, sandColor, sandLimit, sandStrength, sandCoverage, true, grassColor, grassStrength, true, snowColor, snowLimit, snowStrength, snowCoverage, true, rockColor, slopeLimit, slopeStrength, noiseTexValue);

        // Build mesh
        terrain.build();

        // erosionManager has to be created when
        erosionManager = new ErosionManager(terrain);
        erosionManager.initHydraulicMaps();
        filterManager = new FilterManager(terrain);
        //riverGenerator has to be after filterManager!
        riverGenerator = new RiverGenerator(terrain);

        //doesn't work well with on-fly generation
        riverGenerator.ftm.PerserveMountains(5, 30, 20);
    }
    private void Update()
    {
        Animator       anim = GetComponentInChildren <Animator>();
        GameController gc   = GameController.GetInstance();
        RiverGenerator rg   = gc.riverGenerator;
        Creature       cr   = GetComponent <Creature>();

        // apply acceleration
        velocity += Vector3.ClampMagnitude(GetAcceleration(), maxAcceleration) * Time.deltaTime;
        // apply water resistance
        Vector3 waterSpeed = rg.GetWaterSpeedAt(transform.position);

        velocity += (waterSpeed - velocity) * waterResistance * Time.deltaTime;

        // enforce max velocity relative to water speed
        velocity = Vector3.ClampMagnitude(velocity - waterSpeed, maxSpeed) + waterSpeed;

        velocity.Scale(new Vector3(1, 0, 1));

        // Apply gravity when dead
        if (cr.IsDead() && (anim.GetCurrentAnimatorStateInfo(0).IsName("Dead")))
        {
            velocity += Vector3.down * beaverSinkSpeed * Time.deltaTime;
        }

        // move according to velocity
        transform.position += velocity * Time.deltaTime;

        // calculate the beaver's rotation and animation blending
        if (!cr.IsDead())
        {
            Vector3    oldRotation     = transform.rotation.eulerAngles;
            Quaternion desiredRotation = transform.rotation;

            // figure out where the beaver wants to look
            if (target != null && lookAtBoatVSDirectionBlending != null)
            {
                float distanceToTarget = Vector3.Distance(target.position, transform.position);

                // Use more precise distance if target collider is available
                if (targetCollider != null)
                {
                    distanceToTarget = Vector3.Distance(targetCollider.ClosestPoint(transform.position), transform.position);
                }

                // blend between looking to boat and looking forwards depending on distance
                float lookAtTarget = lookAtBoatVSDirectionBlending.Evaluate(distanceToTarget);
                desiredRotation = Quaternion.Lerp(
                    Quaternion.LookRotation(velocity - waterSpeed, Vector3.up),
                    Quaternion.LookRotation(target.position - transform.position, Vector3.up),
                    lookAtTarget
                    );
            }

            // "Lerp" the beaver towards the desired rotation over time
            transform.rotation = Quaternion.Lerp(transform.rotation, desiredRotation, rotationLerp * Time.deltaTime);

            // Set the beavers apparent curvature depending on rotation change
            float rotationChange = Mathf.DeltaAngle(oldRotation.y, transform.rotation.eulerAngles.y) / Time.deltaTime;
            anim.SetFloat("Blend", rotationChange / fullTurnAngle);

            // determine if attacking
            if (attackTimer == 0f && !anim.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
            {
                // look for attackable objects
                SphereCollider attackSphere = attackPoint.GetComponent <SphereCollider>();
                Collider[]     attackResult = Physics.OverlapSphere(attackPoint.transform.position, attackSphere.radius, LayerMask.GetMask(attackLayerMask));
                foreach (Collider col in attackResult)
                {
                    DestructibleObject d = col.gameObject.GetComponentInParent <DestructibleObject>();
                    if (d != null && d.objectMaterial == DestructibleObject.DestructibleObjectMaterial.WOOD)
                    {
                        // attack!
                        objectAttacking = d;
                        anim.SetTrigger("Attack");
                        attackTimer = attackCooldown;
                    }
                }
            }
        }

        // Update timers
        attackTimer -= Mathf.Min(Time.deltaTime, attackTimer);
    }
	private void generateRivers(){

		RiverGenerator riverGenerator = new RiverGenerator ();
		List<Vector2> p = new List<Vector2> ();

		p.Add (new Vector2 (1,1));
		p.Add (new Vector2 (1,2));
		p.Add (new Vector2 (2,1));
		p.Add (new Vector2 (2,2));
		p.Add (new Vector2 (3,1));
		p.Add (new Vector2 (3,2));
		p.Add (new Vector2 (4,1));
		p.Add (new Vector2 (4,2));

		riverGenerator.generate (p);

	}
 public FunctionRiverPlanner(RiverGenerator rg)
 {
     this.rg = rg;
     vertices = rg.vertices;
     terrainSize = rg.terrainSize;
 }
 public void AssignFunctions(RiverGenerator rg)
 {
     this.rg = rg;
     lt = rg.lt;
     ftm = rg.ftm;
 }
Beispiel #15
0
    /// <summary>
    /// Generates the world.
    /// Initiates a <see cref="TerrainGenerator"/> & generates the base Terrain <see cref="TerrainGenerator.GenerateBaseTerrain"/>
    /// Then Initiates a <see cref="KingdomsGenerator"/> that generates all the kingdoms, as well as claiming all their territory
    /// Then generates terrain details using <see cref="TerrainGenerator.GenerateWorldDetailTerrain"/>
    /// Finally, generates all settlements using <see cref="KingdomsGenerator.GenerateAllKingdomSettlements"/>
    ///
    /// TODO - Add dungeon generation, add settlement details generation (roads + paths)
    /// </summary>
    /// <returns></returns>
    public void GenerateWorld(WorldManager wm)
    {
        //Set Random init state based on seed
        Random.InitState(Seed);
        MiscMaths.SetRandomSeed(Seed);
        //Initiate empty world and generate base terrain
        World = new World();
        wm.SetWorld(World);

        //Create a default RNG to be used by the generators (Not thread safe)
        MainGenerator = new GenerationRandom(Seed);
        //Generation starts
        TerrainGenerator = new TerrainGenerator(this, World);
        RiverGenerator   = new RiverGenerator(this);
        LakeGenerator    = new LakeGenerator(this);


        Debug.BeginDeepProfile("chunk_base_gen");

        TerrainGenerator.GenerateChunkBases();//Generate the chunk bases, these only define if they are land or sea.

        //Generates fine terrain details: rivers, lakes, (todo - marshes, more variety to forrests?)
        TerrainGenerator.GenerateTerrainDetails();

        Debug.EndDeepProfile("chunk_base_gen");



        //TODO - check if this is still required (probably not)
        ChunkGenerator = new ChunkGenerator(this);



        Debug.BeginDeepProfile("kingdom_set_gen");
        //We then generate empty kingdoms based on these empty chunks
        KingdomsGenerator kingGen = new KingdomsGenerator(World, this);

        //We also generate the all empty settlements for the world.
        kingGen.GenerateEmptyKingdomsFromBaseChunks(4);
        //Generates all settlement chunks
        PreGeneratedChunks = kingGen.GenerateSettlements();

        Debug.EndDeepProfile("kingdom_set_gen");


        Debug.BeginDeepProfile("chunk_struct_gen");
        //Generate chunk structures (bandit camps, etc)
        StructureGenerator = new ChunkStructureGenerator(this);
        StructureGenerator.GenerateStructureShells();

        //Iterate all chunks generated for chunk structures, add them to the PreGeneratedChunks
        foreach (KeyValuePair <Vec2i, ChunkData> kvp in StructureGenerator.GenerateAllStructures())
        {
            PreGeneratedChunks.Add(kvp.Key, kvp.Value);
        }
        Debug.EndDeepProfile("chunk_struct_gen");


        Debug.BeginDeepProfile("terrain_map_gen");
        //Create a simple map based on the terrain of the world
        GenerateTerrainMap(TerrainGenerator.ChunkBases);
        Debug.EndDeepProfile("terrain_map_gen");
    }
    void Start()
    {
        guiManager = GameObject.Find("GUI").GetComponent<GUIManager>();

        terrainWidth = 100;
        terrainHeight = terrainWidth;

        try
        {
            GUIterrainPlannerMenu tpMenu = GameObject.Find("TerrainPlanner").GetComponent<GUIterrainPlannerMenu>();
            patchSize = tpMenu.patch.patchSize;
        }
        catch (Exception e)
        {
            Debug.Log("TerrainPlanner not found");
            patchSize = 64;
        }

        cameraMovement camera = transform.GetComponent<cameraMovement>();
        camera.ChangePosition(new Vector3(0, 100, 0));
        camera.ChangeRotation(new Vector3(90, 0, 0));

        scaleTerrainY = 12;

        int quadrantSize = Math.Max(terrainWidth, terrainHeight);

        layerManager = new LayerManager();

        globalTerrain = new GlobalTerrain(quadrantSize);
        localTerrain = new LocalTerrain(terrainWidth, terrainHeight, 30, globalTerrain, layerManager);
        filterGenerator = new FilterGenerator(quadrantSize, localTerrain);

        functionMathCalculator = new FunctionMathCalculator();
        functionDebugger = new FunctionDebugger();
        functionRiverDigger = new FunctionRiverDigger();
        functionRiverPlanner = new FunctionRiverPlanner();
        functionTerrainManager = new FunctionTerrainManager();

        terrainGenerator = new TerrainGenerator(patchSize);
        riverGenerator = new RiverGenerator(localTerrain);
        erosionGenerator = new ErosionGenerator(localTerrain);

        gridManager = new GridManager(new Vector3(0,0,0), patchSize, patchSize);

        AssignFunctions();
        terrainGenerator.initialize(scaleTerrainY);

        localTerrain.UpdateVisibleTerrain(new Vector3(0, 0, 0), false);
    }
Beispiel #17
0
    // Launches the generation of the specified water body (or all of them if index = -1).
    public void RecalculateWaterBodies(int index = -1)
    {
        // Reset all roads, since roads will have to be recalculated after any water body change.
        foreach (RoadGenerator thread in roadThreads.Values)
            thread.Abort ();
        roadThreads.Clear ();
        if (roadsCoroutine != null) {
            StopCoroutine (roadsCoroutine);
            roadsCoroutine = null;
        }

        for (int i = ((index < 0) ? 0 : index); i < ((index < 0) ? waterBodiesDefinitionData.Count : (index + 1)); i++) {

            if (waterBodiesThreads.ContainsKey (i)) // If thread for this water body is running, substitute it.
                waterBodiesThreads[i].Abort ();

            Vector3 origin = waterBodiesDefinitionData [i];
            WaterBodyGenerator thread;
            if (origin.y >= 0f)
                thread = new OceanGenerator (new Vector2 (origin.x, origin.z), origin.y);
            else
                thread = new RiverGenerator (new Vector2 (origin.x, origin.z));
            thread.Start ();

            waterBodiesThreads[i] = thread;
        }

        // If the coroutine is already launch, no change is needed, since it will check for all currently running threads.
        if (waterBodiesCoroutine == null)
            waterBodiesCoroutine = StartCoroutine (WaitForWaterBodyThreads());
    }
 public FunctionMathCalculator(RiverGenerator rg)
 {
     this.rg = rg;
     vertices = rg.vertices;
     terrainSize = rg.terrainSize;
 }
Beispiel #19
0
    override public void OnStateEnter(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)
    {
        RiverGenerator riverGenerator = GameController.GetInstance().riverGenerator;

        riverGenerator.RepopulateBuffer(templates, uniqueTemplates, Random.Range(minTemplates, maxTemplates), uniqueChance);
    }
    public void AssignFunctions(GlobalTerrain globalTerrain, LocalTerrain localTerrain,
        FilterGenerator filterGenerator, FunctionMathCalculator functionMathCalculator,
        RiverGenerator riverGenerator, GridManager gridManager, GUIManager guiManager,
        ErosionGenerator erosionGenerator)
    {
        this.globalTerrain = globalTerrain;
        this.localTerrain = localTerrain;
        this.filterGenerator = filterGenerator;
        this.riverGenerator = riverGenerator;
        this.erosionGenerator = erosionGenerator;

        fmc = functionMathCalculator;

        gm = gridManager;

        rt.AssignFunctions(fmc);
        ds.AssignFunctions(localTerrain);

        this.guiManager = guiManager;
        message = guiManager.message;
    }