int GameCritterObject::skillBaseValue(unsigned int skill)
{
    if (skill >= _skillsTagged.size()) throw Exception("GameCritterObject::skillBaseValue(num) - num out of range:" + std::to_string(skill));
    int value = 0;
    switch(skill)
    {
        case SKILLS_SMALL_GUNS:
            value += 5 + 4 * statTotal(STATS_AGILITY);
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_BIG_GUNS:
            value += 2*statTotal(STATS_AGILITY);
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_ENERGY_WEAPONS:
            value += 2*statTotal(STATS_AGILITY);
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_UNARMED:
            value += 30 + 2*(statTotal(STATS_AGILITY) + statTotal(STATS_STRENGTH));
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_MELEE_WEAPONS:
            value += 20 + 2*(statTotal(STATS_AGILITY) + statTotal(STATS_STRENGTH));
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_THROWING:
            value += 4*statTotal(STATS_AGILITY);
            if (traitTagged(TRAITS_GOOD_NATURED)) value -= 10;
            break;
        case SKILLS_FIRST_AID:
            value += 20 + 2*(statTotal(STATS_PERCEPTION) + statTotal(STATS_INTELLIGENCE));
            if (traitTagged(TRAITS_GOOD_NATURED)) value += 15;
            break;
        case SKILLS_DOCTOR:
            value += 20 + 5 + (statTotal(STATS_PERCEPTION) + statTotal(STATS_INTELLIGENCE));
            if (traitTagged(TRAITS_GOOD_NATURED)) value += 15;
            break;
        case SKILLS_SNEAK:
            value += 20 + 5 + 3*statTotal(STATS_AGILITY);
            break;
        case SKILLS_LOCKPICK:
            value += 20 + 10 + (statTotal(STATS_PERCEPTION) + statTotal(STATS_AGILITY));
            break;
        case SKILLS_STEAL:
            value += 20 + 3*statTotal(STATS_AGILITY);
            break;
        case SKILLS_TRAPS:
            value += 20 + 10 + (statTotal(STATS_PERCEPTION) + statTotal(STATS_AGILITY));
            break;
        case SKILLS_SCIENCE:
            value += 20 + 4*statTotal(STATS_INTELLIGENCE);
            break;
        case SKILLS_REPAIR:
            value += 20 + 3*statTotal(STATS_INTELLIGENCE);
            break;
        case SKILLS_SPEECH:
            value += 20 + 5*statTotal(STATS_CHARISMA);
            if (traitTagged(TRAITS_GOOD_NATURED)) value += 15;
            break;
        case SKILLS_BARTER:
            value += 20 + 4*statTotal(STATS_CHARISMA);
            if (traitTagged(TRAITS_GOOD_NATURED)) value += 15;
            break;
        case SKILLS_GAMBLING:
            value += 20 + 5*statTotal(STATS_LUCK);
            break;
        case SKILLS_OUTDOORSMAN:
            value += 20 + 2*(statTotal(STATS_ENDURANCE) + statTotal(STATS_INTELLIGENCE));
            break;
    }

    if (traitTagged(TRAITS_GIFTED))
    {
        value -= 10;
    }

    if (skillTagged(skill))
    {
        value += 20;
    }

    return value;
}
int CritterObject::skillBaseValue(SKILL skill) const
{
    if (skill > SKILL::OUTDOORSMAN) throw Exception("CritterObject::skillBaseValue(num) - num out of range:" + std::to_string((unsigned)skill));
    int value = 0;
    switch(skill)
    {
        case SKILL::SMALL_GUNS:
            value += 5 + 4 * statTotal(STAT::AGILITY);
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::BIG_GUNS:
            value += 2*statTotal(STAT::AGILITY);
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::ENERGY_WEAPONS:
            value += 2*statTotal(STAT::AGILITY);
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::UNARMED:
            value += 30 + 2*(statTotal(STAT::AGILITY) + statTotal(STAT::STRENGTH));
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::MELEE_WEAPONS:
            value += 20 + 2*(statTotal(STAT::AGILITY) + statTotal(STAT::STRENGTH));
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::THROWING:
            value += 4*statTotal(STAT::AGILITY);
            if (traitTagged(TRAIT::GOOD_NATURED)) value -= 10;
            break;
        case SKILL::FIRST_AID:
            value += 20 + 2*(statTotal(STAT::PERCEPTION) + statTotal(STAT::INTELLIGENCE));
            if (traitTagged(TRAIT::GOOD_NATURED)) value += 15;
            break;
        case SKILL::DOCTOR:
            value += 20 + 5 + (statTotal(STAT::PERCEPTION) + statTotal(STAT::INTELLIGENCE));
            if (traitTagged(TRAIT::GOOD_NATURED)) value += 15;
            break;
        case SKILL::SNEAK:
            value += 20 + 5 + 3*statTotal(STAT::AGILITY);
            break;
        case SKILL::LOCKPICK:
            value += 20 + 10 + (statTotal(STAT::PERCEPTION) + statTotal(STAT::AGILITY));
            break;
        case SKILL::STEAL:
            value += 20 + 3*statTotal(STAT::AGILITY);
            break;
        case SKILL::TRAPS:
            value += 20 + 10 + (statTotal(STAT::PERCEPTION) + statTotal(STAT::AGILITY));
            break;
        case SKILL::SCIENCE:
            value += 20 + 4*statTotal(STAT::INTELLIGENCE);
            break;
        case SKILL::REPAIR:
            value += 20 + 3*statTotal(STAT::INTELLIGENCE);
            break;
        case SKILL::SPEECH:
            value += 20 + 5*statTotal(STAT::CHARISMA);
            if (traitTagged(TRAIT::GOOD_NATURED)) value += 15;
            break;
        case SKILL::BARTER:
            value += 20 + 4*statTotal(STAT::CHARISMA);
            if (traitTagged(TRAIT::GOOD_NATURED)) value += 15;
            break;
        case SKILL::GAMBLING:
            value += 20 + 5*statTotal(STAT::LUCK);
            break;
        case SKILL::OUTDOORSMAN:
            value += 20 + 2*(statTotal(STAT::ENDURANCE) + statTotal(STAT::INTELLIGENCE));
            break;
        default:
            break;
    }

    if (traitTagged(TRAIT::GIFTED))
    {
        value -= 10;
    }

    if (skillTagged(skill))
    {
        value += 20;
    }

    return value;
}