예제 #1
0
    private RingSector CreateNewSector(int i)
    {
        MapPointType type; Path p;

        ProgressionMaster.DefinePointOfInterest(this, out type, out p);
        var        pos = GetSectorPosition(i);
        RingSector rs;

        if (type != MapPointType.Star)
        {
            var poi = new PointOfInterest(pos.x, pos.y, type, p);
            rs = new RingSector(poi, Environment.GetEnvironment(ascension, pos.y));
            AddPoint(poi, true);
        }
        else
        {
            var e           = Environment.GetEnvironment(ascension, pos.y);
            int presetIndex = (int)e.presetType;
            if (starsTypesArray[presetIndex])
            {
                return(null);
            }
            else
            {
                SunPoint sunpoint = new SunPoint(
                    pos.x,
                    pos.y,
                    e.GetMapColor()
                    );
                rs = new RingSector(sunpoint, e);
                AddPoint(sunpoint, true);
                starsTypesArray[presetIndex] = true;
                createNewStars = false;
                for (int j = 0; j < (int)Environment.EnvironmentPreset.TotalCount; j++)
                {
                    if ((Environment.EnvironmentPreset)j == Environment.EnvironmentPreset.Custom)
                    {
                        continue;
                    }
                    else
                    {
                        if (starsTypesArray[j] == false)
                        {
                            createNewStars = true;
                            break;
                        }
                    }
                }
            }
        }
        mapSectors[i] = rs;
        actionsHash++;
        return(rs);
    }
예제 #2
0
    private void Update()
    {
        if (!prepared)
        {
            return;
        }

        float t = Time.deltaTime * GameMaster.gameSpeed;
        float f = 0, a;

        float[] thisCycleRotations = new float[RINGS_COUNT];
        for (int i = 0; i < RINGS_COUNT; i++)
        {
            a = rotationSpeed[i] * t;
            thisCycleRotations[i] = a;
            f  = ringsRotation[i];
            f -= thisCycleRotations[i];
            if (f > 360)
            {
                f = f % 360f;
            }
            else
            {
                if (f < 0)
                {
                    f = 360f - Mathf.Abs(f % 360f);
                }
            }
            ringsRotation[i] = f;
        }

        var prefAsc = ascension;

        updateTimer -= t;
        if (updateTimer <= 0f)
        {
            updateTimer = ASCENSION_UPDATE_TIME;

            ascensionTarget = ProgressionMaster.DefineAscension(colonyController);
            a = GetGlobalMapAscension(); if (ascensionTarget > a)
            {
                ascensionTarget = a;
            }
            a = Knowledge.GetCurrent()?.GetCompleteness() ?? 0f; if (ascensionTarget > a)
            {
                ascensionTarget = a;
            }
        }
        if (ascension != ascensionTarget)
        {
            ascension = Mathf.MoveTowards(ascension, ascensionTarget, GameConstants.ASCENSION_CHANGE_SPEED * t * (1.5f - GameMaster.stability));
        }
        float ascensionChange = prefAsc - ascension;
        //
        float prevX = cityPoint.angle, prevY = cityPoint.height;

        if (mapPoints.Count > 0)
        {
            if (GameMaster.realMaster.colonyController != null && cityPoint.ringIndex != 2)
            {
                float speed = RING_RESIST_CF;
                if (cityPoint.ringIndex == 0 || cityPoint.ringIndex == 4)
                {
                    speed *= speed;
                }
                a = Mathf.MoveTowards(cityPoint.height, 0.5f, speed * t);
                ChangeCityPointHeight(a - cityPoint.height);
                // Использование stability?
            }
            int i = 0;
            while (i < mapPoints.Count)
            {
                MapPoint mp = mapPoints[i];
                mp.angle += thisCycleRotations[mp.ringIndex];
                if (mp.type == MapPointType.FlyingExpedition)
                {
                    FlyingExpedition fe = (mp as FlyingExpedition);
                    MapPoint         d  = fe.destination;
                    if (d != null)
                    {
                        if (mp.height != d.height)
                        {
                            mp.height = Mathf.MoveTowards(mp.height, d.height, fe.speed * t * 0.01f);
                        }
                        else
                        {
                            if (mp.angle != d.angle)
                            {
                                mp.angle = Mathf.MoveTowardsAngle(mp.angle, d.angle, fe.speed * t);
                            }
                            else
                            {
                                mapPoints.RemoveAt(i);
                                fe.expedition.DropMapMarker();
                                pointsExploringEvent?.Invoke(d);
                                if (fe.expedition.stage == Expedition.ExpeditionStage.WayIn)
                                {
                                    fe.expedition.StartMission();
                                }
                                else
                                {
                                    fe.expedition.Dismiss();
                                }
                                actionsHash++;
                                continue;
                            }
                        }
                    }
                    else
                    {
                        AnnouncementCanvasController.MakeAnnouncement(Localization.GetCrewAction(LocalizedCrewAction.CannotReachDestination, fe.expedition.crew));
                        fe.expedition.EndMission();
                    }
                }
                i++;
            }
        }
        //
        cityLookVector   = Quaternion.AngleAxis(cityPoint.angle, Vector3.up) * Vector3.forward;
        cityFlyDirection = new Vector3(cityPoint.angle - prevX + rotationSpeed[cityPoint.ringIndex], ascensionChange, cityPoint.height - prevY);
        SYSTEM_envWasCalculatedThisTick = false;
    }
예제 #3
0
    virtual protected void GenerateChallengesArray()
    {
        int size = 5 + Random.Range(0, (int)(3f * mysteria + 3f * richness));

        challengeArray = new ChallengeField[size, size];

        // generating:
        int   sqr = size * size;
        float totalVariety = danger + mysteria + friendliness + difficulty;
        float abilityTestChance = danger / totalVariety, mysteriaChance = mysteria / totalVariety,
              giftChance = friendliness / totalVariety, puzzlePartChance = difficulty / totalVariety;
        float maxDifficulty = ChallengeField.MAX_DIFFICULTY * difficulty;
        float v = Random.value, df;

        var atests = new ChallengeType[6];

        switch (path)
        {
        case Path.TechPath:
        {
            if (v > 0.5f)
            {
                atests[0] = ChallengeType.IntelligenceTest;
                atests[1] = ChallengeType.TechSkillsTest;
            }
            else
            {
                atests[1] = ChallengeType.IntelligenceTest;
                atests[0] = ChallengeType.TechSkillsTest;
            }
            v = Random.value;
            if (v < 0.5f)
            {
                atests[2] = ChallengeType.PerceptionTest;
                atests[3] = ChallengeType.PersistenceTest;
                if (v < 0.25f)
                {
                    atests[4] = ChallengeType.SurvivalSkillsTest;
                    atests[5] = ChallengeType.SecretKnowledgeTest;
                }
                else
                {
                    atests[5] = ChallengeType.SurvivalSkillsTest;
                    atests[4] = ChallengeType.SecretKnowledgeTest;
                }
            }
            else
            {
                atests[3] = ChallengeType.PersistenceTest;
                atests[2] = ChallengeType.PerceptionTest;
                if (v < 0.75f)
                {
                    atests[4] = ChallengeType.SurvivalSkillsTest;
                    atests[5] = ChallengeType.SecretKnowledgeTest;
                }
                else
                {
                    atests[5] = ChallengeType.SurvivalSkillsTest;
                    atests[4] = ChallengeType.SecretKnowledgeTest;
                }
            }
            break;
        }

        case Path.SecretPath:
        {
            if (v > 0.5f)
            {
                atests[0] = ChallengeType.PerceptionTest;
                atests[1] = ChallengeType.SecretKnowledgeTest;
            }
            else
            {
                atests[1] = ChallengeType.PerceptionTest;
                atests[0] = ChallengeType.SecretKnowledgeTest;
            }
            v = Random.value;
            if (v < 0.5f)
            {
                atests[2] = ChallengeType.PersistenceTest;
                atests[3] = ChallengeType.IntelligenceTest;
                if (v < 0.25f)
                {
                    atests[4] = ChallengeType.SurvivalSkillsTest;
                    atests[5] = ChallengeType.TechSkillsTest;
                }
                else
                {
                    atests[5] = ChallengeType.SurvivalSkillsTest;
                    atests[4] = ChallengeType.TechSkillsTest;
                }
            }
            else
            {
                atests[3] = ChallengeType.PersistenceTest;
                atests[2] = ChallengeType.IntelligenceTest;
                if (v < 0.75f)
                {
                    atests[4] = ChallengeType.SurvivalSkillsTest;
                    atests[5] = ChallengeType.TechSkillsTest;
                }
                else
                {
                    atests[5] = ChallengeType.SurvivalSkillsTest;
                    atests[4] = ChallengeType.TechSkillsTest;
                }
            }
            break;
        }

        case Path.LifePath:
        default:
        {
            if (v > 0.5f)
            {
                atests[0] = ChallengeType.PersistenceTest;
                atests[1] = ChallengeType.SurvivalSkillsTest;
            }
            else
            {
                atests[1] = ChallengeType.PersistenceTest;
                atests[0] = ChallengeType.SurvivalSkillsTest;
            }
            v = Random.value;
            if (v < 0.5f)
            {
                atests[2] = ChallengeType.PerceptionTest;
                atests[3] = ChallengeType.IntelligenceTest;
                if (v < 0.25f)
                {
                    atests[4] = ChallengeType.SecretKnowledgeTest;
                    atests[5] = ChallengeType.TechSkillsTest;
                }
                else
                {
                    atests[5] = ChallengeType.SecretKnowledgeTest;
                    atests[4] = ChallengeType.TechSkillsTest;
                }
            }
            else
            {
                atests[3] = ChallengeType.PerceptionTest;
                atests[2] = ChallengeType.IntelligenceTest;
                if (v < 0.75f)
                {
                    atests[4] = ChallengeType.SecretKnowledgeTest;
                    atests[5] = ChallengeType.TechSkillsTest;
                }
                else
                {
                    atests[5] = ChallengeType.SecretKnowledgeTest;
                    atests[4] = ChallengeType.TechSkillsTest;
                }
            }
            break;
        }
        }

        for (int x = 0; x < size; x++)
        {
            for (int y = 0; y < size; y++)
            {
                if (v < richness)
                {
                    df = (0.7f - 0.1f * friendliness + 0.3f * Random.value);
                    v  = v / richness;
                    if (Random.value < 0.8f)
                    {
                        if (v < abilityTestChance)
                        { // abilities tests
                            v = Random.value;
                            if (v < 0.55f)
                            {
                                if (v < 0.3f)
                                {
                                    challengeArray[x, y] = new ChallengeField(atests[0], (byte)(maxDifficulty * df));
                                }
                                else
                                {
                                    challengeArray[x, y] = new ChallengeField(atests[1], (byte)(maxDifficulty * df));
                                }
                            }
                            else
                            {
                                if (v < 0.9f)
                                {
                                    if (v < 0.75f)
                                    {
                                        challengeArray[x, y] = new ChallengeField(atests[2], (byte)(maxDifficulty * df));
                                    }
                                    else
                                    {
                                        challengeArray[x, y] = new ChallengeField(atests[3], (byte)(maxDifficulty * df));
                                    }
                                }
                                else
                                {
                                    if (v < 0.97f)
                                    {
                                        challengeArray[x, y] = new ChallengeField(atests[4], (byte)(maxDifficulty * df));
                                    }
                                    else
                                    {
                                        challengeArray[x, y] = new ChallengeField(atests[5], (byte)(maxDifficulty * df));
                                    }
                                }
                            }
                        }
                        else
                        {
                            float sum = abilityTestChance + giftChance;
                            if (v < abilityTestChance + giftChance)
                            {     // mysteria - changers
                                if (danger > 0.9f && mysteria > 0.5f && Random.value > 0.5f)
                                { // global changer -- INDEV
                                    challengeArray[x, y] = ChallengeField.emptyField;
                                }
                                else
                                { // local changer -- INDEV
                                    challengeArray[x, y] = ChallengeField.emptyField;
                                }
                            }
                            else
                            {
                                sum += mysteriaChance;
                                if (v < sum)
                                {
                                    //gift
                                    v = Random.value;
                                    if (v < 0.7f)
                                    {
                                        if (v < 0.5f)
                                        {
                                            challengeArray[x, y] = new ChallengeField(ChallengeType.Treasure, ChallengeField.TREASURE_EXP_CODE);
                                        }
                                        else
                                        {
                                            challengeArray[x, y] = new ChallengeField(ChallengeType.Treasure, ChallengeField.TREASURE_MONEY_CODE);
                                        }
                                    }
                                    else
                                    {
                                        if (v > 0.9f)
                                        {
                                            challengeArray[x, y] = new ChallengeField(ChallengeType.Treasure, ChallengeField.TREASURE_ARTIFACT_CODE);
                                        }
                                        else
                                        {
                                            challengeArray[x, y] = new ChallengeField(ChallengeType.Treasure, ChallengeField.TREASURE_RESOURCES_CODE);
                                        }
                                    }
                                }
                                else
                                { // puzzle parts
                                    v = (v - sum) / (1f - sum);
                                    if (v > 0.5f)
                                    {
                                        //details
                                        float redChance = 0.33f, greenChance = 0.33f, blueChance = 0.33f,
                                              cyanChance  = mysteria / 10f + difficulty / 10f,
                                              blackChance = difficulty / 50f,
                                              whiteChance = difficulty / 25f + Random.value * friendliness * 0.25f;
                                        sum = redChance + greenChance + blueChance + cyanChance + blueChance + whiteChance;

                                        v = (v - 0.5f) * 2f * sum;
                                        if (v < redChance + greenChance + blueChance)
                                        {
                                            if (v < redChance)
                                            {
                                                challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.REDCOLOR_CODE);
                                            }
                                            else
                                            {
                                                if (v < redChance + greenChance)
                                                {
                                                    challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.GREENCOLOR_CODE);
                                                }
                                                else
                                                {
                                                    challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.BLUECOLOR_CODE);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if (whiteChance == 0)
                                            {
                                                challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.CYANCOLOR_CODE);
                                            }
                                            else
                                            {
                                                if (v > redChance + greenChance + blueChance + whiteChance)
                                                {
                                                    challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.CYANCOLOR_CODE);
                                                }
                                                else
                                                {
                                                    challengeArray[x, y] = new ChallengeField(ChallengeType.PuzzlePart, Knowledge.WHITECOLOR_CODE);
                                                }
                                            }
                                        }
                                    }
                                    else
                                    { // route points
                                        challengeArray[x, y] = ProgressionMaster.GetRouteBoostCell(this, mysteria);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (v < mysteria)
                        {
                            challengeArray[x, y] = new ChallengeField(ChallengeType.Random, (byte)(maxDifficulty * df));
                        }
                        else
                        {
                            v = Random.value;
                            if (v < 0.66f)
                            {
                                if (v < 0.33f)
                                {
                                    challengeArray[x, y] = new ChallengeField(ChallengeType.CrystalFee, (byte)(15 * df));
                                }
                                else
                                {
                                    challengeArray[x, y] = new ChallengeField(ChallengeType.AscensionTest, (byte)(100 * df));
                                }
                            }
                            else
                            {
                                challengeArray[x, y] = ChallengeField.impassableField;
                            }
                        }
                    }
                }
                else
                {
                    v = (v - richness) / (1f - richness);
                    if (v > danger & Random.value < 0.85f)
                    {
                        challengeArray[x, y] = ChallengeField.emptyField;
                    }
                    else
                    {
                        challengeArray[x, y] = ChallengeField.impassableField;
                    }
                }
            }
        }

        //check
        int sz = size - 1;

        challengeArray[sz, sz].ChangeChallengeType(ChallengeType.ExitTest, (byte)(maxDifficulty * (0.3f + 0.3f * friendliness + 0.4f * danger)));
        challengeArray[0, 0] = ChallengeField.emptyField;

        int prevY = 0, ystep;

        for (int i = 1; i < size; i++)
        {
            v = Random.value;
            if (v <= 0.5f)
            {
                ystep = 1;
            }
            else
            {
                if (v >= 0.8f)
                {
                    ystep = -1;
                }
                else
                {
                    ystep = 0;
                }
            }
            prevY += ystep;
            if (prevY < 0)
            {
                if (Random.value > 0.5f)
                {
                    prevY = 1;
                }
                else
                {
                    prevY = 0;
                }
            }
            else
            {
                if (prevY >= size)
                {
                    if (Random.value > 0.5f)
                    {
                        prevY = sz - 1;
                    }
                    else
                    {
                        prevY = sz;
                    }
                }
            }
        }

        if (challengeArray[sz - 1, sz].IsImpassable() && challengeArray[sz - 1, sz - 1].IsImpassable() && challengeArray[sz, sz - 1].IsImpassable())
        {
            challengeArray[sz - 1, sz - 1] = ChallengeField.emptyField;
        }
        if (challengeArray[1, 0].IsImpassable() && challengeArray[1, 1].IsImpassable() && challengeArray[0, 1].IsImpassable())
        {
            challengeArray[1, 1] = ChallengeField.emptyField;
        }
    }