コード例 #1
0
    public IEnumerator GenerateHeightMap(
        int width,
        int height,
        float xOffset,
        float yOffset,
        TerrainParameter para,
        IReturn <float[]> ret)
    {
        _width   = width;
        _height  = height;
        _xOffset = xOffset;
        _yOffset = yOffset;
        _para    = para;

        _heightMap = new float[_width * _height];

        var genLocalMonad = new BlockMonad <float[]>(r =>
                                                     _randPointGen.GenerateRandomLocalAreaMap(
                                                         width, height, _para.RANDOM_POINT_GEN_PARA, r));

        yield return(genLocalMonad.Do());

        if (genLocalMonad.Error != null)
        {
            ret.Fail(genLocalMonad.Error);
            yield break;
        }
        _localAreaMap = genLocalMonad.Result;

        yield return(_GenerateHeightMap());

        ret.Accept(_heightMap);
    }
コード例 #2
0
        /// <summary>
        /// Fire after calling <see cref="FailedGamePlay()"/>
        /// Will proccess continue logic during this phase.
        /// Note. during GameFaildFlow the GamePlay is still running but keeps in pause status.
        /// This flow may fire mutilple times during one gameplay.
        /// </summary>
        /// <returns></returns>
        IEnumerator GameFaildFlow()
        {
            EnterPause();
            currentGamePlayData.OnGameFaild();
            //已經接關過
            if (!currentGamePlayData.IsContinueAvailable)
            {
                EndTheGame();
            }
            //尚未接關過
            else
            {
                isContinueing = true;
                BlockMonad <bool> continueFlowCoroutine = new BlockMonad <bool>(r => currentGamePlayData.OnContinueFlow(r));
                yield return(continueFlowCoroutine.Do());

                // Continue success
                if (continueFlowCoroutine.Result)
                {
                    currentGamePlayData.OnContinue();
                    isFailed      = false;
                    isContinueing = false;
                    // alreadyContinue = true;
                }
                else
                {
                    isContinueing = false;
                    EndTheGame();
                }
                continueFlowCoroutine = null;
            }

            ResumePause();
        }
コード例 #3
0
    public IEnumerator GenerateWeatherMap(
        int width,
        int height,
        float xOffset,
        float yOffset,
        TemperatureParameter para,
        IReturn <float[]> ret)
    {
        _width  = width;
        _height = height;
        _para   = para;

        _temperatureMap = new float[_width * _height];

        var weatherMonad = new BlockMonad <float[]>(r =>
                                                    _weatherGen.GenerateWeatherMap(_width, _height, xOffset, yOffset, _para.WEATHER_GEN_PARA, r));

        yield return(weatherMonad.Do());

        _varietyStatus = _weatherGen.VarietyStatus;
        var varietyMap = weatherMonad.Result;

        _GenerateMainTemperature(varietyMap);

        ret.Accept(_temperatureMap);
    }
コード例 #4
0
    private void _CreateNewWorld()
    {
        _executor.Clear();
        var monad = new BlockMonad <None>(r => _CreateNewWorldMonad());

        _executor.Add(monad.Do());
    }
コード例 #5
0
    public IEnumerator Initialize()
    {
        var genTerrainMonad = new BlockMonad <float[]>(r =>
                                                       _terrainGen.GenerateHeightMap(
                                                           MAP_WIDTH,
                                                           MAP_HEIGHT,
                                                           Random.Range(0, 10000),
                                                           Random.Range(0, 10000),
                                                           new TerrainParameter(),
                                                           r));
        var genTemperatureMonad = new BlockMonad <float[]>(r =>
                                                           _temperatureGen.GenerateWeatherMap(
                                                               MAP_WIDTH,
                                                               MAP_HEIGHT,
                                                               Random.Range(0, 10000),
                                                               Random.Range(0, 10000),
                                                               new WeatherParameter(),
                                                               r));
        var genHumidityMonad = new BlockMonad <float[]>(r =>
                                                        _humidityGen.GenerateWeatherMap(
                                                            MAP_WIDTH,
                                                            MAP_HEIGHT,
                                                            Random.Range(0, 10000),
                                                            Random.Range(0, 10000),
                                                            new WeatherParameter(),
                                                            r));
        var genManaMonad = new BlockMonad <float[]>(r =>
                                                    _manaGen.GenerateWeatherMap(
                                                        MAP_WIDTH,
                                                        MAP_HEIGHT,
                                                        Random.Range(0, 10000),
                                                        Random.Range(0, 10000),
                                                        new WeatherParameter(),
                                                        r));

        var combineM = Monad.WhenAll(
            genTerrainMonad,
            genTemperatureMonad,
            genHumidityMonad,
            genManaMonad);

        _executor.Add(combineM.Do());
        yield return(_executor.Join());
    }
コード例 #6
0
    private IEnumerator _ShowWeatherMap()
    {
        Debug.Log("[WeatherGen] generate start");

        var monad = new BlockMonad <float[]>(r =>
                                             _weatherGen.GenerateWeatherMap(
                                                 _spriteView.Width,
                                                 _spriteView.Height,
                                                 _xOffset,
                                                 _yOffset,
                                                 _weatherParam,
                                                 r));

        yield return(monad.Do());

        Debug.Log("[WeatherGen] generate complete");
        _weatherMap = monad.Result;
        _spriteView.SetTemperatureMap(_weatherMap);
    }
コード例 #7
0
    private IEnumerator _WeatherChangeUpdate()
    {
        while (true)
        {
            float sleepTime = 3;
            while (sleepTime > 0)
            {
                yield return(null);

                sleepTime -= Time.deltaTime;
            }

            Debug.Log("[WeatherGen] generate Next start");
            var monad = new BlockMonad <float[]>(r => _weatherGen.ChangeToNextWeather(r));
            yield return(monad.Do());

            _xOffset = _weatherGen.VarietyStatus.XOffset;
            _yOffset = _weatherGen.VarietyStatus.YOffset;

            _weatherMap = monad.Result;
            _spriteView.SetTemperatureMap(_weatherMap);
        }
    }
コード例 #8
0
    private IEnumerator _ShowHeightMap()
    {
        float t1 = Time.time;

        Debug.Log("[TerrainGen] generate start");
        var monad = new BlockMonad <float[]>(r =>
                                             _terrainGen.GenerateHeightMap(
                                                 _spriteView.Width,
                                                 _spriteView.Height,
                                                 _xOffset,
                                                 _yOffset,
                                                 _terrainParam,
                                                 r));

        yield return(monad.Do());

        Debug.Log("[TerrainGen] generate complete");
        _heightMap = monad.Result;
        _spriteView.SetHeightMap(_heightMap);

        float t2 = Time.time;

        Debug.LogFormat("{0}=>{1}  spent:{2}", t1, t2, t2 - t1);
    }
コード例 #9
0
    private IEnumerator _ShowLocalAreaMap()
    {
        float t1 = Time.time;

        Debug.Log("[RandomPointGen] generate start");

        var monad = new BlockMonad <float[]>(r =>
                                             _randPointGen.GenerateRandomLocalAreaMap(
                                                 _spriteView.Width,
                                                 _spriteView.Height,
                                                 _randomParam,
                                                 r));

        yield return(monad.Do());

        Debug.Log("[RandomPointGen] generate complete");
        _localAreaMap = monad.Result;
        _points       = _randPointGen.Points;
        _spriteView.SetLocalAreaMap(_localAreaMap);

        float t2 = Time.time;

        Debug.LogFormat("{0}=>{1}  spent:{2}", t1, t2, t2 - t1);
    }
コード例 #10
0
    private IEnumerator _CreateNewWorldMonad()
    {
        Random.InitState(_seed);

        var genTerrainMonad = new BlockMonad <float[]>(r =>
                                                       _terrainGen.GenerateHeightMap(
                                                           _width,
                                                           _height,
                                                           Random.Range(0, 10000),
                                                           Random.Range(0, 10000),
                                                           _paramTerrain,
                                                           r));
        var genHumidityMonad = new BlockMonad <float[]>(r =>
                                                        _humidityGen.GenerateWeatherMap(
                                                            _width,
                                                            _height,
                                                            Random.Range(0, 10000),
                                                            Random.Range(0, 10000),
                                                            _paramWeather,
                                                            r));
        var genTemperatureMonad = new BlockMonad <float[]>(r =>
                                                           _temperatureGen.GenerateWeatherMap(
                                                               _width,
                                                               _height,
                                                               Random.Range(0, 10000),
                                                               Random.Range(0, 10000),
                                                               _paramTemperature,
                                                               r));
        var genManaMonad = new BlockMonad <float[]>(r =>
                                                    _manaGen.GenerateManaMap(
                                                        _width,
                                                        _height,
                                                        _paramMana,
                                                        r));

        Debug.Log("start genTerrainMonad");
        yield return(genTerrainMonad.Do());

        Debug.Log("start genHumidityMonad");
        yield return(genHumidityMonad.Do());

        Debug.Log("start genTemperatureMonad");
        yield return(genTemperatureMonad.Do());

        Debug.Log("start genManaMonad");
        yield return(genManaMonad.Do());

        var terrainMap     = genTerrainMonad.Result;
        var humidityMap    = genHumidityMonad.Result;
        var temperatureMap = genTemperatureMonad.Result;
        var manaMap        = genManaMonad.Result;

        var genRiverMonad = new BlockMonad <float[]>(r =>
                                                     _riverGen.GenerateRiverMap(
                                                         _width,
                                                         _height,
                                                         terrainMap,
                                                         _paramRain,
                                                         r));

        Debug.Log("start genRiverMonad");
        yield return(genRiverMonad.Do());

        var riverMap = genRiverMonad.Result;

        var tileUnitMap = new TileUnit[_width * _height];

        IBiomeIdentifier identifier = new BasicBiomeIdentifier(_biomeDistribution);

        for (int x = 0; x < _width; x++)
        {
            for (int y = 0; y < _height; y++)
            {
                var idx = MathUtility.MapIndex(x, y, _height);

                var height      = terrainMap[idx];
                var humidity    = humidityMap[idx];
                var temperature = temperatureMap[idx];
                var mana        = manaMap[idx];
                var river       = riverMap[idx];

                BiomeData biome = identifier.IdentifyBiome(humidity, height, temperature);
                tileUnitMap[idx] = new TileUnit(
                    height,
                    humidity,
                    temperature,
                    mana,
                    river,
                    biome.Biome);
            }
        }

        _tileData = new TileDataUnit
        {
            Map    = tileUnitMap,
            Width  = _width,
            Height = _height,
        };
        _noticeTxt = "New world created.";
    }