From 58c310de298b2ebfdd7a47e44c900b95bee8dac3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 27 Mar 2021 19:12:12 +0100 Subject: [PATCH] a working stone circle boosts magic resistance of people inside. --- src/magic.c | 5 ++--- src/magic.test.c | 17 +++++++++-------- src/spells/magicresistance.test.c | 9 ++++++++- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/magic.c b/src/magic.c index 4bf27626f..3479ba865 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1116,12 +1116,11 @@ variant magic_resistance(const unit * target) /* Bonus durch Gebaeude */ { struct building *b = inside_building(target); - const struct building_type *btype = building_is_active(b) ? b->type : NULL; /* gesegneter Steinkreis gibt 30% dazu */ - if (btype) { + if (b && b->type->magresbonus && building_is_active(b)) { /* TODO: legacy. building-bonus is an integer-percentage */ - prob = frac_add(prob, frac_make(btype->magresbonus, 100)); + prob = frac_add(prob, frac_make(b->type->magresbonus, 100)); } } diff --git a/src/magic.test.c b/src/magic.test.c index 31798490b..c97a06b33 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -507,24 +507,25 @@ static void test_resist_chance(CuTest *tc) { static void test_magic_resistance(CuTest *tc) { unit *u; race *rc; + building_type *btype; test_setup(); + rc = test_create_race("human"); u = test_create_unit(test_create_faction_ex(rc, NULL), test_create_plain(0, 0)); + btype = test_create_buildingtype("stonecircle"); + btype->magresbonus = 20; /* this building gives +20% magic resistance */ + u->building = test_create_building(u->region, btype); + u->building->flags = BLD_MAINTAINED; + CuAssertTrue(tc, frac_equal(frac_make(1, 5), magic_resistance(u))); + u->building = NULL; + /* 5% bonus in magic resistance for each magic level */ set_level(u, SK_MAGIC, 4); /* makes for 20% */ CuAssertTrue(tc, frac_equal(frac_make(1, 5), magic_resistance(u))); set_level(u, SK_MAGIC, 0); - /* TODO: - * - ct_magicresistance - * - ct_badmagicresistancezone - * - ct_goodmagicresistancezone - * - alliedunit - * - stone circles - */ - CuAssertTrue(tc, frac_equal(rc->magres, magic_resistance(u))); rc->magres = frac_one; CuAssert(tc, "magic resistance is capped at 0.9", frac_equal(magic_resistance(u), frac_make(9, 10))); diff --git a/src/spells/magicresistance.test.c b/src/spells/magicresistance.test.c index 4fd20b50f..12b9a4898 100644 --- a/src/spells/magicresistance.test.c +++ b/src/spells/magicresistance.test.c @@ -24,6 +24,10 @@ #include #include +/* TODO: + * - ct_magicresistance on buildings + * - stone circles + */ static void test_magicresistance_curse_effects(CuTest *tc) { struct region *r; @@ -114,6 +118,9 @@ static void test_magicresistance_unit(CuTest *tc) { test_teardown(); } +/** + * Test for spell "Heimstein" + */ static void test_magicresistance_building(CuTest *tc) { struct region *r; struct faction *f1; @@ -130,7 +137,7 @@ static void test_magicresistance_building(CuTest *tc) { u1 = test_create_unit(f1, r); b1 = test_create_building(r, NULL); - + u1->building = b1; c = create_curse(u1, &b1->attribs, &ct_magicresistance, 10, 20, 30, 0); CuAssertPtrNotNull(tc, b1->attribs); CuAssertPtrEquals(tc, (void *)&at_curse, (void *)b1->attribs->type);