Advertisement
Lysit

terribleDaSoupedUpShokka

Dec 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4.  
  5. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  6.  
  7. enum suit {
  8.     NA = 0,
  9.     deathSkullz = 1,
  10.     badMoonz = 2,
  11. } card;
  12.  
  13. void badMoonzReroll(uint16_t numDice,uint8_t * pResultArray)
  14. {
  15.     uint16_t i;
  16.     uint8_t *pLocal = pResultArray;
  17.     printf("BadMoonz Rerolled: ");
  18.     for(i = 0;i<numDice;i++)
  19.     {
  20.         if(*pLocal == 1)
  21.         {
  22.             *pLocal = rand();
  23.             while(*pLocal > 6)
  24.             {
  25.                 *pLocal -= 6;
  26.             }
  27.             printf("%d ",*pLocal);
  28.         }
  29.         pLocal++;
  30.     }
  31.     printf("\r\n");
  32. }
  33.  
  34. uint8_t deathSkullzReroll(uint16_t numDice,uint8_t * pResultArray,uint8_t maxReRollValue)
  35. {
  36.     uint8_t *pLocal = pResultArray;
  37.     uint8_t localRerollValue = 1;
  38.     uint16_t i;
  39.    
  40.    
  41.     while(localRerollValue < maxReRollValue)
  42.     {
  43.         pLocal = pResultArray;
  44.         for(i = 0;i<numDice;i++)
  45.         {
  46.             if(*pLocal == localRerollValue)
  47.             {
  48.                 *pLocal = rand();
  49.                 while(*pLocal > 6)
  50.                 {
  51.                     *pLocal -= 6;
  52.                 }
  53.                
  54.                 printf("DeathSkullz Rerolled:  %d\r\n",*pLocal);
  55.                 return 1;
  56.             }
  57.             pLocal++;
  58.         }
  59.    
  60.         localRerollValue++;
  61.     }
  62.    
  63.     return 0;
  64. }
  65.  
  66.  
  67. void rollDice(uint16_t numDice,uint8_t * pResultArray)
  68. {
  69.     uint8_t *pLocal = pResultArray;
  70.     uint16_t i;
  71.    
  72.     printf("Rolled: ");
  73.    
  74.     for(i = 0;i<numDice;i++)
  75.     {
  76.         *pLocal = rand();
  77.         while(*pLocal > 6)
  78.         {
  79.             *pLocal -= 6;
  80.         }
  81.         printf("%d ",*pLocal);
  82.         pLocal++;
  83.     }
  84.    
  85.     printf("\r\n");
  86. }
  87.  
  88. uint16_t calcSuccess(uint16_t numDice,uint8_t * pResultArray, uint8_t successValue)
  89. {
  90.     uint8_t *pLocal = pResultArray;
  91.     uint16_t i,
  92.              recordedHits = 0;       
  93.              
  94.     for(i = 0;i<numDice;i++)
  95.     {
  96.         if(*pLocal >= successValue)
  97.         {
  98.             recordedHits++;
  99.         }
  100.  
  101.         pLocal++;
  102.     }
  103.     return recordedHits;
  104. }
  105.  
  106. uint16_t rollToHit(uint16_t numDice,uint8_t klan,uint8_t successValue,uint8_t moreDakka)
  107. {
  108.     uint8_t resultArray[1000] = {0},resultArrayDakka[1000] = {0};
  109.     uint16_t hits = 0,dakkaDakkaDakkaDice = 0, dakkaDakkaDakkaHits = 0;
  110.     uint8_t deathSkullzRerollUsed = 0;
  111.    
  112.     //generate hit rolls
  113.     rollDice(numDice,&resultArray[0]);
  114.    
  115.     if(klan == badMoonz) //reroll 1s
  116.     {
  117.         badMoonzReroll(numDice,&resultArray[0]);
  118.     }
  119.    
  120.     hits = calcSuccess(numDice,&resultArray[0],successValue);
  121.    
  122.     if(klan == deathSkullz)
  123.     {
  124.         if(deathSkullzReroll(numDice,&resultArray[0],4)) //Only reroll upto a 4
  125.         {
  126.             deathSkullzRerollUsed = 1; //De we need this reroll
  127.             hits = calcSuccess(numDice,&resultArray[0],successValue);
  128.         }
  129.     }
  130.        
  131.     //calc dakkadakkadakka shots
  132.     if(moreDakka)
  133.     {
  134.         dakkaDakkaDakkaDice = calcSuccess(numDice,&resultArray[0],5);
  135.     }
  136.     else
  137.     {
  138.         dakkaDakkaDakkaDice = calcSuccess(numDice,&resultArray[0],6);
  139.     }
  140.    
  141.     if(dakkaDakkaDakkaDice != 0)
  142.     {
  143.    
  144.         //now roll those extra hits
  145.         rollDice(dakkaDakkaDakkaDice,&resultArrayDakka[0]);
  146.        
  147.         if(klan == badMoonz) //reroll 1s
  148.         {
  149.             badMoonzReroll(dakkaDakkaDakkaDice,&resultArrayDakka[0]);
  150.         }
  151.        
  152.         dakkaDakkaDakkaHits = calcSuccess(dakkaDakkaDakkaDice,&resultArrayDakka[0],successValue);
  153.        
  154.         if(!deathSkullzRerollUsed) //has the reroll been used?
  155.         {
  156.             if(klan == deathSkullz)
  157.             {
  158.                 deathSkullzReroll(numDice,&resultArray[0],4); //Only reroll upto a 4
  159.                 deathSkullzRerollUsed = 1;
  160.                 dakkaDakkaDakkaHits = calcSuccess(numDice,&resultArray[0],successValue);
  161.             }
  162.         }
  163.        
  164.     }
  165.    
  166.     return dakkaDakkaDakkaHits + hits;
  167. }
  168.  
  169. uint16_t rollToWound(uint16_t numDice,uint8_t klan,uint8_t successValue)
  170. {
  171.     uint8_t resultArray[1000] = {0};
  172.     uint16_t wounds = 0;
  173.    
  174.     //generate wound rolls
  175.     rollDice(numDice,&resultArray[0]);
  176.    
  177.    
  178.    
  179.     if(klan == deathSkullz)
  180.     {
  181.         deathSkullzReroll(numDice,&resultArray[0],4); //Only reroll upto a 4
  182.         wounds = calcSuccess(numDice,&resultArray[0],successValue);
  183.     }
  184.    
  185.     wounds = calcSuccess(numDice,&resultArray[0],successValue);
  186.    
  187.     return wounds;
  188.    
  189. }
  190.  
  191. uint16_t rollToSave(uint16_t numDice,uint8_t successValue)
  192. {
  193.     uint8_t resultArray[1000] = {0};
  194.     uint16_t saves = 0;
  195.    
  196.     //generate saves
  197.     rollDice(numDice,&resultArray[0]);
  198.    
  199.     saves = calcSuccess(numDice,&resultArray[0],successValue);
  200.    
  201.     return numDice - saves; //We effectively want fails
  202. }
  203.  
  204. uint16_t rollToDamage(uint16_t numDice,uint8_t klan,uint8_t minSuccessValue)
  205. {
  206.     uint8_t resultArray[1000] = {0};
  207.     uint16_t damage = 0, i = 0;
  208.    
  209.     //generate damage
  210.     rollDice(numDice,&resultArray[0]);
  211.    
  212.     if(klan == deathSkullz)
  213.     {
  214.         deathSkullzReroll(numDice,&resultArray[0],minSuccessValue - 1); //Only reroll below min success, rerolling lowest damage first
  215.     }
  216.    
  217.     for(i = 0;i < numDice; i++)
  218.     {
  219.         damage += resultArray[i];
  220.     }
  221.    
  222.     return damage;
  223. }
  224.  
  225. uint8_t calcMortalWounds(uint8_t hits)
  226. {
  227.     uint8_t i, wounds = 0, dice = 0;
  228.    
  229.     for(i = 0;i < hits;i++)
  230.     {
  231.         rollDice(1,&dice);
  232.         dice = dice / 2;
  233.         wounds += dice;
  234.     }
  235.     return wounds;
  236. }
  237.  
  238. uint8_t calcWoundValue(uint8_t wepStr, uint8_t targetToughness)
  239. {
  240.     uint8_t woundValue = 4;
  241.    
  242.     if(wepStr > targetToughness)
  243.     {
  244.         woundValue--;
  245.         if(wepStr >= (targetToughness * 2))
  246.         {
  247.             woundValue--;  
  248.         }
  249.     }
  250.     else if(wepStr < targetToughness)
  251.     {
  252.         woundValue++;
  253.         if(wepStr <= (targetToughness / 2))
  254.         {
  255.             woundValue--;  
  256.         }
  257.     }
  258.    
  259.     return woundValue;
  260. }
  261.  
  262. uint16_t doAttack(uint16_t numDice,uint8_t klan,uint8_t hitValue,uint8_t targetToughness,uint8_t saveValue,uint8_t minDamageValue,uint8_t moreDakka)
  263. {
  264.     uint8_t wepStr[2] = {0}, wepStrSum = 0, woundValue = 0;
  265.     uint16_t result = 0;
  266.     uint16_t mortalWounds = 0;
  267.    
  268.     rollDice(2,&wepStr[0]);
  269.    
  270.     wepStrSum = wepStr[0] + wepStr[1];
  271.    
  272.     result = rollToHit(numDice,klan,hitValue,moreDakka);
  273.    
  274.     if(wepStrSum> 10) //Mortal wounds for hits?
  275.     {
  276.         mortalWounds = calcMortalWounds(result);
  277.     }
  278.    
  279.     woundValue = calcWoundValue(wepStrSum,targetToughness);
  280.    
  281.     result = rollToWound(result,klan,woundValue);
  282.    
  283.     result = rollToSave(result,saveValue);
  284.    
  285.     result = rollToDamage(result,klan,minDamageValue);
  286.    
  287.     return result + mortalWounds;
  288. }
  289.  
  290.  
  291. #define KLAN deathSkullz
  292. //#define KLAN badMoonz
  293. //#define KLAN NA
  294. #define HITVALUE 5
  295. #define TARGETTOUGHNESS 7
  296. #define TARGETSAVE     5
  297. #define MINDAMAGEVALUE 3
  298. #define MOREDAKKA 1
  299. #define NUMBEROFFIRINGS 10000
  300.  
  301. int main(int argc, char *argv[])
  302. {
  303.     uint16_t i;
  304.     uint8_t dice[2] = {0};
  305.     uint32_t subTotal = 0,total = 0;
  306.     double hitFraction = 0;
  307.    
  308.    
  309.     for(i = 0;i < NUMBEROFFIRINGS;i++)
  310.     {
  311.         rollDice(2,&dice[0]);
  312.         subTotal = doAttack(dice[0] + dice[1],KLAN,HITVALUE,TARGETTOUGHNESS,TARGETSAVE,MINDAMAGEVALUE,MOREDAKKA);
  313.         printf("Final Hits %d\r\n",subTotal);
  314.         total += subTotal;
  315.     }
  316.    
  317.     hitFraction = (double)total / NUMBEROFFIRINGS;
  318.     printf("Total wounds %d\r\n",total);
  319.     printf("Average Of %f wounds (including mortal) over %d firings\r\n",hitFraction, NUMBEROFFIRINGS);
  320.    
  321.     return 0;
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement