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); }
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; }
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; } }