From 335740d12b3e70e44b1f00c2414fa49e2a494642 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 23 Mar 2021 21:03:12 +0100 Subject: [PATCH] undo curse_active change curses should survive the death of a magician. good dreams needs a magician to decide allegiance. --- CHANGELOG.md | 5 +++-- src/kernel/curse.c | 5 +---- src/kernel/curse.test.c | 11 +---------- src/kernel/unit.c | 2 +- src/kernel/unit.test.c | 27 +++++++++++++++++++-------- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 347c70509..7f32eafdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # 3.28 - - Bugfix für Schild des Fisches (Solthar) - - Dämonen können magisch reanimiert werden. + - Bugfix für Schild des Fisches (Solthar) + - Dämonen können magisch reanimiert werden. + - "Schöne Träume" verliert seine Wirkung, wenn der Zauberer stirbt. # 3.27 diff --git a/src/kernel/curse.c b/src/kernel/curse.c index 10c72b5cf..a6a6b5dfe 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -649,10 +649,7 @@ bool curse_active(const curse * c) return false; if (c_flags(c) & CURSE_ISNEW) return false; - if (c->vigour <= 0) - return false; - - return c->magician && c->magician->region && (c->magician->number > 0); + return c->vigour > 0; } bool is_cursed_with(const attrib * ap, const curse * c) diff --git a/src/kernel/curse.test.c b/src/kernel/curse.test.c index f13e646eb..e3767b236 100644 --- a/src/kernel/curse.test.c +++ b/src/kernel/curse.test.c @@ -210,17 +210,8 @@ static void test_curse_active(CuTest *tc) { c->mask = CURSE_ISNEW; CuAssertTrue(tc, !curse_active(c)); c->mask = 0; - - u->number = 0; - CuAssertTrue(tc, !curse_active(c)); - u->number = 1; - c->magician = NULL; - CuAssertTrue(tc, !curse_active(c)); - c->magician = u; - - u->region = NULL; - CuAssertTrue(tc, !curse_active(c)); + CuAssertTrue(tc, curse_active(c)); test_teardown(); } diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 433bf0dd1..3bdd64862 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -1077,7 +1077,7 @@ static int att_modification(const unit * u, skill_t sk) attrib *a = a_find(u->region->attribs, &at_curse); while (a && a->type == &at_curse) { curse *c = (curse *)a->data.v; - if (c->type == &ct_gbdream && curse_active(c)) { + if (c->magician && c->magician->number > 0 && c->type == &ct_gbdream && curse_active(c)) { int effect = curse_geteffect_int(c); bool allied = alliedunit(c->magician, u->faction, HELP_GUARD); if (allied) { diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 092585fd7..e77c51ea2 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -649,23 +649,34 @@ static void test_get_modifier(CuTest *tc) { static void test_get_modifier_cursed(CuTest *tc) { region *r; - unit *u; + unit *u, *u2, *u3; + curse *c; test_setup(); u = test_create_unit(test_create_faction(), r = test_create_plain(0, 0)); - set_level(u, SK_TAXING, 1); + u2 = test_create_unit(u->faction, r); /* allied */ + u3 = test_create_unit(test_create_faction(), r); /* not allied */ + set_level(u2, SK_TAXING, 1); + set_level(u3, SK_TAXING, 1); /* default: no effects: */ - CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u2, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u3, SK_TAXING, 1, r, true)); /* cursed with good dreams */ - create_curse(u, &r->attribs, &ct_gbdream, 1, 1, 1, 0); - CuAssertIntEquals(tc, 1, get_modifier(u, SK_TAXING, 1, r, true)); - a_removeall(&r->attribs, NULL); + c = create_curse(u, &r->attribs, &ct_gbdream, 1, 1, 1, 0); + CuAssertIntEquals(tc, 1, get_modifier(u2, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u3, SK_TAXING, 1, r, true)); + + /* cursed with good dreams, but magician just died */ + u->number = 0; + CuAssertIntEquals(tc, 0, get_modifier(u2, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u3, SK_TAXING, 1, r, true)); /* cursed with good dreams, but magician is dead */ - create_curse(NULL, &r->attribs, &ct_gbdream, 1, 1, 1, 0); - CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 1, r, true)); + c->magician = NULL; + CuAssertIntEquals(tc, 0, get_modifier(u2, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u3, SK_TAXING, 1, r, true)); test_teardown(); }