|
|
@@ -111,50 +111,13 @@ SkillLevel::SkillLevel(int minLevel, int maxLevel, int minExercise, int maxExerc |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int SkillLevel::comprehension(int intellect, bool fastLearner) { |
|
|
|
if (intellect == 0) |
|
|
|
return 0; |
|
|
|
void SkillLevel::train(int amount) { |
|
|
|
_exercise += amount; |
|
|
|
|
|
|
|
int base_comprehension; |
|
|
|
|
|
|
|
if (intellect <= 8) { |
|
|
|
base_comprehension = intellect * 10; |
|
|
|
} else { |
|
|
|
base_comprehension = 80 + (intellect - 8) * 8; |
|
|
|
} |
|
|
|
|
|
|
|
if (fastLearner) { |
|
|
|
base_comprehension = base_comprehension / 2 * 3; |
|
|
|
} |
|
|
|
|
|
|
|
int skill_penalty; |
|
|
|
|
|
|
|
if (_level <= intellect / 2) { |
|
|
|
skill_penalty = 0; |
|
|
|
} else if (_level <= intellect) { |
|
|
|
skill_penalty = _level; |
|
|
|
} else { |
|
|
|
skill_penalty = _level * 2; |
|
|
|
} |
|
|
|
|
|
|
|
if (skill_penalty >= base_comprehension) { |
|
|
|
return 1; |
|
|
|
} else { |
|
|
|
return base_comprehension - skill_penalty; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int SkillLevel::train(int &level) { |
|
|
|
++_exercise; |
|
|
|
|
|
|
|
if (_exercise >= 100) { |
|
|
|
if (_exercise >= 100 * (_level + 1)) { |
|
|
|
_exercise = 0; |
|
|
|
++_level; |
|
|
|
} |
|
|
|
|
|
|
|
level = _level; |
|
|
|
|
|
|
|
return _exercise; |
|
|
|
} |
|
|
|
|
|
|
|
static int rustRate(int level) |
|
|
@@ -180,11 +143,11 @@ bool SkillLevel::rust(const calendar& turn, bool forgetful, bool charged_bio_mem |
|
|
|
if (OPTIONS[OPT_SKILL_RUST] == 0 || _exercise > 0) |
|
|
|
{ |
|
|
|
if (charged_bio_mem) return one_in(5); |
|
|
|
--_exercise; |
|
|
|
_exercise -= _level; |
|
|
|
|
|
|
|
if (_exercise < 0) |
|
|
|
{ |
|
|
|
_exercise = 99; |
|
|
|
_exercise = (100 * _level) - 1; |
|
|
|
--_level; |
|
|
|
} |
|
|
|
} |
|
|
@@ -198,23 +161,16 @@ void SkillLevel::practice(const calendar& turn) |
|
|
|
_lastPracticed = turn; |
|
|
|
} |
|
|
|
|
|
|
|
int SkillLevel::readBook(int minimumGain, int maximumGain, const calendar& turn, |
|
|
|
int maximumLevel) |
|
|
|
void SkillLevel::readBook(int minimumGain, int maximumGain, const calendar &turn, |
|
|
|
int maximumLevel) |
|
|
|
{ |
|
|
|
int gain = rng(minimumGain, maximumGain); |
|
|
|
|
|
|
|
int level; |
|
|
|
int gain = rng(minimumGain, maximumGain); |
|
|
|
|
|
|
|
for (int i = 0; i < gain; ++i) { |
|
|
|
train(level); |
|
|
|
|
|
|
|
if (level >= maximumLevel) |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
practice(turn); |
|
|
|
|
|
|
|
return _exercise; |
|
|
|
if (_level < maximumLevel) |
|
|
|
{ |
|
|
|
train(gain); |
|
|
|
} |
|
|
|
practice(turn); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|