public override void OnLoad(ConfigNode node) { ConfigNode[] goldStrikeNodes = GameDatabase.Instance.GetConfigNodes(kGoldStrikeDataNode); ConfigNode[] goldStrikeLodeNodes = node.GetNodes(kGoldStrikeLodeNode); ConfigNode[] asteroidsSearched = node.GetNodes(kAsteroidsSearched); debugLog("OnLoad: there are " + goldStrikeNodes.Length + " GOLDSTRIKE items to load."); foreach (ConfigNode goldStrikeDataNode in goldStrikeNodes) { GoldStrikeData strikeData = new GoldStrikeData(); strikeData.Load(goldStrikeDataNode); if (string.IsNullOrEmpty(strikeData.resourceName) == false) { goldStrikeResources.Add(strikeData.resourceName, strikeData); } } debugLog("OnLoad: there are " + goldStrikeLodeNodes.Length + " GoldStrikeLode items to load."); foreach (ConfigNode goldStrikeLodeNode in goldStrikeLodeNodes) { GoldStrikeLode lode = new GoldStrikeLode(); Dictionary <string, GoldStrikeLode> lodeMap = null; string planetBiomeKey, lodeKey; lode.Load(goldStrikeLodeNode); planetBiomeKey = lode.planetID.ToString() + lode.biome; if (goldStrikeLodes.ContainsKey(planetBiomeKey) == false) { lodeMap = new Dictionary <string, GoldStrikeLode>(); goldStrikeLodes.Add(planetBiomeKey, lodeMap); } lodeMap = goldStrikeLodes[planetBiomeKey]; //Add the new lode lodeKey = lode.longitude.ToString() + lode.lattitude.ToString() + lode.resourceName; lodeMap.Add(lodeKey, lode); } debugLog("OnLoad: there are " + asteroidsSearched.Length + " asteroids that have been prospected."); foreach (ConfigNode asteroidNode in asteroidsSearched) { prospectedAsteroids.Add(asteroidNode.GetValue(kName)); } }
public override void OnLoad(ConfigNode node) { ConfigNode[] goldStrikeDataNodes = GameDatabase.Instance.GetConfigNodes(kGoldStrikeDataNode); ConfigNode[] goldStrikeLodeNodes = node.GetNodes(kGoldStrikeLodeNode); ConfigNode[] asteroidsSearched = node.GetNodes(kAsteroidsSearched); debugLog("OnLoad: there are " + goldStrikeDataNodes.Length + " GOLDSTRIKE items to load."); foreach (ConfigNode goldStrikeDataNode in goldStrikeDataNodes) { GoldStrikeData strikeData = new GoldStrikeData(); strikeData.Load(goldStrikeDataNode); if (string.IsNullOrEmpty(strikeData.resourceName) == false) { goldStrikeResources.Add(strikeData.resourceName, strikeData); } } //Load our data loadGoldStrokeLodes(goldStrikeLodeNodes); loadAsteroidNodes(asteroidsSearched); //Backwards compatibility: Load from Pathfinder if (goldStrikeNodes != null) { ConfigNode[] nodes = null; if (goldStrikeNodes.ContainsKey(WBIGoldStrikeScenario.kGoldStrikeLodeNode)) { nodes = goldStrikeNodes[WBIGoldStrikeScenario.kGoldStrikeLodeNode]; loadGoldStrokeLodes(nodes); } if (goldStrikeNodes.ContainsKey(WBIGoldStrikeScenario.kAsteroidsSearched)) { nodes = goldStrikeNodes[WBIGoldStrikeScenario.kAsteroidsSearched]; loadAsteroidNodes(nodes); } //Cleanup goldStrikeNodes = null; } }
public override void OnLoad(ConfigNode node) { base.OnLoad(node); ConfigNode[] efficiencyNodes = node.GetNodes(kEfficiencyData); ConfigNode[] toolTipsShown = node.GetNodes(kToolTip); ConfigNode[] goldStrikeNodes = GameDatabase.Instance.GetConfigNodes(kGoldStrikeDataNode); ConfigNode[] goldStrikeLodeNodes = node.GetNodes(kGoldStrikeLodeNode); ConfigNode[] strikeChances = node.GetNodes(kGoldStrikeChance); string value = node.GetValue(kReputationIndex); GoldStrikeChance chance = null; if (string.IsNullOrEmpty(value) == false) { reputationIndex = int.Parse(value); } debugLog("OnLoad: there are " + goldStrikeNodes.Length + " GOLDSTRIKE items to load."); foreach (ConfigNode goldStrikeDataNode in goldStrikeNodes) { GoldStrikeData strikeData = new GoldStrikeData(); strikeData.Load(goldStrikeDataNode); if (string.IsNullOrEmpty(strikeData.resourceName) == false) { goldStrikeResources.Add(strikeData.resourceName, strikeData); } } debugLog("OnLoad: there are " + goldStrikeLodeNodes.Length + " GoldStrikeLode items to load."); foreach (ConfigNode goldStrikeLodeNode in goldStrikeLodeNodes) { GoldStrikeLode lode = new GoldStrikeLode(); Dictionary <string, GoldStrikeLode> lodeMap = null; string planetBiomeKey, lodeKey; lode.Load(goldStrikeLodeNode); planetBiomeKey = lode.planetID.ToString() + lode.biome; if (goldStrikeLodes.ContainsKey(planetBiomeKey) == false) { lodeMap = new Dictionary <string, GoldStrikeLode>(); goldStrikeLodes.Add(planetBiomeKey, lodeMap); } lodeMap = goldStrikeLodes[planetBiomeKey]; //Add the new lode lodeKey = lode.longitude.ToString() + lode.lattitude.ToString() + lode.resourceName; lodeMap.Add(lodeKey, lode); } debugLog("OnLoad: there are " + strikeChances.Length + " GoldStrikeChance items to load."); foreach (ConfigNode chanceNode in strikeChances) { chance = new GoldStrikeChance(); chance.Load(chanceNode); string planetBiomeKey = chance.planetID.ToString() + chance.biome; goldStrikeChances.Add(planetBiomeKey, chance); } foreach (ConfigNode efficiencyNode in efficiencyNodes) { EfficiencyData efficiencyData = new EfficiencyData(); efficiencyData.Load(efficiencyNode); efficiencyDataMap.Add(efficiencyData.Key, efficiencyData); } foreach (ConfigNode toolTipNode in toolTipsShown) { if (toolTipNode.HasValue(kName) == false) { continue; } value = toolTipNode.GetValue(kName); if (toolTips.ContainsKey(value)) { toolTips[value] = toolTipNode; } else { toolTips.Add(value, toolTipNode); } } }
public void CheckGoldStrike() { string[] strikeResourceKeys = null; int resourceIndex; GoldStrikeData strikeData = null; WBIGoldStrikeScenario scenario = WBIGoldStrikeScenario.Instance; string resourceName = string.Empty; double resourceAmount = 0f; float analysisRoll = 0f; float successTargetNumber = prospectChance; string navigationID = string.Empty; GoldStrikeLode lode = null; string biomeName = string.Empty; int planetID = -1; //Do we have a valid situation? if (SituationIsValid() == false) { return; } //Update our location. asteroid = this.part.vessel.FindPartModuleImplementing <ModuleAsteroid>(); GoldStrikeUtils.GetBiomeAndPlanet(out biomeName, out planetID, this.part.vessel, asteroid); vesselModule.UpdateLastProspectLocation(); //Time to see if we find anything. //prospectChance: base chance to find a prospect. Some parts are better than others. //prospectBonus: Various situations contribute to the success of the attempt. successTargetNumber = 100 - (prospectChance + GetProspectBonus()); debugLog("successTargetNumber: " + successTargetNumber); //Roll the chance and check it. analysisRoll = UnityEngine.Random.Range(1, 100); debugLog("analysisRoll: " + analysisRoll); //If we didn't succeed then we're done. if (analysisRoll < successTargetNumber && !WBIGoldStrikeScenario.debugProspectAlwaysSuccessful) { debugLog("Prospect failed; didn't roll high enough."); ScreenMessages.PostScreenMessage("Nothing of value here, try another location. ", kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); return; } //Success! Get the resource name and strike data. //If we're near an anomaly then we need a roll table. if (anomalyBonus > 0) { SortedDictionary <int, GoldStrikeData> sortedResources = new SortedDictionary <int, GoldStrikeData>(); int resourceCount = prospectResources.Count; //Add any resources that have an anomaly chance into the sorted resources for (int index = 0; index < resourceCount; index++) { strikeData = prospectResources[index]; if (strikeData.anomalyChance > 0) { sortedResources.Add(strikeData.anomalyChance, strikeData); } } //Roll a 1-100 int pressenceRoll = UnityEngine.Random.Range(1, 100); //See if we have any strike data strikeData = null; foreach (KeyValuePair <int, GoldStrikeData> pair in sortedResources) { if (pressenceRoll < pair.Key) { strikeData = pair.Value; break; } } //If we don't have any strike data then pick a random resource if (strikeData == null) { resourceIndex = UnityEngine.Random.Range(0, resourceCount - 1); strikeData = prospectResources[resourceIndex]; resourceName = strikeData.resourceName; } } else { resourceIndex = UnityEngine.Random.Range(0, prospectResources.Count - 1); strikeData = prospectResources[resourceIndex]; resourceName = strikeData.resourceName; debugLog("prospectResources count: " + prospectResources.Count); debugLog("resourceIndex: " + resourceIndex); } debugLog("strikeData: " + strikeData.ToString()); //Play the jingle playJingle(); //Setup a planetary surface lode if (asteroid == null) { debugLog("Setting up surface lode"); //Now, generate the resource amount to add to the map resourceAmount = UnityEngine.Random.Range(strikeData.minAmount, strikeData.maxAmount); debugLog("resourceAmount: " + resourceAmount); //If we hit the motherlode then factor that in. //The motherloade is 5% of the target number. if (analysisRoll <= (successTargetNumber * kMotherlodeFactor)) { resourceAmount *= strikeData.motherlodeMultiplier; debugLog("resourceAmount after motherlode: " + resourceAmount); ScreenMessages.PostScreenMessage(string.Format("Congratulations! You found a {0:s} motherlode with {1:f2} units available to mine!", resourceName, resourceAmount), kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); } else { ScreenMessages.PostScreenMessage(string.Format("Congratulations! You found a {0:s} lode with {1:f2} units available to mine!", resourceName, resourceAmount), kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); } if (!string.IsNullOrEmpty(anomalyName)) { ScreenMessages.PostScreenMessage("Special cache found at " + anomalyName, kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); } debugLog("Adding new lode entry to " + FlightGlobals.currentMainBody.name + " with flight global index " + FlightGlobals.currentMainBody.flightGlobalsIndex); debugLog("Biome: " + biomeName); debugLog("Lon/Lat: " + this.part.vessel.longitude + "/" + this.part.vessel.latitude); lode = scenario.AddLode(planetID, biomeName, this.part.vessel.longitude, this.part.vessel.latitude, this.part.vessel.altitude, resourceName, resourceAmount); } //Setup an asteroid lode else { debugLog("Setting up asteroid lode"); float abundance = 0.01f; //Get the resource module for the lode. ModuleAsteroidResource lodeResource = null; ModuleAsteroidResource[] resourceModules = asteroid.part.FindModulesImplementing <ModuleAsteroidResource>().ToArray(); for (int index = 0; index < resourceModules.Length; index++) { if (resourceModules[index].resourceName == resourceName) { debugLog("ModuleAsteroidResource found for " + resourceName); lodeResource = resourceModules[index]; break; } } if (lodeResource == null) { debugLog("ModuleAsteroidResource NOT found for " + resourceName); return; } //Adjust abundance for motherlode if (analysisRoll <= (successTargetNumber * kMotherlodeFactor)) { abundance *= strikeData.motherlodeMultiplier; } debugLog("abundance increase: " + abundance); //Display appropriate message ScreenMessages.PostScreenMessage(string.Format("Congratulations! A careful scan of {0:s} has revealed an increased abundance of {1:s}", asteroid.AsteroidName, resourceName), kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); //Update resource module debugLog("Old abundance: " + lodeResource.abundance); lodeResource.abundance += abundance; lodeResource.displayAbundance += abundance; debugLog("New abundance: " + lodeResource.abundance); debugLog("Adding new lode entry for asteroid: " + asteroid.AsteroidName); lode = scenario.AddLode(asteroid, resourceName, lodeResource.displayAbundance); } //Update any drills in the area. scenario.UpdateDrillLodes(asteroid); //Set waypoint if (lode != null && asteroid == null) { setWaypoint(resourceName, lode); } }
public void CheckGoldStrike() { string[] strikeResourceKeys = null; int resourceIndex; GoldStrikeData strikeData = null; WBIPathfinderScenario scenario = WBIPathfinderScenario.Instance; string resourceName = string.Empty; double resourceAmount = 0f; float analysisRoll = 0f; float successTargetNumber = prospectChance; int chancesRemaining = 0; string navigationID = string.Empty; GoldStrikeLode lode = null; string biomeName = string.Empty; int planetID = -1; //Do we have gold strike resources? if (scenario.goldStrikeResources.Count() == 0) { ScreenMessages.PostScreenMessage("There are no Gold Strike resources to prospect!", kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); debugLog("No resources to prospect"); return; } //Do we have a valid situation? if (SituationIsValid() == false) { return; } //Ok, we can prospect at this location. GoldStrikeUtils.GetBiomeAndPlanet(out biomeName, out planetID, this.part.vessel, asteroid); setLastLocation(); chancesRemaining = updateChancesRemaining(); //Time to see if we find anything. //Tally up the % chance we have to make a successful prospect. //prospectChance: base chance to find a prospect. Some parts are better than others. //prospectSkillBonus: multiplied by the EVA prospector's skill level. Default is 1.0. //labBonus: For each Pathfinder geology lab in the vicinity, give one point per crew member staffing the lab that has the prospectSkill. //For each non-Pathfinder geology lab in the vicinity, give half a point per crew member staffing the lab that has the prospectSkill. //Chance = prospectChance + prospectSkillBonus + labBonus. //Ex: A 3-star scientist on EVA makes a prospect check. skillBonus = 3; prospectSkillBonus = 1.0. Total skill bonus = 3.0. //Inside the Bison are two scientists staffing a geology lab (non-pathfinder). labBonus = 2 * 0.5 = 1 //Gold Digger has a base 10% chance of finding a prospect. //successTargetNumber = 10 + 3 + 1 = 14. successTargetNumber = prospectChance + GetProspectBonus(); debugLog("Base chance to succeed: " + prospectChance); debugLog("successTargetNumber: " + successTargetNumber); //Roll the chance and check it. analysisRoll = UnityEngine.Random.Range(1, 6); analysisRoll += UnityEngine.Random.Range(1, 6); analysisRoll += UnityEngine.Random.Range(1, 6); analysisRoll *= 5.5556f; debugLog("analysisRoll: " + analysisRoll); //If we didn't succeed then we're done. if (analysisRoll > successTargetNumber) { debugLog("Prospect failed; didn't roll low enough."); ScreenMessages.PostScreenMessage("Nothing of value here, try another location. " + chancesRemaining + " chances remain in the " + biomeName, kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); return; } //Success! Get the resource name and strike data. strikeResourceKeys = scenario.goldStrikeResources.Keys.ToArray(); resourceIndex = UnityEngine.Random.Range(0, strikeResourceKeys.Length - 1); resourceName = strikeResourceKeys[resourceIndex]; strikeData = scenario.goldStrikeResources[resourceName]; debugLog("strikeResourceKeys count: " + strikeResourceKeys.Length); debugLog("resourceIndex: " + resourceIndex); debugLog("strikeData: " + strikeData.ToString()); //Now, generate the resource amount to add to the map resourceAmount = UnityEngine.Random.Range(strikeData.minAmount, strikeData.maxAmount); debugLog("resourceAmount: " + resourceAmount); //If we hit the motherlode then factor that in. //The motherloade is 5% of the target number. if (analysisRoll <= (successTargetNumber * kMotherlodeFactor)) { resourceAmount *= strikeData.motherlodeMultiplier; debugLog("resourceAmount after motherlode: " + resourceAmount); ScreenMessages.PostScreenMessage(string.Format("Congratulations! You found a {0:s} motherlode with {1:f2} units available to mine!", resourceName, resourceAmount), kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); } else { ScreenMessages.PostScreenMessage(string.Format("Congratulations! You found a {0:s} lode with {1:f2} units available to mine!", resourceName, resourceAmount), kMessageDisplayTime, ScreenMessageStyle.UPPER_CENTER); } ScreenMessages.PostScreenMessage(chancesRemaining + " chances remain to find another lode in the " + biomeName, kMessageDisplayTime, ScreenMessageStyle.UPPER_LEFT); //Play the jingle playJingle(); //Now set up the lode debugLog("Adding new lode entry to " + FlightGlobals.currentMainBody.name + " with flight global index " + FlightGlobals.currentMainBody.flightGlobalsIndex); debugLog("Biome: " + biomeName); debugLog("Lon/Lat: " + this.part.vessel.longitude + "/" + this.part.vessel.latitude); lode = scenario.AddLode(planetID, biomeName, this.part.vessel.longitude, this.part.vessel.latitude, resourceName, resourceAmount); //Set waypoint if (lode != null) { setWaypoint(resourceName, lode); } }