fix use of static configuration in study_cost.

This commit is contained in:
Enno Rehling 2017-12-29 15:58:12 +01:00
parent c23e7bf9b9
commit c3a812123f
2 changed files with 65 additions and 51 deletions

View file

@ -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 config;
static int cost[MAXSKILLS]; static int costs[MAXSKILLS];
int stufe, k = 50; int cost = -1;
if (config_changed(&config)) { if (sk == SK_MAGIC) {
memset(cost, 0, sizeof(cost)); 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));
} }
else switch (sk) {
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) {
case SK_SPY: case SK_SPY:
return 100; cost = 100;
break;
case SK_TACTICS: case SK_TACTICS:
case SK_HERBALISM: case SK_HERBALISM:
case SK_ALCHEMY: case SK_ALCHEMY:
return 200; cost = 200;
case SK_MAGIC: /* Die Magiekosten betragen 50+Summe(50*Stufe) */ break;
/* 'Stufe' ist dabei die naechste zu erreichende Stufe */
stufe = 1 + get_level(u, SK_MAGIC);
return k * (1 + ((stufe + 1) * stufe / 2));
default: 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)) { if (!unit_can_study(u)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race", ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race",
u_race(u))); u_race(u)));
return 0; return -1;
} }
(void)init_order(ord, u->faction->locale); (void)init_order(ord, u->faction->locale);
@ -567,19 +573,19 @@ int study_cmd(unit * u, order * ord)
if (sk < 0) { if (sk < 0) {
cmistake(u, ord, 77, MSG_EVENT); cmistake(u, ord, 77, MSG_EVENT);
return 0; return -1;
} }
/* Hack: Talente mit Malus -99 koennen nicht gelernt werden */ /* Hack: Talente mit Malus -99 koennen nicht gelernt werden */
if (u_race(u)->bonus[sk] == -99) { if (u_race(u)->bonus[sk] == -99) {
cmistake(u, ord, 771, MSG_EVENT); cmistake(u, ord, 771, MSG_EVENT);
return 0; return -1;
} }
if (!learn_newskills) { if (!learn_newskills) {
skill *sv = unit_skill(u, sk); skill *sv = unit_skill(u, sk);
if (sv == NULL) { if (sv == NULL) {
/* we can only learn skills we already have */ /* we can only learn skills we already have */
cmistake(u, ord, 771, MSG_EVENT); 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 (u_race(u) == rc_snotling) {
if (get_level(u, sk) >= 8) { if (get_level(u, sk) >= 8) {
cmistake(u, ord, 308, MSG_EVENT); 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)) { if (studycost > 0 && !ExpensiveMigrants() && is_migrant(u)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_migrants_nolearn", ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_migrants_nolearn",
"")); ""));
return 0; return -1;
} }
/* Akademie: */ /* Akademie: */
if (active_building(u, bt_find("academy"))) { if (active_building(u, bt_find("academy"))) {
@ -613,7 +619,7 @@ int study_cmd(unit * u, order * ord)
if (sk == SK_MAGIC) { if (sk == SK_MAGIC) {
if (u->number > 1) { if (u->number > 1) {
cmistake(u, ord, 106, MSG_MAGIC); cmistake(u, ord, 106, MSG_MAGIC);
return 0; return -1;
} }
if (is_familiar(u)) { if (is_familiar(u)) {
/* Vertraute zaehlen nicht zu den Magiern einer Partei, /* 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) { if (count_skill(u->faction, SK_MAGIC) + u->number > mmax) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_magicians", ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_magicians",
"amount", mmax)); "amount", mmax));
return 0; return -1;
} }
mtyp = getmagicskill(u->faction->locale); mtyp = getmagicskill(u->faction->locale);
if (mtyp == M_NONE || mtyp == M_GRAY) { if (mtyp == M_NONE || mtyp == M_GRAY) {
@ -641,7 +647,7 @@ int study_cmd(unit * u, order * ord)
mtyp = getmagicskill(u->faction->locale); mtyp = getmagicskill(u->faction->locale);
if (mtyp == M_NONE) { if (mtyp == M_NONE) {
cmistake(u, ord, 178, MSG_MAGIC); 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 */ * als das der Partei */
if (u->faction->magiegebiet != 0) { if (u->faction->magiegebiet != 0) {
cmistake(u, ord, 179, MSG_MAGIC); cmistake(u, ord, 179, MSG_MAGIC);
return 0; return -1;
} }
else { else {
/* Lernt zum ersten mal Magie und legt damit das /* 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); mtyp = getmagicskill(u->faction->locale);
if (mtyp == M_NONE) { if (mtyp == M_NONE) {
cmistake(u, ord, 178, MSG_MAGIC); cmistake(u, ord, 178, MSG_MAGIC);
return 0; return -1;
} }
} }
/* Legt damit das Magiegebiet der Partei fest */ /* 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) { if (count_skill(u->faction, SK_ALCHEMY) + u->number > amax) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_alchemists", ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_max_alchemists",
"amount", amax)); "amount", amax));
return 0; return -1;
} }
} }
} }

View file

@ -386,41 +386,43 @@ static void test_study_magic(CuTest *tc) {
unit *u; unit *u;
faction *f; faction *f;
const struct locale *lang; const struct locale *lang;
const struct resource_type *rtype; const struct item_type *itype;
test_setup(); test_setup();
init_resources(); init_resources();
f = test_create_faction(0); f = test_create_faction(0);
u = test_create_unit(f, test_create_region(0, 0, 0));
lang = f->locale; 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]); 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")); CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error178"));
free_order(u->thisorder); free_order(u->thisorder);
test_clear_messages(f); test_clear_messages(f);
u->thisorder = create_order(K_STUDY, lang, "%s %s", skillnames[SK_MAGIC], magic_school[M_GWYRRD]); 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")); CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error65"));
test_clear_messages(f); test_clear_messages(f);
i_change(&u->items, rtype->itype, 100); i_change(&u->items, itype, 100);
study_cmd(u, u->thisorder); CuAssertIntEquals(tc, 0, study_cmd(u, u->thisorder));
CuAssertIntEquals(tc, M_GWYRRD, f->magiegebiet); 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)); CuAssertPtrNotNull(tc, get_mage_depr(u));
CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error65")); CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error65"));
CuAssertIntEquals(tc, M_GWYRRD, get_mage_depr(u)->magietyp); CuAssertIntEquals(tc, M_GWYRRD, get_mage_depr(u)->magietyp);
/* TODO: the static cost array in study_cost prevents this test: test_teardown();
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"));
*/
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(); test_teardown();
} }
@ -429,11 +431,16 @@ static void test_study_cost(CuTest *tc) {
const struct item_type *itype; const struct item_type *itype;
test_setup(); 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)); u = test_create_unit(test_create_faction(0), test_create_region(0, 0, 0));
scale_number(u, 2); scale_number(u, 2);
u->thisorder = create_order(K_STUDY, u->faction->locale, skillnames[SK_ALCHEMY]); 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)); i_change(&u->items, itype, u->number * study_cost(u, SK_ALCHEMY));
learn_inject(); learn_inject();
study_cmd(u, u->thisorder); study_cmd(u, u->thisorder);
@ -682,6 +689,7 @@ CuSuite *get_study_suite(void)
CuSuite *suite = CuSuiteNew(); CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_study_cmd); SUITE_ADD_TEST(suite, test_study_cmd);
SUITE_ADD_TEST(suite, test_study_cost); 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_study_magic);
SUITE_ADD_TEST(suite, test_teach_cmd); SUITE_ADD_TEST(suite, test_teach_cmd);
SUITE_ADD_TEST(suite, test_teach_magic); SUITE_ADD_TEST(suite, test_teach_magic);