#include <iostream>
// globals for use with the recursive function
double successRate = 0;
int numToSucceed;
int numToFail;
int skills[3] = {0,0,0};
// function declarations
double calcSuccessRate(int successes, int failures, int DC, int skill1, int skill2, int skill3);
void recurseProbability(int successes, int failures, int DC, int skillIndex, double cummulativeProb);
// main
int main(int argc, char** argv)
{
int reqSuccesses = atoi(argv[1]);
int allowedFailures = atoi(argv[2]);
int DC = atoi(argv[3]);
int skill1 = atoi(argv[4]);
int skill2 = atoi(argv[5]);
int skill3 = atoi(argv[6]);
calcSuccessRate(reqSuccesses, allowedFailures, DC, skill1,skill2,skill3);
}
// wrapper for the recursive function, sets up globals
double calcSuccessRate(int successes, int failures, int DC, int skill1, int skill2, int skill3)
{
numToSucceed = successes;
numToFail = failures;
successRate = 0;
// do skill checks alternate primary / secondary/ primary / tertiary repeat?
// if not adjust the skill matrix accordingly
skills[0] = skill1;
skills[1] = skill2;
skills[2] = skill1;
skills[3] = skill3;
recurseProbability(0,0,DC,0,1.0);
std::cout << " successRate = " << successRate << std::endl;
}
// calculates the chance of success
void recurseProbability(int successes, int failures, int DC, int skillIndex, double cummulativeProb)
{
if ((successes+failures) >= numToSucceed+numToFail)
{
if (successes >= numToSucceed) successRate += cummulativeProb;
return;
}
// determine chance to fail
double probFail = (DC - skills[skillIndex%4]-1) * .05;
// are 20 auto success and 1 auto fail?
// if so then keep this, otherwise change .95 to 1, and .05 to 0
if (probFail >= 1) probFail = .95;
if (probFail <= 0) probFail = .05;
// this roll is a success
recurseProbability(successes+1, failures, DC, skillIndex+1, cummulativeProb*(1-probFail));
// this roll is a failure
recurseProbability(successes, failures+1, DC, skillIndex+1, cummulativeProb*probFail);
}