//by Squatting Monk
// The base DC to resist any effect from dirty fighting.
const int DIRTY_FIGHTING_DC_BASE = 10;

// A number to add to the DC for each attack the PC loses to use dirty fighting.
const int DIRTY_FIGHTING_DC_MOD = 7;

// A number to add to the DC for the various types of effects. Use to make some
// abilities harder or easier to resist to avoid over/underpowered effects.
const int DIRTY_FIGHTING_DC_MOD_BLINDNESS = 0;
const int DIRTY_FIGHTING_DC_MOD_KNOCKDOWN = 0;
const int DIRTY_FIGHTING_DC_MOD_STUNNED   = 0;
const int DIRTY_FIGHTING_DC_MOD_DAZED     = 0;
const int DIRTY_FIGHTING_DC_MOD_SLOW      = 0;

void main()
{
    object oPC = OBJECT_SELF;
    object oTarget = GetSpellTargetObject();

    // Sanity check
    if (GetObjectType(oTarget) != OBJECT_TYPE_CREATURE) return;

    // Figure out how many attacks oPC is giving up to perform this move.
    int nHD = GetHitDice(oPC);
    int nBAB = GetBaseAttackBonus(oPC);
    int nAttacks;

    // BAB increases after 21st level don't increase the number of attacks. If
    // he's epic level, we need to figure attacks based on his pre-epic BAB.
    if (nHD > 20)
        nAttacks = (nBAB - (nHD - 17) / 2) / 5;
    else
        nAttacks = (nBAB - 1) / 5;

    // This basic DC can be modified later depending on the effect.
    int nDC = DIRTY_FIGHTING_DC_BASE + (DIRTY_FIGHTING_DC_MOD * nAttacks);

    // Randomly determine the effects of the hit. Could change the die size and
    // cases to prefer some effects over others.
    effect eDirty;

    switch (d6())
    {
        case 1:
            nDC += DIRTY_FIGHTING_DC_MOD_BLINDNESS;
            eDirty = EffectBlindness();
            break;
        case 2:
            nDC += DIRTY_FIGHTING_DC_MOD_KNOCKDOWN;
            eDirty = EffectKnockdown();
            break;
        case 3:
            nDC += DIRTY_FIGHTING_DC_MOD_STUNNED;
            eDirty = EffectStunned();
            break;
        case 4:
            nDC += DIRTY_FIGHTING_DC_MOD_DAZED;
            eDirty = EffectDazed();
            break;
        case 5:
            nDC += DIRTY_FIGHTING_DC_MOD_SLOW;
            eDirty = EffectSlow();
            break;
        case 6:
            return; // Nothing!
    }

    // If we fail our save, apply the effect!
    if (!ReflexSave(oTarget, nDC))
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDirty, oTarget, 6.0);
}