#11
|
|||
|
|||
Thankyou Octocat. I known how random.next works, but I chose to go with the RNGCryptoServiceProvider rather than the Random class because I feel it gives me "better" random numbers. Anyone using the script is welcome to replace the NextInt routine with the random class as suggested.
__________________
When one engine fails on a two engine bomber, you will always have enough power left to get to the scene of the crash. Get the latest COD Team Fusion patch info HERE |
#12
|
|||
|
|||
My variant with RNGCryptoServiceProvider
- Code slightly reduced and refactored - Added minutes randomization - Fixed maxValue problem (random.Next always return value by 1 less then the specified maximum) Code:
using System; using maddox.game; using System.Security.Cryptography; public class Mission : AMission { public override void OnBattleInit() { RandomiseMission(); } internal ISectionFile RandomiseMission() { // initialize a new instance of the Random class var provider = new RNGCryptoServiceProvider(); var buffer = new byte[4]; provider.GetBytes(buffer); var random = new Random(BitConverter.ToInt32(buffer, 0)); //time of day bool RandomiseTime = true; int minTime = 6; // 6am int maxTime = 17; // 5pm // WeatherIndex bool RandomiseWeatherIndex = true; int minWeatherIndex = 0; // clear int maxWeatherIndex = 2; // medium clouds // cloud height bool RandomiseClouds = true; int minClouds = 500; // 500m int maxClouds = 1500; // 1500m // BreezeActivity bool RandomiseBreezeActivity = true; int minBreezeActivity = 0; // zero breeze int maxBreezeActivity = 10; // max breeze // ThermalActivity bool RandomiseThermalActivity = true; int minThermalActivity = 0; // zero thermals int maxThermalActivity = 10; // max thermals ISectionFile secfile = GamePlay.gpCreateSectionFile(); // time of day if (RandomiseTime == true) { string value = (random.Next(minTime * 100, maxTime * 100) / 100f).ToString(); secfile.add("MAIN", "TIME", value); } // WeatherIndex if (RandomiseWeatherIndex == true) { string value = random.Next(minWeatherIndex, maxWeatherIndex + 1).ToString(); secfile.add("MAIN", "WeatherIndex", value); } // clouds if (RandomiseClouds == true) { string value = random.Next(minClouds, maxClouds + 1).ToString(); secfile.add("MAIN", "CloudsHeight", value); } // minBreezeActivity if (RandomiseBreezeActivity == true) { string value = random.Next(minBreezeActivity, maxBreezeActivity + 1).ToString(); secfile.add("MAIN", "BreezeActivity", value); } // ThermalActivity if (RandomiseThermalActivity == true) { string value = random.Next(minThermalActivity, maxThermalActivity + 1).ToString(); secfile.add("MAIN", "ThermalActivity", value); } // This post loads the section file secfile into the current battle. // It's also possible to save the section file secfile first by secfile.save("filename") and then // call GamePlay.gpPostMissionLoad("filename"); if you want to save the randomised file // on your hard disk. GamePlay.gpPostMissionLoad(secfile); return secfile; } } Last edited by Octocat; 12-08-2011 at 04:28 PM. |
#13
|
|||
|
|||
OK, I see what you've done. One declaration of var provider = new RNGCryptoServiceProvider(); Much better Thankyou.
1. I've moved the Random Class declaration outside the randomisemission routine so it can also be used in the randomisation of mission selection etc. (see below). But this construct produces an error CS1519: Invalid token '(' in class, struct, or interface member declaration on the provider.GetBytes(buffer); line. pehaps you can help? code removed by author 2. Multiplayer implimentation This script randomised the [MAIN] section of the mission file OK in single-player mode, but fails in multi-player(server) mode. I have in mind some pseudo code such as: Randomise [MAIN] on server battle start; save [MAIN] section file on the server side; as players connect reload the saved [MAIN] section file from server side so they get the same mission parameters in multi-player mode.
__________________
When one engine fails on a two engine bomber, you will always have enough power left to get to the scene of the crash. Get the latest COD Team Fusion patch info HERE Last edited by salmo; 10-18-2012 at 10:32 AM. |
#14
|
|||
|
|||
Yes, because dynamic type resolution "var x = " works in functions only, and calls like "provider.GetBytes(buffer)" too.
In your case better to use constructor, to bury inside all temporary instances like "buffer" and "provider", when they perform their task. For example: Code:
using System; using maddox.game; using System.Security.Cryptography; public class Mission : AMission { // allowed to change only in constructor private readonly Random m_random; // Constructor (do not call manually) public Mission() { // initialize a new instance of the Random class var provider = new RNGCryptoServiceProvider(); var buffer = new byte[4]; provider.GetBytes(buffer); m_random = new Random(BitConverter.ToInt32(buffer, 0)); } public override void OnBattleInit() { RandomiseMission(); } internal ISectionFile RandomiseMission() { //time of day bool RandomiseTime = true; int minTime = 6; // 6am int maxTime = 17; // 5pm // WeatherIndex bool RandomiseWeatherIndex = true; int minWeatherIndex = 0; // clear int maxWeatherIndex = 2; // medium clouds // cloud height bool RandomiseClouds = true; int minClouds = 500; // 500m int maxClouds = 1500; // 1500m // BreezeActivity bool RandomiseBreezeActivity = true; int minBreezeActivity = 0; // zero breeze int maxBreezeActivity = 10; // max breeze // ThermalActivity bool RandomiseThermalActivity = true; int minThermalActivity = 0; // zero thermals int maxThermalActivity = 10; // max thermals ISectionFile secfile = GamePlay.gpCreateSectionFile(); // time of day if (RandomiseTime == true) { string value = (m_random.Next(minTime * 100, (maxTime) * 100) / 100f).ToString(); secfile.add("MAIN", "TIME", value); } // WeatherIndex if (RandomiseWeatherIndex == true) { string value = m_random.Next(minWeatherIndex, maxWeatherIndex + 1).ToString(); secfile.add("MAIN", "WeatherIndex", value); } // clouds if (RandomiseClouds == true) { string value = m_random.Next(minClouds, maxClouds + 1).ToString(); secfile.add("MAIN", "CloudsHeight", value); } // minBreezeActivity if (RandomiseBreezeActivity == true) { string value = m_random.Next(minBreezeActivity, maxBreezeActivity + 1).ToString(); secfile.add("MAIN", "BreezeActivity", value); } // ThermalActivity if (RandomiseThermalActivity == true) { string value = m_random.Next(minThermalActivity, maxThermalActivity + 1).ToString(); secfile.add("MAIN", "ThermalActivity", value); } // This post loads the section file secfile into the current battle. // It's also possible to save the section file secfile first by secfile.save("filename") and then // call GamePlay.gpPostMissionLoad("filename"); if you want to save the randomised file // on your hard disk. GamePlay.gpPostMissionLoad(secfile); return secfile; } } Last edited by Octocat; 12-09-2011 at 04:53 PM. |
|
|