diff --git a/clibs b/clibs
index d80ba4b60..1854780fe 160000
--- a/clibs
+++ b/clibs
@@ -1 +1 @@
-Subproject commit d80ba4b609c2aebf5bf38da60367dc0f0e2d50b9
+Subproject commit 1854780fe3073e491775836c22f709668b1fff62
diff --git a/res/core/messages.xml b/res/core/messages.xml
index d2c40f9b3..7028ab6b9 100644
--- a/res/core/messages.xml
+++ b/res/core/messages.xml
@@ -533,10 +533,6 @@
-
-
-
-
diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po
index a9a87662e..5fcc657f1 100644
--- a/res/translations/messages.de.po
+++ b/res/translations/messages.de.po
@@ -71,9 +71,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat
msgid "error195"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\""
-msgid "healall"
-msgstr "\"Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt.\""
-
msgid "build_required"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required).\""
diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po
index 25caf2446..060fe09c2 100644
--- a/res/translations/messages.en.po
+++ b/res/translations/messages.en.po
@@ -71,9 +71,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician al
msgid "error195"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\""
-msgid "healall"
-msgstr "\"Life itself touches the world and all beings are healed.\""
-
msgid "build_required"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required).\""
diff --git a/s/travis-build b/s/travis-build
index 64b278710..7bbfbe85a 100755
--- a/s/travis-build
+++ b/s/travis-build
@@ -33,8 +33,9 @@ set -e
[ -z $BUILD ] && BUILD=Debug ; export BUILD
# cppcheck_tests
s/cmake-init --db=sqlite
-s/build
-cd process
+cd Debug
+scan-build make
+cd ../process
make
cd $ROOT
inifile
diff --git a/src/alchemy.c b/src/alchemy.c
index 1673d5196..b4e7f6253 100644
--- a/src/alchemy.c
+++ b/src/alchemy.c
@@ -90,7 +90,7 @@ void herbsearch(unit * u, int max_take)
region * r = u->region;
int herbsfound;
const item_type *whichherb;
- int effsk = effskill(u, SK_HERBALISM, 0);
+ int effsk = effskill(u, SK_HERBALISM, NULL);
int herbs = rherbs(r);
if (effsk == 0) {
@@ -275,7 +275,7 @@ int change_effect(unit * u, const item_type * effect, int delta)
bool display_potions(struct unit *u)
{
- int skill = effskill(u, SK_ALCHEMY, 0);
+ int skill = effskill(u, SK_ALCHEMY, NULL);
int c = 0;
const potion_type *ptype;
for (ptype = potiontypes; ptype != NULL; ptype = ptype->next) {
diff --git a/src/battle.c b/src/battle.c
index 8b8fd8c17..f4d3a1fde 100644
--- a/src/battle.c
+++ b/src/battle.c
@@ -86,8 +86,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define CATAPULT_INITIAL_RELOAD 4 /* erster schuss in runde 1 + rng_int() % INITIAL */
-#define BASE_CHANCE 70 /* 70% Basis-�berlebenschance */
-#define TDIFF_CHANGE 5 /* 5% h�her pro Stufe */
+#define BASE_CHANCE 70 /* 70% Basis-Ueberlebenschance */
+#define TDIFF_CHANGE 5 /* 5% hoeher pro Stufe */
#define DAMAGE_QUOTIENT 2 /* damage += skilldiff/DAMAGE_QUOTIENT */
#define DEBUG_SELECT /* should be disabled if select_enemy works */
@@ -589,12 +589,12 @@ weapon_skill(const weapon_type * wtype, const unit * u, bool attacking)
int skill;
if (wtype == NULL) {
- skill = effskill(u, SK_WEAPONLESS, 0);
+ skill = effskill(u, SK_WEAPONLESS, NULL);
if (skill <= 0) {
/* wenn kein waffenloser kampf, dann den rassen-defaultwert */
if (u_race(u) == get_race(RC_ORC)) {
- int sword = effskill(u, SK_MELEE, 0);
- int spear = effskill(u, SK_SPEAR, 0);
+ int sword = effskill(u, SK_MELEE, NULL);
+ int spear = effskill(u, SK_SPEAR, NULL);
skill = MAX(sword, spear) - 3;
if (attacking) {
skill = MAX(skill, u_race(u)->at_default);
@@ -639,7 +639,7 @@ weapon_skill(const weapon_type * wtype, const unit * u, bool attacking)
/* changed: if we own a weapon, we have at least a skill of 0 */
if (!i_canuse(u, wtype->itype))
return -1;
- skill = effskill(u, wtype->skill, 0);
+ skill = effskill(u, wtype->skill, NULL);
if (skill > 0) {
if (attacking) {
skill += u_race(u)->at_bonus;
@@ -674,7 +674,7 @@ static int CavalryBonus(const unit * u, troop enemy, int type)
}
else {
/* new rule, chargers in Eressea 1.1 */
- int skl = effskill(u, SK_RIDING, 0);
+ int skl = effskill(u, SK_RIDING, NULL);
/* only half against trolls */
if (skl > 0) {
if (type == BONUS_SKILL) {
@@ -989,7 +989,7 @@ int natural_armor(unit * du)
assert(rc);
an = rc_armor_bonus(rc);
if (an > 0) {
- int sk = effskill(du, SK_STAMINA, 0);
+ int sk = effskill(du, SK_STAMINA, NULL);
return rc->armor + sk / an;
}
return rc->armor;
@@ -2359,7 +2359,7 @@ static int horse_fleeing_bonus(const unit * u)
const item_type *it_horse, *it_elvenhorse, *it_charger;
int n1 = 0, n2 = 0, n3 = 0;
item *itm;
- int skl = effskill(u, SK_RIDING, 0);
+ int skl = effskill(u, SK_RIDING, NULL);
const resource_type *rtype;
it_horse = ((rtype = get_resourcetype(R_HORSE)) != NULL) ? rtype->itype : 0;
@@ -2390,7 +2390,7 @@ static int fleechance(unit * u)
int p = flee_chance_base; /* Fluchtwahrscheinlichkeit in % */
/* Einheit u versucht, dem Get�mmel zu entkommen */
- p += (effskill(u, SK_STEALTH, 0) * flee_chance_skill_bonus);
+ p += (effskill(u, SK_STEALTH, NULL) * flee_chance_skill_bonus);
p += horse_fleeing_bonus(u);
if (u_race(u) == get_race(RC_HALFLING)) {
@@ -3099,7 +3099,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack)
region *r = b->region;
item *itm;
fighter *fig = NULL;
- int h, i, tactics = effskill(u, SK_TACTICS, 0);
+ int h, i, tactics = effskill(u, SK_TACTICS, NULL);
int berserk;
int strongmen;
int speeded = 0, speed = 1;
@@ -3331,17 +3331,17 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack)
* keine addierten boni. */
/* Zuerst mal die Spezialbehandlung gewisser Sonderf�lle. */
- fig->magic = effskill(u, SK_MAGIC, 0);
+ fig->magic = effskill(u, SK_MAGIC, NULL);
if (fig->horses) {
if (!fval(r->terrain, CAVALRY_REGION) || r_isforest(r)
- || effskill(u, SK_RIDING, 0) < CavalrySkill()
+ || effskill(u, SK_RIDING, NULL) < CavalrySkill()
|| u_race(u) == get_race(RC_TROLL) || fval(u, UFL_WERE))
fig->horses = 0;
}
if (fig->elvenhorses) {
- if (effskill(u, SK_RIDING, 0) < 5 || u_race(u) == get_race(RC_TROLL)
+ if (effskill(u, SK_RIDING, NULL) < 5 || u_race(u) == get_race(RC_TROLL)
|| fval(u, UFL_WERE))
fig->elvenhorses = 0;
}
diff --git a/src/bind_unit.c b/src/bind_unit.c
index 4e3047367..e061e510a 100644
--- a/src/bind_unit.c
+++ b/src/bind_unit.c
@@ -427,7 +427,7 @@ static int tolua_unit_effskill(lua_State * L)
unit *self = (unit *)tolua_tousertype(L, 1, 0);
const char *skname = tolua_tostring(L, 2, 0);
skill_t sk = findskill(skname);
- int value = (sk == NOSKILL) ? -1 : effskill(self, sk, 0);
+ int value = (sk == NOSKILL) ? -1 : effskill(self, sk, NULL);
lua_pushinteger(L, value);
return 1;
}
diff --git a/src/creport.c b/src/creport.c
index b3445f5e1..db422e5f4 100644
--- a/src/creport.c
+++ b/src/creport.c
@@ -946,7 +946,7 @@ void cr_output_unit(stream *out, const faction * f,
for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) {
if (sv->level > 0) {
skill_t sk = sv->id;
- int esk = effskill(u, sk, 0);
+ int esk = effskill(u, sk, NULL);
if (!pr) {
pr = 1;
stream_printf(out, "TALENTE\n");
@@ -959,7 +959,7 @@ void cr_output_unit(stream *out, const faction * f,
/* spells that this unit can cast */
if (mage) {
- int maxlevel = effskill(u, SK_MAGIC, 0);
+ int maxlevel = effskill(u, SK_MAGIC, NULL);
cr_output_spells(out, u, maxlevel);
for (i = 0; i != MAXCOMBATSPELLS; ++i) {
diff --git a/src/economy.c b/src/economy.c
index 1d3f6685f..271a8a26e 100644
--- a/src/economy.c
+++ b/src/economy.c
@@ -1012,7 +1012,7 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want)
}
assert(sk != NOSKILL || !"limited resource needs a required skill for making it");
- skill = effskill(u, sk, 0);
+ skill = effskill(u, sk, NULL);
if (skill == 0) {
add_message(&u->faction->msgs,
msg_feedback(u, u->thisorder, "skill_needed", "skill", sk));
@@ -1101,7 +1101,7 @@ leveled_allocation(const resource_type * rtype, region * r, allocation * alist)
if (!fval(al, AFL_DONE)) {
int req = required(al->want - al->get, al->save);
assert(al->get <= al->want && al->get >= 0);
- if (effskill(al->unit, itype->construction->skill, 0)
+ if (effskill(al->unit, itype->construction->skill, NULL)
>= rm->level + itype->construction->minskill - 1) {
if (req) {
nreq += req;
@@ -1628,7 +1628,7 @@ static void buy(unit * u, econ_request ** buyorders, struct order *ord)
}
/* Ein H�ndler kann nur 10 G�ter pro Talentpunkt handeln. */
- k = u->number * 10 * effskill(u, SK_TRADE, 0);
+ k = u->number * 10 * effskill(u, SK_TRADE, NULL);
/* hat der H�ndler bereits gehandelt, muss die Menge der bereits
* verkauften/gekauften G�ter abgezogen werden */
@@ -1947,7 +1947,7 @@ static bool sell(unit * u, econ_request ** sellorders, struct order *ord)
/* Ein H�ndler kann nur 10 G�ter pro Talentpunkt verkaufen. */
- i = u->number * 10 * effskill(u, SK_TRADE, 0);
+ i = u->number * 10 * effskill(u, SK_TRADE, NULL);
if (n > i) n = i;
if (!n) {
@@ -1996,7 +1996,7 @@ static bool sell(unit * u, econ_request ** sellorders, struct order *ord)
* existiert, so dass man arrays von orders machen kann. */
/* Ein H�ndler kann nur 10 G�ter pro Talentpunkt handeln. */
- k = u->number * 10 * effskill(u, SK_TRADE, 0);
+ k = u->number * 10 * effskill(u, SK_TRADE, NULL);
/* hat der H�ndler bereits gehandelt, muss die Menge der bereits
* verkauften/gekauften G�ter abgezogen werden */
@@ -2041,7 +2041,7 @@ static void plant(unit * u, int raw)
}
/* Skill pr�fen */
- skill = effskill(u, SK_HERBALISM, 0);
+ skill = effskill(u, SK_HERBALISM, NULL);
if (skill < 6) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, u->thisorder, "plant_skills",
@@ -2095,7 +2095,7 @@ static void planttrees(unit * u, int raw)
rtype = get_resourcetype(fval(r, RF_MALLORN) ? R_MALLORN_SEED : R_SEED);
/* Skill pr�fen */
- skill = effskill(u, SK_HERBALISM, 0);
+ skill = effskill(u, SK_HERBALISM, NULL);
if (skill < 6) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, u->thisorder, "plant_skills",
@@ -2160,7 +2160,7 @@ static void breedtrees(unit * u, int raw)
rtype = get_resourcetype(fval(r, RF_MALLORN) ? R_MALLORN_SEED : R_SEED);
/* Skill pr�fen */
- skill = effskill(u, SK_HERBALISM, 0);
+ skill = effskill(u, SK_HERBALISM, NULL);
if (skill < 12) {
planttrees(u, raw);
return;
@@ -2216,7 +2216,7 @@ static void breedhorses(unit * u)
cmistake(u, u->thisorder, 107, MSG_PRODUCE);
return;
}
- effsk = effskill(u, SK_HORSE_TRAINING, 0);
+ effsk = effskill(u, SK_HORSE_TRAINING, NULL);
n = u->number * effsk;
if (n > horses) n = horses;
@@ -2317,7 +2317,7 @@ static void research_cmd(unit * u, struct order *ord)
kwd = init_order_depr(ord);
assert(kwd == K_RESEARCH);
- if (effskill(u, SK_HERBALISM, 0) < 7) {
+ if (effskill(u, SK_HERBALISM, NULL) < 7) {
cmistake(u, ord, 227, MSG_EVENT);
return;
}
@@ -2391,7 +2391,7 @@ void entertain_cmd(unit * u, struct order *ord)
cmistake(u, ord, 58, MSG_INCOME);
return;
}
- if (!effskill(u, SK_ENTERTAINMENT, 0)) {
+ if (!effskill(u, SK_ENTERTAINMENT, NULL)) {
cmistake(u, ord, 58, MSG_INCOME);
return;
}
@@ -2404,7 +2404,7 @@ void entertain_cmd(unit * u, struct order *ord)
return;
}
- u->wants = u->number * (entertainbase + effskill(u, SK_ENTERTAINMENT, 0)
+ u->wants = u->number * (entertainbase + effskill(u, SK_ENTERTAINMENT, NULL)
* entertainperlevel);
max_e = getuint();
@@ -2598,7 +2598,7 @@ void tax_cmd(unit * u, struct order *ord, econ_request ** taxorders)
return;
}
- if (effskill(u, SK_TAXING, 0) <= 0) {
+ if (effskill(u, SK_TAXING, NULL) <= 0) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "error_no_tax_skill", ""));
return;
@@ -2613,7 +2613,7 @@ void tax_cmd(unit * u, struct order *ord, econ_request ** taxorders)
u->wants = income(u);
}
else {
- u->wants = n * effskill(u, SK_TAXING, 0) * taxperlevel;
+ u->wants = n * effskill(u, SK_TAXING, NULL) * taxperlevel;
}
if (u->wants > max) u->wants = max;
@@ -2686,8 +2686,8 @@ void loot_cmd(unit * u, struct order *ord, econ_request ** lootorders)
}
else {
/* For player start with 20 Silver +10 every 5 level of close combat skill*/
- int skm = effskill(u, SK_MELEE, 0);
- int sks = effskill(u, SK_SPEAR, 0);
+ int skm = effskill(u, SK_MELEE, NULL);
+ int sks = effskill(u, SK_SPEAR, NULL);
int skbonus = ((skm > sks ? skm : sks) * 2 / 10) + 2;
u->wants = n * skbonus * 10;
if (u->wants > max) u->wants = max;
diff --git a/src/items.c b/src/items.c
index 72bd6d713..94865aba3 100644
--- a/src/items.c
+++ b/src/items.c
@@ -263,7 +263,7 @@ static int use_foolpotion(unit *u, const item_type *itype, int amount,
""));
return ECUSTOM;
}
- if (effskill(u, SK_STEALTH, 0) <= effskill(target, SK_PERCEPTION, 0)) {
+ if (effskill(u, SK_STEALTH, NULL) <= effskill(target, SK_PERCEPTION, NULL)) {
cmistake(u, ord, 64, MSG_EVENT);
return ECUSTOM;
}
diff --git a/src/kernel/build.c b/src/kernel/build.c
index c78cf5212..2dd2da9af 100644
--- a/src/kernel/build.c
+++ b/src/kernel/build.c
@@ -128,7 +128,7 @@ static void destroy_road(unit * u, int nmax, struct order *ord)
if (n != 0) {
region *r2 = rconnect(r, d);
- int willdo = effskill(u, SK_ROAD_BUILDING, 0) * u->number;
+ int willdo = effskill(u, SK_ROAD_BUILDING, NULL) * u->number;
if (willdo > n) willdo = n;
if (willdo == 0) {
/* TODO: error message */
@@ -278,7 +278,7 @@ void build_road(unit * u, int size, direction_t d)
region *rn = rconnect(r, d);
assert(u->number);
- effsk = effskill(u, SK_ROAD_BUILDING, 0);
+ effsk = effskill(u, SK_ROAD_BUILDING, NULL);
if (!effsk) {
cmistake(u, u->thisorder, 103, MSG_PRODUCE);
return;
@@ -616,7 +616,7 @@ int build(unit * u, const construction * con, int completed, int want, int skill
int made, basesk = 0;
assert(con->skill != NOSKILL);
- basesk = effskill(u, con->skill, 0);
+ basesk = effskill(u, con->skill, NULL);
if (basesk == 0) {
return ENEEDSKILL;
}
@@ -758,7 +758,7 @@ build_building(unit * u, const building_type * btype, int id, int want, order *
assert(u->number);
assert(btype->stages && btype->stages->construction);
- basesk = effskill(u, SK_BUILDING, 0);
+ basesk = effskill(u, SK_BUILDING, NULL);
skills = build_skill(u, basesk, 0);
if (skills == 0) {
cmistake(u, ord, 101, MSG_PRODUCE);
@@ -958,13 +958,13 @@ create_ship(unit * u, const struct ship_type *newtype, int want,
order *new_order;
region * r = u->region;
- if (!effskill(u, SK_SHIPBUILDING, 0)) {
+ if (!effskill(u, SK_SHIPBUILDING, NULL)) {
cmistake(u, ord, 100, MSG_PRODUCE);
return;
}
/* check if skill and material for 1 size is available */
- if (effskill(u, cons->skill, 0) < cons->minskill) {
+ if (effskill(u, cons->skill, NULL) < cons->minskill) {
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder,
"error_build_skill_low", "value", cons->minskill));
return;
@@ -1002,7 +1002,7 @@ void continue_ship(unit * u, int want)
int msize;
region * r = u->region;
- if (!effskill(u, SK_SHIPBUILDING, 0)) {
+ if (!effskill(u, SK_SHIPBUILDING, NULL)) {
cmistake(u, u->thisorder, 100, MSG_PRODUCE);
return;
}
@@ -1022,7 +1022,7 @@ void continue_ship(unit * u, int want)
cmistake(u, u->thisorder, 16, MSG_PRODUCE);
return;
}
- if (effskill(u, cons->skill, 0) < cons->minskill) {
+ if (effskill(u, cons->skill, NULL) < cons->minskill) {
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder,
"error_build_skill_low", "value", cons->minskill));
return;
diff --git a/src/kernel/save.c b/src/kernel/save.c
index 53a6af991..c6d3bd497 100644
--- a/src/kernel/save.c
+++ b/src/kernel/save.c
@@ -1500,7 +1500,7 @@ int read_game(gamedata *data)
struct sc_mage *mage = get_mage(u);
if (mage) {
faction *f = u->faction;
- int skl = effskill(u, SK_MAGIC, 0);
+ int skl = effskill(u, SK_MAGIC, NULL);
if (f->magiegebiet == M_GRAY) {
f->magiegebiet = mage_get_type(mage);
log_error("faction %s had magic=gray, fixing (%s)",
diff --git a/src/kernel/ship.c b/src/kernel/ship.c
index 6fcea4935..5c47e5347 100644
--- a/src/kernel/ship.c
+++ b/src/kernel/ship.c
@@ -287,7 +287,7 @@ static int ShipSpeedBonus(const unit * u)
bonus = config_get_int("movement.shipspeed.skillbonus", 0);
}
if (bonus > 0) {
- int skl = effskill(u, SK_SAILING, 0);
+ int skl = effskill(u, SK_SAILING, NULL);
int minsk = (sh->type->cptskill + 1) / 2;
return (skl - minsk) / bonus;
}
@@ -295,7 +295,7 @@ static int ShipSpeedBonus(const unit * u)
int base = 3;
int speed = 0;
int minsk = sh->type->cptskill * base;
- int skl = effskill(u, SK_SAILING, 0);
+ int skl = effskill(u, SK_SAILING, NULL);
while (skl >= minsk) {
++speed;
minsk *= base;
@@ -313,7 +313,7 @@ int crew_skill(const ship *sh) {
for (u = sh->region->units; u; u = u->next) {
if (u->ship == sh) {
- n += effskill(u, SK_SAILING, 0) * u->number;
+ n += effskill(u, SK_SAILING, NULL) * u->number;
}
}
return n;
diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c
index 0918e83aa..2a6096bfa 100644
--- a/src/kernel/unit.test.c
+++ b/src/kernel/unit.test.c
@@ -234,22 +234,22 @@ static void test_skillmod(CuTest *tc) {
test_setup();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
set_level(u, SK_ARMORER, 5);
- CuAssertIntEquals(tc, 5, effskill(u, SK_ARMORER, 0));
+ CuAssertIntEquals(tc, 5, effskill(u, SK_ARMORER, NULL));
a_add(&u->attribs, a = make_skillmod(SK_ARMORER, 0, 2.0, 0));
- CuAssertIntEquals(tc, 10, effskill(u, SK_ARMORER, 0));
+ CuAssertIntEquals(tc, 10, effskill(u, SK_ARMORER, NULL));
a_remove(&u->attribs, a);
a_add(&u->attribs, a = make_skillmod(NOSKILL, 0, 2.0, 0)); /* NOSKILL means any skill */
- CuAssertIntEquals(tc, 10, effskill(u, SK_ARMORER, 0));
+ CuAssertIntEquals(tc, 10, effskill(u, SK_ARMORER, NULL));
a_remove(&u->attribs, a);
a_add(&u->attribs, a = make_skillmod(SK_ARMORER, 0, 0, 2));
- CuAssertIntEquals(tc, 7, effskill(u, SK_ARMORER, 0));
+ CuAssertIntEquals(tc, 7, effskill(u, SK_ARMORER, NULL));
a_remove(&u->attribs, a);
a_add(&u->attribs, a = make_skillmod(SK_ARMORER, cb_skillmod, 0, 0));
- CuAssertIntEquals(tc, 8, effskill(u, SK_ARMORER, 0));
+ CuAssertIntEquals(tc, 8, effskill(u, SK_ARMORER, NULL));
a_remove(&u->attribs, a);
test_teardown();
@@ -263,10 +263,10 @@ static void test_skill_hunger(CuTest *tc) {
set_level(u, SK_ARMORER, 6);
set_level(u, SK_SAILING, 6);
fset(u, UFL_HUNGER);
- CuAssertIntEquals(tc, 3, effskill(u, SK_ARMORER, 0));
- CuAssertIntEquals(tc, 5, effskill(u, SK_SAILING, 0));
+ CuAssertIntEquals(tc, 3, effskill(u, SK_ARMORER, NULL));
+ CuAssertIntEquals(tc, 5, effskill(u, SK_SAILING, NULL));
set_level(u, SK_SAILING, 2);
- CuAssertIntEquals(tc, 1, effskill(u, SK_SAILING, 0));
+ CuAssertIntEquals(tc, 1, effskill(u, SK_SAILING, NULL));
test_teardown();
}
@@ -280,21 +280,21 @@ static void test_skill_familiar(CuTest *tc) {
mag = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
fam = test_create_unit(mag->faction, test_create_region(0, 0, NULL));
set_level(fam, SK_PERCEPTION, 6);
- CuAssertIntEquals(tc, 6, effskill(fam, SK_PERCEPTION, 0));
+ CuAssertIntEquals(tc, 6, effskill(fam, SK_PERCEPTION, NULL));
set_level(mag, SK_PERCEPTION, 6);
- CuAssertIntEquals(tc, 6, effskill(mag, SK_PERCEPTION, 0));
+ CuAssertIntEquals(tc, 6, effskill(mag, SK_PERCEPTION, NULL));
/* make them mage and familiar to each other */
create_newfamiliar(mag, fam);
/* when they are in the same region, the mage gets half their skill as a bonus */
- CuAssertIntEquals(tc, 6, effskill(fam, SK_PERCEPTION, 0));
- CuAssertIntEquals(tc, 9, effskill(mag, SK_PERCEPTION, 0));
+ CuAssertIntEquals(tc, 6, effskill(fam, SK_PERCEPTION, NULL));
+ CuAssertIntEquals(tc, 9, effskill(mag, SK_PERCEPTION, NULL));
/* when they are further apart, divide bonus by distance */
r = test_create_region(3, 0, 0);
move_unit(fam, r, &r->units);
- CuAssertIntEquals(tc, 7, effskill(mag, SK_PERCEPTION, 0));
+ CuAssertIntEquals(tc, 7, effskill(mag, SK_PERCEPTION, NULL));
test_teardown();
}
diff --git a/src/laws.c b/src/laws.c
index fc1cae7e7..11f9d891b 100644
--- a/src/laws.c
+++ b/src/laws.c
@@ -2215,7 +2215,7 @@ static void reshow_other(unit * u, struct order *ord, const char *s) {
if (itype->flags & ITF_POTION) {
/* we don't have the item, but it is a potion. do we know it? */
int level = potion_level(itype);
- if (level > 0 && 2 * level <= effskill(u, SK_ALCHEMY, 0)) {
+ if (level > 0 && 2 * level <= effskill(u, SK_ALCHEMY, NULL)) {
display_potion(u, itype);
found = true;
}
@@ -2658,7 +2658,7 @@ static void age_stonecircle(building *b) {
if (mage && rt && !fval(rt->terrain, FORBIDDEN_REGION)) {
curse *c = get_curse(rt->attribs, &ct_astralblock);
if (!c) {
- int sk = effskill(mage, SK_MAGIC, 0);
+ int sk = effskill(mage, SK_MAGIC, NULL);
if (sk > 0) {
int vig = sk;
int dur = (sk + 1) / 2;
@@ -2671,7 +2671,7 @@ static void age_stonecircle(building *b) {
}
}
else {
- int sk = effskill(mage, SK_MAGIC, 0);
+ int sk = effskill(mage, SK_MAGIC, NULL);
if (c->duration < sk / 2) c->duration = sk / 2;
if (c->vigour < sk) c->vigour = sk;
}
@@ -3206,7 +3206,7 @@ static int faction_getmages(faction * f, unit ** results, int numresults)
if (u->number > 0) {
struct sc_mage * mage = get_mage(u);
if (mage && mage_get_spellbook(mage)) {
- int level = effskill(u, SK_MAGIC, 0);
+ int level = effskill(u, SK_MAGIC, NULL);
if (level > maxlevel) {
maxlevel = level;
}
@@ -3723,7 +3723,7 @@ int armedmen(const unit * u, bool siege_weapons)
item *itm;
int n = 0;
if (!(u_race(u)->flags & RCF_NOWEAPONS)) {
- if (effskill(u, SK_WEAPONLESS, 0) >= 1) {
+ if (effskill(u, SK_WEAPONLESS, NULL) >= 1) {
/* kann ohne waffen bewachen: fuer drachen */
n = u->number;
}
@@ -3734,7 +3734,7 @@ int armedmen(const unit * u, bool siege_weapons)
const weapon_type *wtype = resource2weapon(itm->type->rtype);
if (wtype == NULL || (!siege_weapons && (wtype->flags & WTF_SIEGE)))
continue;
- if (effskill(u, wtype->skill, 0) >= 1)
+ if (effskill(u, wtype->skill, NULL) >= 1)
n += itm->number;
if (n >= u->number)
break;
@@ -4030,7 +4030,7 @@ cansee(const faction * f, const region * r, const unit * u, int modifier)
if (u2->faction == f) {
if (rings < u->number || invisible(u, u2) < u->number) {
if (skill_enabled(SK_PERCEPTION)) {
- int observation = effskill(u2, SK_PERCEPTION, 0);
+ int observation = effskill(u2, SK_PERCEPTION, NULL);
if (observation >= stealth) {
return true;
@@ -4116,7 +4116,7 @@ cansee_durchgezogen(const faction * f, const region * r, const unit * u,
if (rings && invisible(u, u2) >= u->number)
continue;
- o = effskill(u2, SK_PERCEPTION, 0);
+ o = effskill(u2, SK_PERCEPTION, NULL);
if (o >= n) {
return true;
diff --git a/src/lighthouse.c b/src/lighthouse.c
index c6c7b9915..68256a692 100644
--- a/src/lighthouse.c
+++ b/src/lighthouse.c
@@ -93,7 +93,7 @@ int lighthouse_view_distance(const building * b, const unit *u)
int maxd = lighthouse_range(b);
if (maxd > 0 && u && skill_enabled(SK_PERCEPTION)) {
- int sk = effskill(u, SK_PERCEPTION, 0) / 3;
+ int sk = effskill(u, SK_PERCEPTION, NULL) / 3;
assert(u->building == b);
if (maxd > sk) maxd = sk;
}
diff --git a/src/magic.c b/src/magic.c
index ebaac3583..d8568b8cc 100644
--- a/src/magic.c
+++ b/src/magic.c
@@ -509,7 +509,7 @@ int u_hasspell(const unit *u, const struct spell *sp)
spellbook * book = unit_get_spellbook(u);
spellbook_entry * sbe = book ? spellbook_get(book, sp) : 0;
if (sbe) {
- return sbe->level <= effskill(u, SK_MAGIC, 0);
+ return sbe->level <= effskill(u, SK_MAGIC, NULL);
}
return 0;
}
@@ -521,7 +521,7 @@ int get_combatspelllevel(const unit * u, int nr)
{
int level;
if (mage_get_combatspell(get_mage(u), nr, &level) != NULL) {
- int maxlevel = effskill(u, SK_MAGIC, 0);
+ int maxlevel = effskill(u, SK_MAGIC, NULL);
if (level > maxlevel) {
return maxlevel;
}
@@ -898,7 +898,7 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord)
return false;
}
/* reicht die Stufe aus? */
- if (effskill(u, SK_MAGIC, 0) < level) {
+ if (effskill(u, SK_MAGIC, NULL) < level) {
/* die Einheit ist nicht erfahren genug für diesen Zauber */
cmistake(u, ord, 169, MSG_MAGIC);
return false;
@@ -1088,7 +1088,7 @@ variant magic_resistance(unit * target)
}
assert(target->number > 0);
/* Magier haben einen Resistenzbonus vom Magietalent * 5% */
- prob = frac_add(prob, frac_make(effskill(target, SK_MAGIC, 0), 20));
+ prob = frac_add(prob, frac_make(effskill(target, SK_MAGIC, NULL), 20));
/* Auswirkungen von Zaubern auf der Einheit */
c = get_curse(target->attribs, &ct_magicresistance);
@@ -1184,10 +1184,10 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
skill *sv;
unit *u = (unit *)obj;
- at = effskill(magician, SK_MAGIC, 0);
+ at = effskill(magician, SK_MAGIC, NULL);
for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) {
- int sk = eff_skill(u, sv, 0);
+ int sk = eff_skill(u, sv, NULL);
if (pa < sk)
pa = sk;
}
@@ -1432,7 +1432,7 @@ static double regeneration(unit * u)
double potenz = 1.5;
double divisor = 2.0;
- sk = effskill(u, SK_MAGIC, 0);
+ sk = effskill(u, SK_MAGIC, NULL);
/* Rassenbonus/-malus */
d = pow(sk, potenz) * u_race(u)->regaura / divisor;
d++;
@@ -2531,7 +2531,7 @@ static castorder *cast_cmd(unit * u, order * ord)
cmistake(u, ord, 269, MSG_MAGIC);
return 0;
}
- level = effskill(u, SK_MAGIC, 0);
+ level = effskill(u, SK_MAGIC, NULL);
init_order_depr(ord);
s = gettoken(token, sizeof(token));
@@ -2664,7 +2664,7 @@ static castorder *cast_cmd(unit * u, order * ord)
}
/* Stufenangabe bei nicht Stufenvariierbaren Sprüchen abfangen */
if (!(sp->sptyp & SPELLLEVEL)) {
- int ilevel = effskill(u, SK_MAGIC, 0);
+ int ilevel = effskill(u, SK_MAGIC, NULL);
if (ilevel != level) {
level = ilevel;
ADDMSG(&u->faction->msgs, msg_message("spellfail::nolevel",
@@ -2691,7 +2691,7 @@ static castorder *cast_cmd(unit * u, order * ord)
"mage", mage));
return 0;
}
- sk = effskill(mage, SK_MAGIC, 0);
+ sk = effskill(mage, SK_MAGIC, NULL);
if (distance(mage->region, r) > sk) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "familiar_toofar",
"mage", mage));
diff --git a/src/monsters.c b/src/monsters.c
index 0d383ac05..15e9bc0b0 100644
--- a/src/monsters.c
+++ b/src/monsters.c
@@ -836,7 +836,7 @@ void plan_monsters(faction * f)
/* Einheiten, die Waffenlosen Kampf lernen k�nnten, lernen es um
* zu bewachen: */
if (rc->bonus[SK_WEAPONLESS] != -99) {
- if (effskill(u, SK_WEAPONLESS, 0) < 1) {
+ if (effskill(u, SK_WEAPONLESS, NULL) < 1) {
long_order =
create_order(K_STUDY, f->locale, "'%s'",
skillname(SK_WEAPONLESS, f->locale));
diff --git a/src/move.c b/src/move.c
index c919bc041..e73d4f92a 100644
--- a/src/move.c
+++ b/src/move.c
@@ -271,7 +271,7 @@ static int ridingcapacity(const unit * u)
** tragen nichts (siehe walkingcapacity). Ein Wagen zählt nur, wenn er
** von zwei Pferden gezogen wird */
- horses = effskill(u, SK_RIDING, 0) * u->number * 2;
+ horses = effskill(u, SK_RIDING, NULL) * u->number * 2;
if (animals > horses) animals = horses;
if (fval(u_race(u), RCF_HORSE))
@@ -298,7 +298,7 @@ int walkingcapacity(const struct unit *u)
/* Das Gewicht, welches die Pferde tragen, plus das Gewicht, welches
* die Leute tragen */
- horses = effskill(u, SK_RIDING, 0) * u->number * 4;
+ horses = effskill(u, SK_RIDING, NULL) * u->number * 4;
pferde_fuer_wagen = (animals < horses) ? animals : horses;
if (fval(u_race(u), RCF_HORSE)) {
animals += u->number;
@@ -376,7 +376,7 @@ static int canwalk(unit * u)
get_transporters(u->items, &animals, &acap, &vehicles, &vcap);
- effsk = effskill(u, SK_RIDING, 0);
+ effsk = effskill(u, SK_RIDING, NULL);
maxwagen = effsk * u->number * 2;
if (u_race(u) == get_race(RC_TROLL)) {
int trolls = u->number / 4;
@@ -406,7 +406,7 @@ static int canwalk(unit * u)
bool canfly(unit * u)
{
- if (i_get(u->items, it_find("pegasus")) >= u->number && effskill(u, SK_RIDING, 0) >= 4)
+ if (i_get(u->items, it_find("pegasus")) >= u->number && effskill(u, SK_RIDING, NULL) >= 4)
return true;
if (fval(u_race(u), RCF_FLY))
@@ -420,7 +420,7 @@ bool canfly(unit * u)
bool canswim(unit * u)
{
- if (i_get(u->items, it_find("dolphin")) >= u->number && effskill(u, SK_RIDING, 0) >= 4)
+ if (i_get(u->items, it_find("dolphin")) >= u->number && effskill(u, SK_RIDING, NULL) >= 4)
return true;
if (u_race(u)->flags & RCF_FLY)
@@ -441,7 +441,7 @@ bool canswim(unit * u)
static int walk_mode(const unit * u)
{
int horses = 0, maxhorses, unicorns = 0, maxunicorns;
- int skill = effskill(u, SK_RIDING, 0);
+ int skill = effskill(u, SK_RIDING, NULL);
item *itm;
const item_type *it_horse, *it_elvenhorse, *it_charger;
const resource_type *rtype;
@@ -1979,11 +1979,11 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting)
for (u2 = current_point->units; u2; u2 = u2->next) {
if (u2->ship == sh && !alliedunit(harbourmaster, u->faction, HELP_GUARD)) {
- if (effskill(harbourmaster, SK_PERCEPTION, 0) > effskill(u2, SK_STEALTH, 0)) {
+ if (effskill(harbourmaster, SK_PERCEPTION, NULL) > effskill(u2, SK_STEALTH, NULL)) {
for (itm = u2->items; itm; itm = itm->next) {
const luxury_type *ltype = resource2luxury(itm->type->rtype);
if (ltype != NULL && itm->number > 0) {
- int st = itm->number * effskill(harbourmaster, SK_TRADE, 0) / 50;
+ int st = itm->number * effskill(harbourmaster, SK_TRADE, NULL) / 50;
if (st > itm->number) st = itm->number;
if (st > 0) {
diff --git a/src/reports.c b/src/reports.c
index b7279f7ef..3b808f3e7 100644
--- a/src/reports.c
+++ b/src/reports.c
@@ -562,7 +562,7 @@ report_resources(const region * r, resource_report * result, int size,
int maxskill = 0;
for (u = r->units; visible != res->amount && u != NULL; u = u->next) {
if (u->faction == viewer) {
- int s = effskill(u, skill, 0);
+ int s = effskill(u, skill, NULL);
if (s > maxskill) {
maxskill = s;
visible = raw->visible(res, maxskill);
@@ -621,7 +621,7 @@ static void spskill(sbstring *sbp, const struct locale * lang,
}
}
- effsk = eff_skill(u, sv, 0);
+ effsk = eff_skill(u, sv, NULL);
sbs_strcat(sbp, str_itoa(effsk));
if (u->faction->options & WANT_OPTION(O_SHOWSKCHANGE)) {
@@ -810,7 +810,7 @@ void bufunit(const faction * f, const unit * u, const faction *fv,
if (book) {
selist *ql = book->spells;
- int qi, header, maxlevel = effskill(u, SK_MAGIC, 0);
+ int qi, header, maxlevel = effskill(u, SK_MAGIC, NULL);
sbs_strcat(sbp, ". Aura ");
sbs_strcat(sbp, str_itoa(get_spellpoints(u)));
sbs_strcat(sbp, "/");
diff --git a/src/spells.c b/src/spells.c
index b29e86ea9..f74cc100d 100644
--- a/src/spells.c
+++ b/src/spells.c
@@ -474,7 +474,7 @@ report_effect(region * r, unit * mage, message * seen, message * unseen)
* Spezielle V. fuer Katzen, Trolle, Elfen, Daemonen, Insekten, Zwerge?
*/
-static const race *select_familiar(const race * magerace, magic_t magiegebiet)
+static const race *select_familiar(const race * magerace, int level, magic_t magiegebiet)
{
const race *retval;
int rnd = rng_int() % 100;
@@ -493,7 +493,7 @@ static const race *select_familiar(const race * magerace, magic_t magiegebiet)
}
assert(magerace->familiars[0]);
- if (rnd >= 70) {
+ if (rnd >= 100 - (level * 5)) {
retval = magerace->familiars[magiegebiet];
assert(retval);
}
@@ -501,7 +501,7 @@ static const race *select_familiar(const race * magerace, magic_t magiegebiet)
retval = magerace->familiars[0];
}
- if (!retval || rnd < 3) {
+ if (!retval || rnd < level) {
race_list *familiarraces = get_familiarraces();
unsigned int maxlen = listlen(familiarraces);
if (maxlen > 0) {
@@ -557,7 +557,7 @@ static int sp_summon_familiar(castorder * co)
cmistake(caster, co->order, 199, MSG_MAGIC);
return 0;
}
- rc = select_familiar(caster->_race, caster->faction->magiegebiet);
+ rc = select_familiar(caster->_race, cast_level, caster->faction->magiegebiet);
if (rc == NULL) {
log_error("could not find suitable familiar for %s.\n", caster->faction->race->_name);
return 0;
@@ -2510,7 +2510,7 @@ static int sp_fumblecurse(castorder * co)
target = pa->param[0]->data.u;
- duration = cast_level - effskill(target, SK_MAGIC, 0);
+ duration = cast_level - effskill(target, SK_MAGIC, NULL);
if (duration < 2) {
int rx = rng_int() % 3;
if (duration < rx) duration = rx;
@@ -3192,7 +3192,7 @@ static int sp_bloodsacrifice(castorder * co)
unit *caster = co_get_caster(co);
int cast_level = co->level;
int aura;
- int skill = effskill(caster, SK_MAGIC, 0);
+ int skill = effskill(caster, SK_MAGIC, NULL);
int hp = (int)(co->force * 8);
if (hp <= 0) {
@@ -3531,11 +3531,11 @@ static int sp_charmingsong(castorder * co)
}
/* Magieresistensbonus fuer hoehere Talentwerte */
for (i = 0; i < MAXSKILLS; i++) {
- int sk = effskill(target, i, 0);
+ int sk = effskill(target, i, NULL);
if (tb < sk)
tb = sk;
}
- tb -= effskill(mage, SK_MAGIC, 0);
+ tb -= effskill(mage, SK_MAGIC, NULL);
if (tb > 0) {
resist_bonus += tb * 15;
}
@@ -4078,7 +4078,7 @@ static int sp_pump(castorder * co)
return cast_level / 2;
}
- set_observer(rt, mage->faction, effskill(target, SK_PERCEPTION, 0), 2);
+ set_observer(rt, mage->faction, effskill(target, SK_PERCEPTION, NULL), 2);
return cast_level;
}
diff --git a/src/spy.c b/src/spy.c
index c0d4d614c..8ade569c6 100644
--- a/src/spy.c
+++ b/src/spy.c
@@ -138,14 +138,14 @@ int spy_cmd(unit * u, struct order *ord)
msg_feedback(u, u->thisorder, "feedback_unit_not_found", ""));
return 0;
}
- if (effskill(u, SK_SPY, 0) < 1) {
+ if (effskill(u, SK_SPY, NULL) < 1) {
cmistake(u, u->thisorder, 39, MSG_EVENT);
return 0;
}
/* Die Grundchance fuer einen erfolgreichen Spionage-Versuch ist 10%.
* Fuer jeden Talentpunkt, den das Spionagetalent das Tarnungstalent
* des Opfers uebersteigt, erhoeht sich dieses um 5%*/
- spy = effskill(u, SK_SPY, 0) - effskill(target, SK_STEALTH, r);
+ spy = effskill(u, SK_SPY, NULL) - effskill(target, SK_STEALTH, r);
spychance = 0.1 + fmax(spy * 0.05, 0.0);
if (chance(spychance)) {
@@ -159,7 +159,7 @@ int spy_cmd(unit * u, struct order *ord)
/* der Spion kann identifiziert werden, wenn das Opfer bessere
* Wahrnehmung als das Ziel Tarnung + Spionage/2 hat */
observe = effskill(target, SK_PERCEPTION, r)
- - (effskill(u, SK_STEALTH, 0) + effskill(u, SK_SPY, 0) / 2);
+ - (effskill(u, SK_STEALTH, NULL) + effskill(u, SK_SPY, NULL) / 2);
if (invisible(u, target) >= u->number) {
if (observe > 0) observe = 0;
@@ -168,8 +168,8 @@ int spy_cmd(unit * u, struct order *ord)
/* Anschliessend wird - unabhaengig vom Erfolg - gewuerfelt, ob der
* Spionageversuch bemerkt wurde. Die Wahrscheinlich dafuer ist (100 -
* SpionageSpion*5 + WahrnehmungOpfer*2)%. */
- observechance = 1.0 - (effskill(u, SK_SPY, 0) * 0.05)
- + (effskill(target, SK_PERCEPTION, 0) * 0.02);
+ observechance = 1.0 - (effskill(u, SK_SPY, NULL) * 0.05)
+ + (effskill(target, SK_PERCEPTION, NULL) * 0.02);
if (chance(observechance)) {
ADDMSG(&target->faction->msgs, msg_message("spydetect",
@@ -232,7 +232,7 @@ int setstealth_cmd(unit * u, struct order *ord)
if (isdigit(*(const unsigned char *)s)) {
/* Tarnungslevel setzen */
level = atoi((const char *)s);
- if (level > effskill(u, SK_STEALTH, 0)) {
+ if (level > effskill(u, SK_STEALTH, NULL)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_lowstealth", ""));
return 0;
}
@@ -343,7 +343,7 @@ static int top_skill(region * r, faction * f, ship * sh, skill_t sk)
for (u = r->units; u; u = u->next) {
if (u->ship == sh && u->faction == f) {
- int s = effskill(u, sk, 0);
+ int s = effskill(u, sk, NULL);
if (value < s) value = s;
}
}
@@ -456,7 +456,7 @@ int sabotage_cmd(unit * u, struct order *ord)
u2 = ship_owner(sh);
if (u2->faction != u->faction) {
skdiff =
- effskill(u, SK_SPY, 0) - top_skill(u->region, u2->faction, sh, SK_PERCEPTION);
+ effskill(u, SK_SPY, NULL) - top_skill(u->region, u2->faction, sh, SK_PERCEPTION);
}
if (try_destruction(u, u2, sh, skdiff)) {
sink_ship(sh);
diff --git a/src/steal.c b/src/steal.c
index 8a390c8fb..633fc14dd 100644
--- a/src/steal.c
+++ b/src/steal.c
@@ -102,7 +102,7 @@ static int max_skill(region * r, struct faction * f, skill_t sk)
for (u = r->units; u; u = u->next) {
if (u->faction == f) {
- int effsk = effskill(u, sk, 0);
+ int effsk = effskill(u, sk, NULL);
if (effsk > w) {
w = effsk;
}
@@ -189,7 +189,7 @@ void steal_cmd(unit * u, struct order *ord, econ_request ** stealorders)
assert(u->region == u2->region);
- effsk = effskill(u, SK_STEALTH, 0);
+ effsk = effskill(u, SK_STEALTH, NULL);
n = effsk - max_skill(r, f, SK_PERCEPTION);
if (n <= 0) {
diff --git a/src/study.c b/src/study.c
index 977e8a7eb..a53942a39 100644
--- a/src/study.c
+++ b/src/study.c
@@ -510,7 +510,7 @@ static bool cb_msg_teach(void *el, void *arg) {
if (feedback) {
ADDMSG(&ut->faction->msgs, msg_message("teach_teacher",
"teacher student skill level", ut, u, sk,
- effskill(u, sk, 0)));
+ effskill(u, sk, NULL)));
}
ADDMSG(&u->faction->msgs, msg_message("teach_student",
"teacher student skill", ut, u, sk));
@@ -691,7 +691,7 @@ int study_cmd(unit * u, order * ord)
}
}
if (sk == SK_ALCHEMY) {
- maxalchemy = effskill(u, SK_ALCHEMY, 0);
+ maxalchemy = effskill(u, SK_ALCHEMY, NULL);
if (!has_skill(u, SK_ALCHEMY)) {
int amax = skill_limit(u->faction, SK_ALCHEMY);
if (count_skill(u->faction, SK_ALCHEMY) + u->number > amax) {
@@ -780,7 +780,7 @@ int study_cmd(unit * u, order * ord)
if (sk == SK_ALCHEMY) {
faction *f = u->faction;
- int skill = effskill(u, SK_ALCHEMY, 0);
+ int skill = effskill(u, SK_ALCHEMY, NULL);
if (skill > maxalchemy) {
show_potions(f, skill);
}