Advertisement
Redxone

(C++) Doom RNG calculator

Aug 9th, 2019
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. unsigned char rndtable[256] = {
  6.     0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66 ,
  7.     74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36 ,
  8.     95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188 ,
  9.     52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224 ,
  10.     149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242 ,
  11.     145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0 ,
  12.     175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235 ,
  13.     25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113 ,
  14.     94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75 ,
  15.     136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196 ,
  16.     135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113 ,
  17.     80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241 ,
  18.     24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224 ,
  19.     145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95 ,
  20.     28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226 ,
  21.     71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36 ,
  22.     17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106 ,
  23.     197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136 ,
  24.     120, 163, 236, 249
  25. };
  26.  
  27. int prndindex = 0;
  28.  
  29. // Argument bitfield
  30. // Bit 0 = Display rolls;
  31. // Bit 1 = Display average;
  32. // Bit 2 = Lowest roll, highest roll;
  33. unsigned char arguments = 0b00000000;
  34.  
  35. struct RNGObject
  36. {
  37.         int base, max, roll, look;
  38. };
  39.  
  40. int P_Random (void)
  41. {
  42.     prndindex = (prndindex+1)&0xff;
  43.     return rndtable[prndindex];
  44. }
  45.  
  46.  
  47. double brute_prob(int base, int to, int rolls, int dresult)
  48. {
  49.         int success = 0;
  50.         int rollsum = 0;
  51.         int average = 0;
  52.         unsigned int lowroll  = 0xFFFFFFFF;
  53.         unsigned int highroll = 0;
  54.         for(int i = 0; i < 256; i++)
  55.         {
  56.                 for(int i = 0; i < rolls; i++) rollsum += base * ( (P_Random()%to) + 1 );
  57.                 if(arguments & 1) printf("[%i] Rolled: %d \n", i, rollsum);
  58.                 if(rollsum <  lowroll) lowroll = rollsum;
  59.                 if(rollsum > highroll) highroll = rollsum;
  60.                 if( rollsum < dresult ) success ++;
  61.                 average += rollsum;
  62.                 rollsum = 0;
  63.         }
  64.         if(arguments & 2) printf("Average Roll: %f\n", (double)average / 256.0 );
  65.         if(arguments & 1<<2)
  66.         {
  67.                 printf("Lowest : %d\n",  lowroll);
  68.                 printf("Highest: %d\n", highroll);
  69.         }
  70.         return ( (double)success / 256.0 ) * 100.0;
  71. }
  72.  
  73.  
  74. // Parse RNG formula input, split at semi-colons.
  75. RNGObject Parse_FInput(std::string* input)
  76. {
  77.         int output[4] = {0,0,0,0};
  78.         int index = 0;
  79.         size_t pos;
  80.         while( (pos = input->find(".")) != -1 )
  81.         {
  82.                 output[index] = strtol(input->substr(0,pos).c_str(),NULL,10);
  83.                 index++;
  84.                 input->erase(0,pos+1);
  85.                 if(index > 2) break;
  86.         }
  87.         output[index] = strtol(input->c_str(),NULL,10);
  88.  
  89.         // DOOM Defaults
  90.         if(output[1] == 0) output[1] = 8;
  91.         if(output[2] == 0) output[2] = 1;
  92.  
  93.         // Process Arguments
  94.         for(pos = input->find("-"); pos != -1;)
  95.         {
  96.                 std::string args = input->substr(pos+1,input->length());
  97.                 for(int i = 0; i < args.length(); i++)
  98.                 {
  99.                         arguments |= 1 << ( (*(args.c_str()+i) - '0') - 1 );
  100.                 }
  101.                 break;
  102.         }
  103.         return (RNGObject) { output[0], output[1], output[2], output[3] };
  104. }
  105.  
  106.  
  107. int main( int argc, char* argv[] )
  108. {
  109.  
  110.         printf("Formula key -> Base Damage . Maximum Roll . Number of Rolls . Less Than? \n ");
  111.         printf("Arguments -> Add a '-' at the end of the formula followed by some argument bits.\n\n");
  112.         printf("Enter random formula: ");
  113.         std::string formula;
  114.         std::getline(std::cin, formula);
  115.         RNGObject rngobj = Parse_FInput(&formula);
  116.         double result = brute_prob(rngobj.base,rngobj.max,rngobj.roll,rngobj.look);
  117.         if( rngobj.look              ) printf("Means of probability: %f \n", result );
  118.         if(!rngobj.look && !arguments) printf("No output to give, did you possibly forget to include -1?\n");
  119.         return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement