#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);
}