Show whole topic Jun 14, 2009 5:33 pm
mague Offline
Developer
Registered since: Dec 29, 2007
Location: Hungary


Subject: Re: Ressource-Algorythm
Thanks for your kind words, Sal Smiling

Here is the next step, for the Resource generation algorithm. This is a function from MAX v1.04 retail. The values are taken from the executable, and they are accurate:

DownloadSource code (Text):
  1. // int func_SetIniParameterValue(ini_param_index, value); // only a wrapper function for the true handler function
  2. // int func_GetParameterFromIniFile(ini_param_index); // only a wrapper function for the true handler function
  3.  
  4. int __cdecl func_SetFactorsForResourceMapGeneration()
  5. {
  6.   int result;
  7.   int v1;  // unknown
  8.   signed int MinResources;
  9.   signed int MaxResources;
  10.   int RawResourceMode;
  11.   int RawResourceModeCopy;
  12.   int FuelResourceMode;
  13.   int FuelResourceModeCopy;
  14.   int UsedResourceTypes;
  15.   int GoldResourceMode;
  16.   int GoldResourceModeCopy;
  17.   signed int AlienDerelictsMode;
  18.  
  19.   MinResources = 1;
  20.   MaxResources = 15;
  21.   RawResourceMode = func_GetParameterFromIniFile(77);  // raw_resource - default value: 1
  22.   if ( (unsigned int)RawResourceMode < 1 )
  23.   {
  24.     if ( !RawResourceMode )                                     // raw_resource == 0 (poor)
  25.     {
  26.       func_SetIniParameterValue(9, 0);     // raw_normal_low - default value: 0
  27.       func_SetIniParameterValue(10, 3);    // raw_normal_high - default value: 5
  28.       func_SetIniParameterValue(11, 8);    // raw_concentrate_low - default value: 13
  29.       func_SetIniParameterValue(12, 12);   // raw_concentrate_high - default value: 16
  30.       func_SetIniParameterValue(13, 28);   // raw_concentrate_seperation - default value: 23
  31.       func_SetIniParameterValue(14, 6);    // raw_concentrate_diffusion - default value: 6
  32.     }
  33.   }
  34.   else
  35.   {
  36.     if ( (unsigned int)RawResourceMode <= 1 )  // raw_resource == 1 (medium)
  37.     {
  38.       func_SetIniParameterValue(9, 0);
  39.       func_SetIniParameterValue(10, 5);
  40.       func_SetIniParameterValue(11, 13);
  41.       func_SetIniParameterValue(12, 16);
  42.       func_SetIniParameterValue(13, 23);
  43.       func_SetIniParameterValue(14, 5);
  44.     }
  45.     else
  46.     {
  47.       if ( RawResourceMode == 2 )  // raw_resource == 2 (rich)
  48.       {
  49.         func_SetIniParameterValue(9, 1);
  50.         func_SetIniParameterValue(10, 5);
  51.         func_SetIniParameterValue(11, 16);
  52.         func_SetIniParameterValue(12, 16);
  53.         func_SetIniParameterValue(13, 19);
  54.         func_SetIniParameterValue(14, 4);
  55.       }
  56.     }
  57.   }
  58.   RawResourceModeCopy = func_GetParameterFromIniFile(77);
  59.   if ( (unsigned int)RawResourceModeCopy < 1 )
  60.   {
  61.     if ( !RawResourceModeCopy )
  62.     {
  63.       MinResources += 3;
  64.       ++MaxResources;
  65.     }
  66.   }
  67.   else
  68.   {
  69.     if ( (unsigned int)RawResourceModeCopy <= 1 )
  70.     {
  71.       MinResources += 5;
  72.       MaxResources += 2;
  73.     }
  74.     else
  75.     {
  76.       if ( RawResourceModeCopy == 2 )
  77.       {
  78.         MinResources += 6;
  79.         MaxResources += 3;
  80.       }
  81.     }
  82.   }
  83.   FuelResourceMode = func_GetParameterFromIniFile(78);  // fuel_resource - default value: 1
  84.   if ( (unsigned int)FuelResourceMode < 1 )
  85.   {
  86.     if ( !FuelResourceMode )  // fuel_resource == 0 (poor)
  87.     {
  88.       func_SetIniParameterValue(15, 1);  // fuel_normal_low - default value: 2
  89.       func_SetIniParameterValue(16, 2);  // fuel_normal_high - default value: 3
  90.       func_SetIniParameterValue(17, 8);    // fuel_concentrate_low - default value: 12
  91.       func_SetIniParameterValue(18, 12);   // fuel_concentrate_high - default value: 16
  92.       func_SetIniParameterValue(19, 29);   // fuel_concentrate_seperation - default value: 24
  93.       func_SetIniParameterValue(20, 6);    // raw_concentrate_diffusion - default value: 5
  94.     }
  95.   }
  96.   else
  97.   {
  98.     if ( (unsigned int)FuelResourceMode <= 1 )   // fuel_resource == 1 (medium)
  99.     {
  100.       func_SetIniParameterValue(15, 2);
  101.       func_SetIniParameterValue(16, 3);
  102.       func_SetIniParameterValue(17, 12);
  103.       func_SetIniParameterValue(18, 16);
  104.       func_SetIniParameterValue(19, 24);
  105.       func_SetIniParameterValue(20, 5);
  106.     }
  107.     else
  108.     {
  109.       if ( FuelResourceMode == 2 )   // fuel_resource == 2 (rich)
  110.       {
  111.         func_SetIniParameterValue(15, 2);
  112.         func_SetIniParameterValue(16, 4);
  113.         func_SetIniParameterValue(17, 16);
  114.         func_SetIniParameterValue(18, 16);
  115.         func_SetIniParameterValue(19, 20);
  116.         func_SetIniParameterValue(20, 4);
  117.       }
  118.     }
  119.   }
  120.   FuelResourceModeCopy = func_GetParameterFromIniFile(78);
  121.   if ( (unsigned int)FuelResourceModeCopy < 1 )
  122.   {
  123.     if ( !FuelResourceModeCopy )
  124.     {
  125.       MinResources += 2;
  126.       ++MaxResources;
  127.     }
  128.   }
  129.   else
  130.   {
  131.     if ( (unsigned int)FuelResourceModeCopy <= 1 )
  132.     {
  133.       MinResources += 3;
  134.       MaxResources += 2;
  135.     }
  136.     else
  137.     {
  138.       if ( FuelResourceModeCopy == 2 )
  139.       {
  140.         MinResources += 4;
  141.         MaxResources += 3;
  142.       }
  143.     }
  144.   }
  145.   func_GetParameterFromIniFile(77);  // raw_resource - default value: 1
  146.   UsedResourceTypes = func_GetParameterFromIniFile(78) + v1;    // fuel_resource - default value: 1
  147. // NOTE:          UsedResourceTypes might be something else... not sure of it.
  148. // NOTE:                                                                         <- v1 possibly holds the RetVal of the previous function call.
  149.  
  150.   if ( (unsigned int)UsedResourceTypes <= 4 )
  151.   {
  152.     switch ( UsedResourceTypes )
  153.     {
  154.       case 0:   // mixed_resource_seperation - default value: 40
  155.         func_SetIniParameterValue(27, 49);
  156.         break;
  157.       case 1:
  158.         func_SetIniParameterValue(27, 44);
  159.         break;
  160.       case 2:
  161.         func_SetIniParameterValue(27, 40);
  162.         break;
  163.       case 3:
  164.         func_SetIniParameterValue(27, 36);
  165.         break;
  166.       case 4:
  167.         func_SetIniParameterValue(27, 33);
  168.         break;
  169.     }
  170.   }
  171.   GoldResourceMode = func_GetParameterFromIniFile(79); // gold_resource - default value: 1
  172.   if ( (unsigned int)GoldResourceMode < 1 )
  173.   {
  174.     if ( !GoldResourceMode )  // gold_resource == 0 (poor)
  175.     {
  176.       func_SetIniParameterValue(21, 0);  // gold_normal_low - default value: 0
  177.       func_SetIniParameterValue(22, 0);   // gold_normal_high - default value: 0
  178.       func_SetIniParameterValue(23, 5);  // gold_concentrate_low - default value: 10
  179.       func_SetIniParameterValue(24, 9);   // gold_concentrate_high - default value: 16
  180.       func_SetIniParameterValue(25, 39);  // gold_concentrate_seperation - default value: 32
  181.       func_SetIniParameterValue(26, 6);    // gold_concentrate_diffusion - default value: 5
  182.     }
  183.   }
  184.   else
  185.   {
  186.     if ( (unsigned int)GoldResourceMode <= 1 )  // gold_resource == 1 (medium)
  187.     {
  188.       func_SetIniParameterValue(21, 0);
  189.       func_SetIniParameterValue(22, 0);
  190.       func_SetIniParameterValue(23, 8);
  191.       func_SetIniParameterValue(24, 12);
  192.       func_SetIniParameterValue(25, 32);
  193.       func_SetIniParameterValue(26, 5);
  194.     }
  195.     else
  196.     {
  197.       if ( GoldResourceMode == 2 )    // gold_resource == 2 (rich)
  198.       {
  199.         func_SetIniParameterValue(21, 0);
  200.         func_SetIniParameterValue(22, 1);
  201.         func_SetIniParameterValue(23, 12);
  202.         func_SetIniParameterValue(24, 16);
  203.         func_SetIniParameterValue(25, 26);
  204.         func_SetIniParameterValue(26, 4);
  205.       }
  206.     }
  207.   }
  208.   GoldResourceModeCopy = func_GetParameterFromIniFile(79);
  209.   if ( (unsigned int)GoldResourceModeCopy < 1 )
  210.   {
  211.     !GoldResourceModeCopy;
  212.   }
  213.   else
  214.   {
  215.     if ( (unsigned int)GoldResourceModeCopy <= 1 )
  216.     {
  217.       ++MaxResources;
  218.     }
  219.     else
  220.     {
  221.       if ( GoldResourceModeCopy == 2 )
  222.       {
  223.         ++MinResources;
  224.         MaxResources += 2;
  225.       }
  226.     }
  227.   }
  228.   func_SetIniParameterValue(28, (signed __int16)MinResources);  // min_resources - default value: 9
  229.   func_SetIniParameterValue(29, (signed __int16)MaxResources);  // max_resources - default value: 20
  230.   result = func_GetParameterFromIniFile(80);   // alien_derelicts - default value: 0
  231.   AlienDerelictsMode = result;
  232.   if ( (unsigned int)AlienDerelictsMode < 1 )
  233.   {
  234.     if ( !AlienDerelictsMode )   // alien_derelicts == 0 (none)
  235.       result = func_SetIniParameterValue(44, 0);
  236.   }
  237.   else
  238.   {
  239.     if ( (unsigned int)AlienDerelictsMode <= 1 )   // alien_derelicts == 1 (rare)
  240.     {
  241.       func_SetIniParameterValue(43, 65);       // alien_seperation - default value: 60
  242.       result = func_SetIniParameterValue(44, 20);   // alien_unit_value - default value: 0
  243.     }
  244.     else
  245.     {
  246.       if ( AlienDerelictsMode == 2 )   // alien_derelicts == 2 (common)
  247.       {
  248.         func_SetIniParameterValue(43, 50);
  249.         result = func_SetIniParameterValue(44, 30);
  250.       }
  251.     }
  252.   }
  253.   return result;
  254. }

This function shows us, how the Resource Levels (poor, medium, rich) affects the Resource Generator algorithm's inner parameters. Also, the min/max resource calculation is present in this code snippet. The mixed_resource_seperation is simply set, not calculated (this part is not 100% proper code, I'm missing something there).

I hope the next step is the Resource Map generator algorithm it self.

best regards,
mague
Tamas Kleiber
Branch or not to branch, that is the question! Unlocking your destiny is only one LSB away Happy JE 0x74 <-> JNE 0x75