void Hurt(object oPC, int level, int max, int cnt, int amt)
{
    if (cnt == 0) AssignCommand(oPC, SpeakString("Testing regen Level: " + IntToString(level-1), TALKVOLUME_WHISPER));

    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(amt, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_NORMAL), oPC, 0.2f);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_DIVINE,FALSE), oPC, 0.0f);
    if (GetIsDead(oPC) == TRUE) {
//        AssignCommand(oPC, SpeakString("dead!"));
        SpeakString(GetName(oPC) + " died at level " + IntToString(level-1) + " hit " + IntToString(cnt+1));
    } else {
        ++cnt;
        if (cnt < level) {
            DelayCommand(6.0 / level, Hurt(oPC, level, max, cnt, amt));
        } else {
            ++level;
            cnt = 0;
            if (level < max) {
                DelayCommand(6.0 / level, Hurt(oPC, level, max, cnt, amt));
            } else {
                SpeakString(GetName(oPC) + " passed.");
            }
        }
    }
}

void main()
{
    object oPC = GetLastUsedBy();
    int level = StringToInt(GetTag(OBJECT_SELF));
    int amt = GetMaxHitPoints(oPC)-1;

    if (amt > 10000) amt = 10000;
    Hurt(oPC, level+1, level + 4, 0, amt);
}