testing for magic resistance curses.

This commit is contained in:
Enno Rehling 2021-03-27 18:56:17 +01:00
parent 60fe8e6200
commit 721442584c
3 changed files with 99 additions and 14 deletions

View File

@ -1070,8 +1070,9 @@ variant magic_resistance(const unit * target)
c = get_curse(target->attribs, &ct_magicresistance); c = get_curse(target->attribs, &ct_magicresistance);
if (c) { if (c) {
/* TODO: legacy. magicresistance-effect is an integer-percentage stored in a double */ /* TODO: legacy. magicresistance-effect is an integer-percentage stored in a double */
int effect = curse_geteffect_int(c) * get_cursedmen(target, c); variant effect = frac_make(curse_geteffect_int(c), 100);
prob = frac_add(prob, frac_make(effect, 100)); effect = frac_mul(effect, frac_make(get_cursedmen(target, c), target->number));
prob = frac_add(prob, effect);
} }
/* Unicorn +10 */ /* Unicorn +10 */

View File

@ -6,13 +6,18 @@
#include "give.h" #include "give.h"
#include "teleport.h" #include "teleport.h"
#include <kernel/callbacks.h> #include <util/language.h>
#include <util/strings.h>
#include <kernel/ally.h>
#include <kernel/attrib.h>
#include <kernel/building.h> #include <kernel/building.h>
#include <kernel/race.h> #include <kernel/callbacks.h>
#include <kernel/equipment.h> #include <kernel/equipment.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include <kernel/order.h>
#include <kernel/item.h> #include <kernel/item.h>
#include <kernel/order.h>
#include <kernel/race.h>
#include <kernel/region.h> #include <kernel/region.h>
#include <kernel/spell.h> #include <kernel/spell.h>
#include <kernel/spellbook.h> #include <kernel/spellbook.h>
@ -20,10 +25,6 @@
#include <kernel/objtypes.h> #include <kernel/objtypes.h>
#include <kernel/pool.h> #include <kernel/pool.h>
#include <kernel/attrib.h>
#include <util/language.h>
#include <util/strings.h>
#include <CuTest.h> #include <CuTest.h>
#include <selist.h> #include <selist.h>
#include <tests.h> #include <tests.h>
@ -439,7 +440,16 @@ static void test_resist_chance(CuTest *tc) {
prob = resist_chance(u1, u4, TYP_UNIT, 10); prob = resist_chance(u1, u4, TYP_UNIT, 10);
CuAssertIntEquals(tc, 0, prob.sa[0]); CuAssertIntEquals(tc, 0, prob.sa[0]);
/* allied units do not resist */ /* allied units can still resist */
ally_set(&u3->faction->allies, u1->faction, HELP_GUARD);
prob = resist_chance(u1, u3, TYP_UNIT, 0);
prob = frac_sub(prob, frac_make(1, 2)); /* resist at 50% base chance */
CuAssertIntEquals(tc, 0, prob.sa[0]);
prob = resist_chance(u1, u3, TYP_UNIT, 10);
prob = frac_sub(prob, frac_make(3, 5)); /* resist at 10% + 50% base chance */
CuAssertIntEquals(tc, 0, prob.sa[0]);
ally_set(&u3->faction->allies, u1->faction, 0);
contact_unit(u3, u1); contact_unit(u3, u1);
prob = resist_chance(u1, u3, TYP_UNIT, 0); prob = resist_chance(u1, u3, TYP_UNIT, 0);
CuAssertIntEquals(tc, 0, prob.sa[0]); CuAssertIntEquals(tc, 0, prob.sa[0]);
@ -507,6 +517,14 @@ static void test_magic_resistance(CuTest *tc) {
CuAssertTrue(tc, frac_equal(frac_make(1, 5), magic_resistance(u))); CuAssertTrue(tc, frac_equal(frac_make(1, 5), magic_resistance(u)));
set_level(u, SK_MAGIC, 0); 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))); CuAssertTrue(tc, frac_equal(rc->magres, magic_resistance(u)));
rc->magres = frac_one; rc->magres = frac_one;
CuAssert(tc, "magic resistance is capped at 0.9", frac_equal(magic_resistance(u), frac_make(9, 10))); CuAssert(tc, "magic resistance is capped at 0.9", frac_equal(magic_resistance(u), frac_make(9, 10)));

View File

@ -1,4 +1,10 @@
#include <platform.h> #include "spells.h"
#include "magic.h"
#include <spells/regioncurse.h>
#include <kernel/ally.h>
#include <kernel/attrib.h>
#include <kernel/curse.h> #include <kernel/curse.h>
#include <kernel/building.h> #include <kernel/building.h>
#include <kernel/faction.h> #include <kernel/faction.h>
@ -6,11 +12,9 @@
#include <kernel/region.h> #include <kernel/region.h>
#include <kernel/spell.h> #include <kernel/spell.h>
#include <kernel/unit.h> #include <kernel/unit.h>
#include <util/message.h> #include <util/message.h>
#include <util/language.h> #include <util/language.h>
#include <kernel/attrib.h>
#include <spells/regioncurse.h>
#include "spells.h"
#include <CuTest.h> #include <CuTest.h>
#include <tests.h> #include <tests.h>
@ -21,6 +25,67 @@
#include <assert.h> #include <assert.h>
static void test_magicresistance_curse_effects(CuTest *tc) {
struct region *r;
unit *u1, *u2;
variant var;
curse *c;
test_setup();
r = test_create_plain(0, 0);
u1 = test_create_unit(test_create_faction(), r);
u2 = test_create_unit(test_create_faction(), r);
/* increase someone's magic resistance by 10 percent */
c = create_curse(u1, &u2->attribs, &ct_magicresistance, 1, 1, 10, 1);
var = magic_resistance(u2);
var = frac_sub(var, frac_make(1, 10));
CuAssertIntEquals(tc, 0, var.sa[0]);
/* curse only works for 1 person, is reduced for more */
scale_number(u2, 2);
var = magic_resistance(u2);
var = frac_sub(var, frac_make(1, 20));
CuAssertIntEquals(tc, 0, var.sa[0]);
remove_curse(&u2->attribs, c);
/* create an increase of magic resistance by 10 percent for our friends */
c = create_curse(u1, &r->attribs, &ct_goodmagicresistancezone, 1, 1, 10, 0);
/* curse increases our own resistance: */
var = magic_resistance(u1);
var = frac_sub(var, frac_make(1, 10));
CuAssertIntEquals(tc, 0, var.sa[0]);
/* no effect on non-allied units: */
var = magic_resistance(u2);
CuAssertIntEquals(tc, 0, var.sa[0]);
/* allied units also get the bonus: */
ally_set(&u1->faction->allies, u2->faction, HELP_GUARD);
var = magic_resistance(u2);
var = frac_sub(var, frac_make(1, 10));
CuAssertIntEquals(tc, 0, var.sa[0]);
ally_set(&u1->faction->allies, u2->faction, 0);
remove_curse(&r->attribs, c);
/* reduce magic resistance for non-friendly units */
c = create_curse(u1, &r->attribs, &ct_badmagicresistancezone, 1, 1, 10, 0);
/* we do not affect ourselves: */
var = magic_resistance(u1);
CuAssertIntEquals(tc, 0, var.sa[0]);
/* non-allied units get the effect, even if it takes them into negative: */
var = magic_resistance(u2);
var = frac_add(var, frac_make(1, 10));
CuAssertIntEquals(tc, 0, var.sa[0]);
/* no effect on allied units: */
ally_set(&u1->faction->allies, u2->faction, HELP_GUARD);
var = magic_resistance(u2);
CuAssertIntEquals(tc, 0, var.sa[0]);
ally_set(&u1->faction->allies, u2->faction, 0);
remove_curse(&r->attribs, c);
test_teardown();
}
static void test_magicresistance_unit(CuTest *tc) { static void test_magicresistance_unit(CuTest *tc) {
struct region *r; struct region *r;
struct faction *f1, *f2; struct faction *f1, *f2;
@ -79,6 +144,7 @@ static void test_magicresistance_building(CuTest *tc) {
CuSuite *get_magicresistance_suite(void) CuSuite *get_magicresistance_suite(void)
{ {
CuSuite *suite = CuSuiteNew(); CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_magicresistance_curse_effects);
SUITE_ADD_TEST(suite, test_magicresistance_unit); SUITE_ADD_TEST(suite, test_magicresistance_unit);
SUITE_ADD_TEST(suite, test_magicresistance_building); SUITE_ADD_TEST(suite, test_magicresistance_building);
return suite; return suite;