diff --git a/src/bindings.c b/src/bindings.c index 3024b2311..b2db9d761 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -394,10 +394,10 @@ static int tolua_learn_skill(lua_State * L) { unit *u = (unit *)tolua_tousertype(L, 1, 0); const char *skname = tolua_tostring(L, 2, 0); - float chances = (float)tolua_tonumber(L, 3, 0); + int days = (int)tolua_tonumber(L, 3, 0); skill_t sk = findskill(skname); if (sk != NOSKILL) { - learn_skill_depr(u, sk, chances); + learn_skill(u, sk, days); } return 0; } @@ -1119,7 +1119,7 @@ int tolua_bindings_open(lua_State * L) tolua_function(L, TOLUA_CAST "update_subscriptions", tolua_update_subscriptions); tolua_function(L, TOLUA_CAST "update_scores", tolua_update_scores); tolua_function(L, TOLUA_CAST "update_owners", tolua_update_owners); - tolua_function(L, TOLUA_CAST "learn_skill_depr", tolua_learn_skill); + tolua_function(L, TOLUA_CAST "learn_skill", tolua_learn_skill); tolua_function(L, TOLUA_CAST "create_curse", tolua_create_curse); tolua_function(L, TOLUA_CAST "autoseed", tolua_autoseed); tolua_function(L, TOLUA_CAST "get_key", tolua_getkey); diff --git a/src/items/xerewards.c b/src/items/xerewards.c index 1563810d6..98e099070 100644 --- a/src/items/xerewards.c +++ b/src/items/xerewards.c @@ -53,9 +53,7 @@ struct order *ord) for (n = 0; n != amount; ++n) { skill *sv = u->skills; while (sv != u->skills + u->skill_size) { - int i; - for (i = 0; i != 3; ++i) - learn_skill_depr(u, (skill_t)sv->id, 1.0); + learn_skill(u, (skill_t)sv->id, STUDYDAYS * 3); ++sv; } } diff --git a/src/items/xerewards.test.c b/src/items/xerewards.test.c index cd620f039..ea9f53fde 100644 --- a/src/items/xerewards.test.c +++ b/src/items/xerewards.test.c @@ -31,17 +31,17 @@ static void test_skillpotion(CuTest *tc) { itype = test_create_itemtype("skillpotion"); change_resource(u, itype->rtype, 2); - learn_skill_depr(u, SK_ENTERTAINMENT, 1.0); + learn_skill(u, SK_ENTERTAINMENT, STUDYDAYS); pSkill = unit_skill(u, SK_ENTERTAINMENT); sk_set(pSkill, 5); initialWeeks_Entertainment = pSkill->weeks = 4; - learn_skill_depr(u, SK_STAMINA, 1.0); + learn_skill(u, SK_STAMINA, STUDYDAYS); pSkill = unit_skill(u, SK_STAMINA); sk_set(pSkill, 5); initialWeeks_Stamina = pSkill->weeks = 4; - learn_skill_depr(u, SK_MAGIC, 1.0); + learn_skill(u, SK_MAGIC, STUDYDAYS); pSkill = unit_skill(u, SK_MAGIC); sk_set(pSkill, 5); initialWeeks_Magic = pSkill->weeks = 4; diff --git a/src/kernel/skills.c b/src/kernel/skills.c index cb0dcddea..171d42dd0 100644 --- a/src/kernel/skills.c +++ b/src/kernel/skills.c @@ -206,7 +206,7 @@ int level(int days) void sk_set(skill * sv, int level) { - assert(level != 0); + assert(sv && level != 0); sv->weeks = skill_weeks(level); sv->level = level; } diff --git a/src/randenc.c b/src/randenc.c index dfa1e998d..6a642557b 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -151,22 +151,17 @@ static void dissolve_units(void) remove_empty_units(); } -static int improve_all(faction * f, skill_t sk, int by_weeks) +static bool improve_all(faction * f, skill_t sk, int by_weeks) { unit *u; - bool ret = by_weeks; - + bool result = false; for (u = f->units; u; u = u->nextF) { if (has_skill(u, sk)) { - int weeks = 0; - for (; weeks != by_weeks; ++weeks) { - learn_skill_depr(u, sk, 1.0); - ret = 0; - } + learn_skill(u, sk, by_weeks * STUDYDAYS); + result = true; } } - - return ret; + return result; } void find_manual(region * r, unit * u) @@ -247,10 +242,8 @@ void find_manual(region * r, unit * u) msg_release(msg); } - if (improve_all(u->faction, skill, 3) == 3) { - int i; - for (i = 0; i != 9; ++i) - learn_skill_depr(u, skill, 1.0); + if (!improve_all(u->faction, skill, 3)) { + learn_skill(u, skill, 9 * STUDYDAYS); } } diff --git a/src/study.c b/src/study.c index aeb27b89d..af58a1f52 100644 --- a/src/study.c +++ b/src/study.c @@ -847,7 +847,6 @@ bool learn_skill_depr(unit * u, skill_t sk, double learn_chance) } void learn_skill(unit *u, skill_t sk, int days) { - skill *sv = u->skills; int leveldays = STUDYDAYS * u->number; int weeks = 0; while (days >= leveldays) { @@ -857,14 +856,17 @@ void learn_skill(unit *u, skill_t sk, int days) { if (days > 0 && rng_int() % leveldays < days) { ++weeks; } - if (weeks > 0 && !sv) { - sv = add_skill(u, sk); + if (weeks > 0) { + skill *sv = unit_skill(u, sk); + if (!sv) { + sv = add_skill(u, sk); + } + while (sv->weeks <= weeks) { + weeks -= sv->weeks; + sk_set(sv, sv->level + 1); + } + sv->weeks -= weeks; } - while (sv->weeks <= weeks) { - weeks -= sv->weeks; - sk_set(sv, sv->level + 1); - } - sv->weeks -= weeks; } /** Talente von Dämonen verschieben sich.