#include <lib.h>

int collect_moduli(int mod, int *range){
    int ret, neg, big, little, i;
    ret = 0;
    if(range[0] > range[1]){
        neg = 1;
        big = range[0];
        little = range[1];
    }
    else {
        big = range[1];
        little = range[0];
    }

    for(i = big; i > little; i--){
        if(!(i  % mod)) ret++;
    }

    if(neg){
        ret = ret - (ret*2);
    }
    return ret;
}


varargs int ChangeLevel(int i){
    mapping skills, stats, moduli = ([]);
    int current_level, desired_level;
    object subject = this_object();

    current_level = subject->GetLevel();

    if(!i || i < 1) 
        desired_level = current_level + 1;
    else desired_level = i;

    for(i = 1; i < 5; i++){
        moduli[i] = collect_moduli(i, ({ current_level, desired_level }) );
    }

    skills = subject->GetSkillsMap();
    stats = subject->GetStatsMap();

    foreach(mixed key, mixed val in skills){
        if(skills[key]["class"] > 3) skills[key]["class"] = 4;
        subject->SetSkill(key, 
          skills[key]["level"] + moduli[skills[key]["class"]],
          skills[key]["class"]);
    }

    foreach(mixed key, mixed val in stats){
        if(stats[key]["class"] > 3) stats[key]["class"] = 4;
        subject->SetStat(key,
          stats[key]["level"] + moduli[stats[key]["class"]],
          stats[key]["class"]);
    }

    subject->SetLevel(desired_level);

    return 1;
}

