diff --git a/src/common/gamecode/study.c b/src/common/gamecode/study.c index f0a2cb2bf..ef15e7faf 100644 --- a/src/common/gamecode/study.c +++ b/src/common/gamecode/study.c @@ -291,7 +291,7 @@ teach(region * r, unit * u) for (i=0;teachskill[i]!=NOSKILL;++i) if (sk==teachskill[i]) break; sk = teachskill[i]; } - if (sk != NOSKILL && eff_skill(u, sk, r) > eff_skill(student, sk, r)) { + if (sk != NOSKILL && eff_skill_study(u, sk, r)-TEACHDIFFERENCE > eff_skill_study(student, sk, r)) { teaching -= teach_unit(u, student, teaching, sk, true, &academy); } } @@ -304,7 +304,7 @@ teach(region * r, unit * u) if (igetkeyword(student->thisorder, student->faction->locale) == K_STUDY) { /* Input ist nun von student->thisorder !! */ sk = getskill(student->faction->locale); - if (sk != NOSKILL && eff_skill(u, sk, r)-TEACHDIFFERENCE >= eff_skill(student, sk, r)) { + if (sk != NOSKILL && eff_skill_study(u, sk, r)-TEACHDIFFERENCE >= eff_skill(student, sk, r)) { teaching -= teach_unit(u, student, teaching, sk, true, &academy); } } @@ -407,7 +407,7 @@ teach(region * r, unit * u) continue; } /* u is teacher, u2 is student */ - if (eff_skill(u2, sk, r) > eff_skill(u, sk, r)-TEACHDIFFERENCE) { + if (eff_skill_study(u2, sk, r) > eff_skill_study(u, sk, r)-TEACHDIFFERENCE) { add_message(&u->faction->msgs, msg_error(u, u->thisorder, "teach_asgood", "student", u2)); continue; diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index 2c6eb5624..631ba0fc0 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -633,7 +633,7 @@ spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, int diff; if(skill->old > 0) { - oldeff = skill->old + get_modifier(u, sk, skill->old, u->region); + oldeff = skill->old + get_modifier(u, sk, skill->old, u->region, false); } oldeff = max(0, oldeff); diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index 0a5f7deae..7bdbe6277 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -963,8 +963,7 @@ item_modification(const unit *u, skill_t sk, int val) /* Presseausweis: *2 Spionage, 0 Tarnung */ if(sk == SK_SPY && get_item(u, I_PRESSCARD) >= u->number) { val = val * 2; - } - if(sk == SK_STEALTH) { + } else if(sk == SK_STEALTH) { #if NEWATSROI == 1 if(get_item(u, I_RING_OF_INVISIBILITY) + 100 * get_item(u, I_SPHERE_OF_INVISIBILITY) >= u->number) { @@ -1031,7 +1030,7 @@ att_modification(const unit *u, skill_t sk) } int -get_modifier(const unit * u, skill_t sk, int level, const region * r) +get_modifier(const unit *u, skill_t sk, int level, const region *r, boolean noitem) { int bskill = level; int skill = bskill; @@ -1042,7 +1041,9 @@ get_modifier(const unit * u, skill_t sk, int level, const region * r) skill += rc_skillmod(u->race, r, sk); skill += att_modification(u, sk); - skill = item_modification(u, sk, skill); + if(noitem == false) { + skill = item_modification(u, sk, skill); + } skill = skillmod(u->attribs, u, r, sk, skill, SMF_ALWAYS); if (fspecial(u->faction, FS_TELEPATHY)) { @@ -1072,7 +1073,19 @@ eff_skill(const unit * u, skill_t sk, const region * r) { int level = get_level(u, sk); if (level>0) { - int mlevel = level + get_modifier(u, sk, level, r); + int mlevel = level + get_modifier(u, sk, level, r, false); + + if (mlevel>0) return mlevel; + } + return 0; +} + +int +eff_skill_study(const unit * u, skill_t sk, const region * r) +{ + int level = get_level(u, sk); + if (level>0) { + int mlevel = level + get_modifier(u, sk, level, r, true); if (mlevel>0) return mlevel; } diff --git a/src/common/kernel/unit.h b/src/common/kernel/unit.h index d99f55849..c84957181 100644 --- a/src/common/kernel/unit.h +++ b/src/common/kernel/unit.h @@ -120,7 +120,9 @@ extern int get_level(const struct unit * u, skill_t id); extern void transfermen(struct unit * u, struct unit * u2, int n); extern int eff_skill(const struct unit * u, skill_t sk, const struct region * r); -extern int get_modifier(const struct unit * u, skill_t sk, int lvl, const struct region * r); +extern int eff_skill_study(const struct unit * u, skill_t sk, const struct region * r); + +extern int get_modifier(const struct unit * u, skill_t sk, int lvl, const struct region * r, boolean noitem); #undef DESTROY