Merge pull request #381 from ennorehling/develop

shock trigger fix
This commit is contained in:
Enno Rehling 2015-11-09 19:53:48 +01:00
commit bed1d6e6ae
8 changed files with 78 additions and 8 deletions

View file

@ -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}

View file

@ -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);

View file

@ -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;
}

View file

@ -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);

View file

@ -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();

View file

@ -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;
}

View file

@ -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));
}
}

53
src/triggers/shock.test.c Normal file
View file

@ -0,0 +1,53 @@
#include <platform.h>
#include "shock.h"
#include "../magic.h"
#include <kernel/unit.h>
#include <kernel/faction.h>
#include <util/event.h>
#include <tests.h>
#include <CuTest.h>
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;
}