diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 037898ed9..ada49aad9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -210,6 +210,7 @@ set(TESTS_SRC upkeep.test.c spells/flyingship.test.c spells/magicresistance.test.c + triggers/shock.test.c ${ATTRIBUTES_TESTS} ${UTIL_TESTS} ${KERNEL_TESTS} diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 0fd58a55a..db2751026 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -123,11 +123,11 @@ static void test_scale_number(CuTest *tc) { u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0)); change_effect(u, ptype, 1); CuAssertIntEquals(tc, 1, u->number); - CuAssertIntEquals(tc, 1, u->hp); + CuAssertIntEquals(tc, 20, u->hp); CuAssertIntEquals(tc, 1, get_effect(u, ptype)); scale_number(u, 2); CuAssertIntEquals(tc, 2, u->number); - CuAssertIntEquals(tc, 2, u->hp); + CuAssertIntEquals(tc, 40, u->hp); CuAssertIntEquals(tc, 2, get_effect(u, ptype)); set_level(u, SK_ALCHEMY, 1); scale_number(u, 0); diff --git a/src/magic.c b/src/magic.c index d65685aff..ce69df78f 100644 --- a/src/magic.c +++ b/src/magic.c @@ -995,6 +995,11 @@ cancast(unit * u, const spell * sp, int level, int range, struct order * ord) if (reslist != NULL) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "missing_components_list", "list", reslist)); + while (reslist) { + resource *res = reslist->next; + free(reslist); + reslist = res; + } return false; } return true; @@ -2985,6 +2990,8 @@ spellbook * get_spellbook(const char * name) log_error("cb_insert failed although cb_find returned nothing for spellbook=%s", name); assert(!"should not happen"); } + cb_find_prefix(&cb_spellbooks, name, strlen(name), &match, 1, 0); + cb_get_kv(match, &result, sizeof(result)); } return result; } diff --git a/src/magic.test.c b/src/magic.test.c index f356fa686..b208836f9 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -53,8 +53,9 @@ void test_spellbooks(CuTest * tc) test_cleanup(); herp = get_spellbook("herp"); - derp = get_spellbook("derp"); CuAssertPtrNotNull(tc, herp); + CuAssertPtrEquals(tc, herp, get_spellbook("herp")); + derp = get_spellbook("derp"); CuAssertPtrNotNull(tc, derp); CuAssertTrue(tc, derp != herp); CuAssertStrEquals(tc, "herp", herp->name); diff --git a/src/test_eressea.c b/src/test_eressea.c index c04764992..8f5c1faa0 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -127,6 +127,7 @@ int RunAllTests(int argc, char *argv[]) ADD_SUITE(wormhole); ADD_SUITE(spy); ADD_SUITE(study); + ADD_SUITE(shock); if (suites) { CuSuite *summary = CuSuiteNew(); diff --git a/src/tests.c b/src/tests.c index 8cf97bede..e7518211e 100644 --- a/src/tests.c +++ b/src/tests.c @@ -35,6 +35,8 @@ struct race *test_create_race(const char *name) { race *rc = rc_get_or_create(name); rc->maintenance = 10; + rc->hitpoints = 20; + rc->maxaura = 1.0; rc->ec_flags |= GETITEM; return rc; } @@ -59,7 +61,7 @@ struct region *test_create_region(int x, int y, const terrain_type *terrain) struct faction *test_create_faction(const struct race *rc) { - faction *f = addfaction("nobody@eressea.de", NULL, rc ? rc : rc_get_or_create("human"), default_locale, 0); + faction *f = addfaction("nobody@eressea.de", NULL, rc ? rc : test_create_race("human"), default_locale, 0); return f; } diff --git a/src/triggers/shock.c b/src/triggers/shock.c index fd52c49b5..95e7b61b6 100644 --- a/src/triggers/shock.c +++ b/src/triggers/shock.c @@ -59,13 +59,18 @@ static void do_shock(unit * u, const char *reason) if (u->number > 0) { /* HP - Verlust */ - u->hp = (unit_max_hp(u) * u->number) / 10; - u->hp = _max(1, u->hp); + int hp = (unit_max_hp(u) * u->number) / 10; + hp = _min(u->hp, hp); + u->hp = _max(1, hp); } /* Aura - Verlust */ if (is_mage(u)) { - set_spellpoints(u, max_spellpoints(u->region, u) / 10); + int aura = max_spellpoints(u->region, u) / 10; + int now = get_spellpoints(u); + if (now > aura) { + set_spellpoints(u, aura); + } } /* Evt. Talenttageverlust */ @@ -86,7 +91,7 @@ static void do_shock(unit * u, const char *reason) } if (u->faction != NULL) { ADDMSG(&u->faction->msgs, msg_message("shock", - "mage reason", u, _strdup(reason))); + "mage reason", u, reason)); } } diff --git a/src/triggers/shock.test.c b/src/triggers/shock.test.c new file mode 100644 index 000000000..8957c33fc --- /dev/null +++ b/src/triggers/shock.test.c @@ -0,0 +1,53 @@ +#include +#include "shock.h" +#include "../magic.h" + +#include +#include +#include + +#include +#include + +static void test_shock(CuTest *tc) { + unit *u; + trigger *tt; + test_cleanup(); + + u = test_create_unit(test_create_faction(0), test_create_region(0, 0, 0)); + create_mage(u, M_GRAY); + set_level(u, SK_MAGIC, 5); + set_spellpoints(u, 10); + u->hp = 10; + tt = trigger_shock(u); + tt->type->handle(tt, u); + CuAssertIntEquals(tc, 2, u->hp); + CuAssertIntEquals(tc, 2, get_spellpoints(u)); + CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "shock")); + test_cleanup(); +} + +static void test_shock_low(CuTest *tc) { + unit *u; + trigger *tt; + test_cleanup(); + + u = test_create_unit(test_create_faction(0), test_create_region(0, 0, 0)); + create_mage(u, M_GRAY); + set_level(u, SK_MAGIC, 5); + set_spellpoints(u, 1); + u->hp = 1; + tt = trigger_shock(u); + tt->type->handle(tt, u); + CuAssertIntEquals(tc, 1, u->hp); + CuAssertIntEquals(tc, 1, get_spellpoints(u)); + test_cleanup(); +} + +CuSuite *get_shock_suite(void) +{ + CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_shock); + SUITE_ADD_TEST(suite, test_shock_low); + return suite; +}