From dba46ac4806de394164da155d6dc8d69635eb418 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 22 Jan 2019 16:17:16 +0100 Subject: [PATCH 1/3] add scan-build to travis build --- .travis.yml | 1 + s/travis-build | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c6a21d0e4..5f7569cec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ addons: - libxml2-dev - valgrind - cppcheck + - clang-tools - shellcheck os: - linux 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 From ef8139067efca5478ffb2e4159d6a34c4071f525 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 22 Jan 2019 16:48:22 +0100 Subject: [PATCH 2/3] Remove missing package Ok --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5f7569cec..c6a21d0e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,6 @@ addons: - libxml2-dev - valgrind - cppcheck - - clang-tools - shellcheck os: - linux From af91459fb175f9bf058571d0bbe630a5b16fd96f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 2 Feb 2019 20:36:23 +0100 Subject: [PATCH 3/3] add some variety to familiar selection. effskill: use NULL, not 0 for pointer arguments. --- clibs | 2 +- res/core/messages.xml | 4 ---- res/translations/messages.de.po | 3 --- res/translations/messages.en.po | 3 --- src/alchemy.c | 4 ++-- src/battle.c | 28 ++++++++++++++-------------- src/bind_unit.c | 2 +- src/creport.c | 4 ++-- src/economy.c | 32 ++++++++++++++++---------------- src/items.c | 2 +- src/kernel/build.c | 16 ++++++++-------- src/kernel/save.c | 2 +- src/kernel/ship.c | 6 +++--- src/kernel/unit.test.c | 26 +++++++++++++------------- src/laws.c | 16 ++++++++-------- src/lighthouse.c | 2 +- src/magic.c | 20 ++++++++++---------- src/monsters.c | 2 +- src/move.c | 16 ++++++++-------- src/reports.c | 6 +++--- src/spells.c | 18 +++++++++--------- src/spy.c | 16 ++++++++-------- src/steal.c | 4 ++-- src/study.c | 6 +++--- 24 files changed, 115 insertions(+), 125 deletions(-) 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/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 3ac9dffe9..625a78bdf 100644 --- a/src/creport.c +++ b/src/creport.c @@ -945,7 +945,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 */ mage = get_mage(u); 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); }