From c3a812123feb1113610d34847b318054c1ea9415 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 29 Dec 2017 15:58:12 +0100 Subject: [PATCH] fix use of static configuration in study_cost. --- src/study.c | 74 ++++++++++++++++++++++++++---------------------- src/study.test.c | 42 ++++++++++++++++----------- 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/src/study.c b/src/study.c index b7d5dc519..b94c01e43 100644 --- a/src/study.c +++ b/src/study.c @@ -128,38 +128,44 @@ bool magic_lowskill(unit * u) /* ------------------------------------------------------------- */ -int study_cost(unit * u, skill_t sk) +int study_cost(struct unit *u, skill_t sk) { static int config; - static int cost[MAXSKILLS]; - int stufe, k = 50; + static int costs[MAXSKILLS]; + int cost = -1; - if (config_changed(&config)) { - memset(cost, 0, sizeof(cost)); + if (sk == SK_MAGIC) { + int next_level = 1 + (u ? get_level(u, sk) : 0); + /* Die Magiekosten betragen 50+Summe(50*Stufe) */ + /* 'Stufe' ist dabei die naechste zu erreichende Stufe */ + cost = 50 * (1 + ((next_level + 1) * next_level / 2)); } - - if (cost[sk] == 0) { - char buffer[256]; - sprintf(buffer, "skills.cost.%s", skillnames[sk]); - cost[sk] = config_get_int(buffer, -1); - } - if (cost[sk] >= 0) { - return cost[sk]; - } - switch (sk) { + else switch (sk) { case SK_SPY: - return 100; + cost = 100; + break; case SK_TACTICS: case SK_HERBALISM: case SK_ALCHEMY: - return 200; - case SK_MAGIC: /* Die Magiekosten betragen 50+Summe(50*Stufe) */ - /* 'Stufe' ist dabei die naechste zu erreichende Stufe */ - stufe = 1 + get_level(u, SK_MAGIC); - return k * (1 + ((stufe + 1) * stufe / 2)); + cost = 200; + break; default: - return 0; + cost = -1; } + + if (config_changed(&config)) { + memset(costs, 0, sizeof(costs)); + } + + if (costs[sk] == 0) { + char buffer[256]; + sprintf(buffer, "skills.cost.%s", skillnames[sk]); + costs[sk] = config_get_int(buffer, cost); + } + if (costs[sk] >= 0) { + return costs[sk]; + } + return (cost > 0) ? cost : 0; } /* ------------------------------------------------------------- */ @@ -559,7 +565,7 @@ int study_cmd(unit * u, order * ord) if (!unit_can_study(u)) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race", u_race(u))); - return 0; + return -1; } (void)init_order(ord, u->faction->locale); @@ -567,19 +573,19 @@ int study_cmd(unit * u, order * ord) if (sk < 0) { cmistake(u, ord, 77, MSG_EVENT); - return 0; + return -1; } /* Hack: Talente mit Malus -99 koennen nicht gelernt werden */ if (u_race(u)->bonus[sk] == -99) { cmistake(u, ord, 771, MSG_EVENT); - return 0; + return -1; } if (!learn_newskills) { skill *sv = unit_skill(u, sk); if (sv == NULL) { /* we can only learn skills we already have */ cmistake(u, ord, 771, MSG_EVENT); - return 0; + return -1; } } @@ -587,7 +593,7 @@ int study_cmd(unit * u, order * ord) if (u_race(u) == rc_snotling) { if (get_level(u, sk) >= 8) { cmistake(u, ord, 308, MSG_EVENT); - return 0; + return -1; } } @@ -603,7 +609,7 @@ int study_cmd(unit * u, order * ord) if (studycost > 0 && !ExpensiveMigrants() && is_migrant(u)) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_migrants_nolearn", "")); - return 0; + return -1; } /* Akademie: */ if (active_building(u, bt_find("academy"))) { @@ -613,7 +619,7 @@ int study_cmd(unit * u, order * ord) if (sk == SK_MAGIC) { if (u->number > 1) { cmistake(u, ord, 106, MSG_MAGIC); - return 0; + return -1; } if (is_familiar(u)) { /* Vertraute zaehlen nicht zu den Magiern einer Partei, @@ -626,7 +632,7 @@ int study_cmd(unit * u, order * ord) if (count_skill(u->faction, SK_MAGIC) + u->number > mmax) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_magicians", "amount", mmax)); - return 0; + return -1; } mtyp = getmagicskill(u->faction->locale); if (mtyp == M_NONE || mtyp == M_GRAY) { @@ -641,7 +647,7 @@ int study_cmd(unit * u, order * ord) mtyp = getmagicskill(u->faction->locale); if (mtyp == M_NONE) { cmistake(u, ord, 178, MSG_MAGIC); - return 0; + return -1; } } } @@ -650,7 +656,7 @@ int study_cmd(unit * u, order * ord) * als das der Partei */ if (u->faction->magiegebiet != 0) { cmistake(u, ord, 179, MSG_MAGIC); - return 0; + return -1; } else { /* Lernt zum ersten mal Magie und legt damit das @@ -669,7 +675,7 @@ int study_cmd(unit * u, order * ord) mtyp = getmagicskill(u->faction->locale); if (mtyp == M_NONE) { cmistake(u, ord, 178, MSG_MAGIC); - return 0; + return -1; } } /* Legt damit das Magiegebiet der Partei fest */ @@ -684,7 +690,7 @@ int study_cmd(unit * u, order * ord) if (count_skill(u->faction, SK_ALCHEMY) + u->number > amax) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_alchemists", "amount", amax)); - return 0; + return -1; } } } diff --git a/src/study.test.c b/src/study.test.c index 1bfc7ae4c..7e790eee7 100644 --- a/src/study.test.c +++ b/src/study.test.c @@ -386,41 +386,43 @@ static void test_study_magic(CuTest *tc) { unit *u; faction *f; const struct locale *lang; - const struct resource_type *rtype; + const struct item_type *itype; test_setup(); init_resources(); f = test_create_faction(0); - u = test_create_unit(f, test_create_region(0, 0, 0)); lang = f->locale; - CuAssertPtrNotNull(tc, rtype = get_resourcetype(R_SILVER)); + u = test_create_unit(f, test_create_region(0, 0, 0)); u->thisorder = create_order(K_STUDY, lang, "%s", skillnames[SK_MAGIC]); - study_cmd(u, u->thisorder); + itype = test_create_silver(); + + CuAssertIntEquals(tc, -1, study_cmd(u, u->thisorder)); CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error178")); free_order(u->thisorder); test_clear_messages(f); u->thisorder = create_order(K_STUDY, lang, "%s %s", skillnames[SK_MAGIC], magic_school[M_GWYRRD]); - study_cmd(u, u->thisorder); + CuAssertIntEquals(tc, 0, study_cmd(u, u->thisorder)); CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error65")); test_clear_messages(f); - i_change(&u->items, rtype->itype, 100); - study_cmd(u, u->thisorder); + i_change(&u->items, itype, 100); + CuAssertIntEquals(tc, 0, study_cmd(u, u->thisorder)); CuAssertIntEquals(tc, M_GWYRRD, f->magiegebiet); - CuAssertIntEquals(tc, 0, i_get(u->items, rtype->itype)); + CuAssertIntEquals(tc, 0, i_get(u->items, itype)); CuAssertPtrNotNull(tc, get_mage_depr(u)); CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error65")); CuAssertIntEquals(tc, M_GWYRRD, get_mage_depr(u)->magietyp); - /* TODO: the static cost array in study_cost prevents this test: - test_clear_messages(f); - config_set("skills.cost.magic", "50"); - i_change(&u->items, rtype->itype, 50); - study_cmd(u, u->thisorder); - CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error65")); - */ + test_teardown(); +} +static void test_study_cost_magic(CuTest *tc) { + test_setup(); + config_set("skills.cost.magic", "50"); + CuAssertIntEquals(tc, 50, study_cost(NULL, SK_MAGIC)); + config_set("skills.cost.magic", "100"); + CuAssertIntEquals(tc, 100, study_cost(NULL, SK_MAGIC)); test_teardown(); } @@ -429,11 +431,16 @@ static void test_study_cost(CuTest *tc) { const struct item_type *itype; test_setup(); - init_resources(); - itype = get_resourcetype(R_SILVER)->itype; + + itype = test_create_silver(); u = test_create_unit(test_create_faction(0), test_create_region(0, 0, 0)); scale_number(u, 2); u->thisorder = create_order(K_STUDY, u->faction->locale, skillnames[SK_ALCHEMY]); + + CuAssertIntEquals(tc, 200, study_cost(u, SK_ALCHEMY)); + config_set("skills.cost.alchemy", "50"); + CuAssertIntEquals(tc, 50, study_cost(u, SK_ALCHEMY)); + i_change(&u->items, itype, u->number * study_cost(u, SK_ALCHEMY)); learn_inject(); study_cmd(u, u->thisorder); @@ -682,6 +689,7 @@ CuSuite *get_study_suite(void) CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_study_cmd); SUITE_ADD_TEST(suite, test_study_cost); + SUITE_ADD_TEST(suite, test_study_cost_magic); SUITE_ADD_TEST(suite, test_study_magic); SUITE_ADD_TEST(suite, test_teach_cmd); SUITE_ADD_TEST(suite, test_teach_magic);