public void Load(System.IO.Stream fs) { int LENGTH = 18; var data = new byte[LENGTH]; fs.Read(data, 0, LENGTH); richness = System.BitConverter.ToSingle(data, 0); danger = System.BitConverter.ToSingle(data, 4); mysteria = System.BitConverter.ToSingle(data, 8); friendliness = System.BitConverter.ToSingle(data, 12); path = (Path)data[16]; if (data[17] == 1) { int size = fs.ReadByte(); challengeArray = ChallengeField.Load(fs, size); } }
public static ChallengeField[,] Load(System.IO.Stream fs, int size) { var cfa = new ChallengeField[size, size]; const int length = 4; var data = new byte[length]; ChallengeField cf; for (var i = 0; i < size; i++) { for (var j = 0; j < size; j++) { fs.Read(data, 0, length); cf = new ChallengeField((ChallengeType)data[0], data[1]); cf.isHidden = data[2] == 1; cf.isPassed = data[3] == 1; cfa[i, j] = cf; } } return(cfa); }
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; } }
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 ChallengeType[] ctypes = new ChallengeType[3]; bool moreMystic = mysteria > 0.5f, moreSpecific = false; switch (type) { case MapMarkerType.Station: { moreSpecific = friendliness > 0.5f; ctypes[0] = ChallengeType.CrystalPts; ctypes[1] = ChallengeType.MonumentPts; ctypes[2] = ChallengeType.FoundationPts; break; } case MapMarkerType.Wreck: { moreSpecific = difficulty > 0.5f; ctypes[0] = ChallengeType.EnginePts; ctypes[1] = ChallengeType.PollenPts; ctypes[2] = ChallengeType.CloudWhalePts; break; } case MapMarkerType.Island: { moreSpecific = richness > 0.5f; ctypes[0] = ChallengeType.BlossomPts; ctypes[1] = ChallengeType.PollenPts; ctypes[2] = ChallengeType.CloudWhalePts; break; } case MapMarkerType.SOS: { moreSpecific = danger > 0.5f; ctypes[0] = ChallengeType.CloudWhalePts; ctypes[1] = ChallengeType.EnginePts; ctypes[2] = ChallengeType.PipesPts; break; } case MapMarkerType.Portal: { moreSpecific = difficulty > 0.5f; ctypes[0] = ChallengeType.PipesPts; ctypes[1] = ChallengeType.CrystalPts; ctypes[2] = ChallengeType.EnginePts; break; } case MapMarkerType.Colony: { moreSpecific = richness > 0.5f; ctypes[0] = ChallengeType.FoundationPts; ctypes[1] = ChallengeType.MonumentPts; ctypes[2] = ChallengeType.CrystalPts; break; } case MapMarkerType.Wiseman: { moreSpecific = friendliness < 0.5f; ctypes[0] = ChallengeType.PollenPts; ctypes[1] = ChallengeType.PipesPts; ctypes[2] = ChallengeType.BlossomPts; break; } case MapMarkerType.Wonder: { moreSpecific = Random.value > 0.5f; ctypes[0] = ChallengeType.MonumentPts; ctypes[1] = ChallengeType.BlossomPts; ctypes[2] = ChallengeType.FoundationPts; break; } case MapMarkerType.Star: case MapMarkerType.QuestMark: case MapMarkerType.Resources: case MapMarkerType.FlyingExpedition: case MapMarkerType.Unknown: case MapMarkerType.MyCity: { moreSpecific = true; v *= 2f; if (v > 0.5f) { if (v < 0.25f) { ctypes[0] = ChallengeType.FoundationPts; } else { ctypes[0] = ChallengeType.EnginePts; } } else { if (v > 0.75f) { ctypes[0] = ChallengeType.BlossomPts; } else { ctypes[0] = ChallengeType.CrystalPts; } } ctypes[1] = Random.value > 0.5f ? ChallengeType.CloudWhalePts : ChallengeType.MonumentPts; ctypes[2] = Random.value > 0.5f ? ChallengeType.PipesPts : ChallengeType.PollenPts; break; } } byte val = (byte)(1f + richness / 0.25f + difficulty / 0.25f); if (moreMystic & moreSpecific) { if (v < 0.4f) { challengeArray[x, y] = new ChallengeField(ctypes[0], val); } else { if (v > 0.7f) { challengeArray[x, y] = new ChallengeField(ctypes[1], val); } else { challengeArray[x, y] = new ChallengeField(ctypes[2], val); } } } else { if (v < 0.4f) { challengeArray[x, y] = new ChallengeField(ctypes[0], val); } else { if (moreMystic) { challengeArray[x, y] = new ChallengeField(ctypes[1], val); } else { challengeArray[x, y] = new ChallengeField(ctypes[2], val); } } } } } } } } 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)(255 * 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; } }