diff --git a/src/economy.c b/src/economy.c index ecbd27db0..ffb9b0211 100644 --- a/src/economy.c +++ b/src/economy.c @@ -1174,7 +1174,8 @@ attrib_type at_trades = { NO_READ }; -static bool trade_needs_castle(const region *r, const race *rc) { +bool trade_needs_castle(const terrain_type *terrain, const race *rc) +{ static int rc_change, terrain_change; static const race *rc_insect; static const terrain_type *t_desert, *t_swamp; @@ -1185,7 +1186,7 @@ static bool trade_needs_castle(const region *r, const race *rc) { t_swamp = newterrain(T_SWAMP); t_desert = newterrain(T_DESERT); } - return rc != rc_insect && (r->terrain == t_swamp || r->terrain == t_desert); + return rc != rc_insect && (terrain == t_swamp || terrain == t_desert); } static void buy(unit * u, econ_request ** buyorders, struct order *ord) @@ -1221,7 +1222,7 @@ static void buy(unit * u, econ_request ** buyorders, struct order *ord) /* Entweder man ist Insekt in Sumpf/Wueste, oder es muss * einen Handelsposten in der Region geben: */ - if (trade_needs_castle(r, u_race(u))) { + if (trade_needs_castle(r->terrain, u_race(u))) { building *b = NULL; if (r->buildings) { static int cache; diff --git a/src/economy.h b/src/economy.h index 94c0997c8..2eace8a2d 100644 --- a/src/economy.h +++ b/src/economy.h @@ -49,6 +49,7 @@ extern "C" { struct faction; struct order; struct message; + struct terrain_type; struct item_type; typedef struct econ_request { @@ -85,6 +86,8 @@ extern "C" { void destroy(struct region *r); void produce(struct region *r); void auto_work(struct region *r); + + bool trade_needs_castle(const struct terrain_type *terrain, const struct race *rc); typedef enum income_t { IC_WORK, IC_ENTERTAIN, IC_TAX, IC_TRADE, IC_TRADETAX, IC_STEAL, IC_MAGIC, IC_LOOT } income_t; void add_income(struct unit * u, income_t type, int want, int qty); diff --git a/src/economy.test.c b/src/economy.test.c index f4fe84340..a66e3d2ff 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -233,10 +233,31 @@ static unit *setup_trade_unit(CuTest *tc, region *r, const struct race *rc) { return u; } +static void test_trade_needs_castle(CuTest *tc) { + /* Handeln ist nur in Regionen mit Burgen möglich. */ + race *rc; + region *r; + const terrain_type *t_swamp; + + test_setup(); + setup_production(); + test_create_locale(); + setup_terrains(tc); + init_terrains(); + t_swamp = get_terrain("swamp"); + r = setup_trade_region(tc, t_swamp); + rc = test_create_race(NULL); + + CuAssertTrue(tc, trade_needs_castle(t_swamp, rc)); + test_teardown(); +} + static void test_trade_insect(CuTest *tc) { /* Insekten koennen in Wuesten und Suempfen auch ohne Burgen handeln. */ unit *u; region *r; + race *rc; + const terrain_type *t_swamp; const item_type *it_luxury; const item_type *it_silver; @@ -244,14 +265,17 @@ static void test_trade_insect(CuTest *tc) { setup_production(); test_create_locale(); setup_terrains(tc); - r = setup_trade_region(tc, get_terrain("swamp")); init_terrains(); + t_swamp = get_terrain("swamp"); + rc = test_create_race("insect"); + r = setup_trade_region(tc, t_swamp); it_luxury = r_luxury(r); + CuAssertTrue(tc, !trade_needs_castle(t_swamp, rc)); CuAssertPtrNotNull(tc, it_luxury); it_silver = get_resourcetype(R_SILVER)->itype; - u = setup_trade_unit(tc, r, test_create_race("insect")); + u = setup_trade_unit(tc, r, rc); unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s", LOC(u->faction->locale, resourcename(it_luxury->rtype, 0)))); @@ -796,6 +820,7 @@ CuSuite *get_economy_suite(void) SUITE_ADD_TEST(suite, test_heroes_dont_recruit); SUITE_ADD_TEST(suite, test_tax_cmd); SUITE_ADD_TEST(suite, test_buy_cmd); + SUITE_ADD_TEST(suite, test_trade_needs_castle); SUITE_ADD_TEST(suite, test_trade_insect); SUITE_ADD_TEST(suite, test_maintain_buildings); SUITE_ADD_TEST(suite, test_recruit); diff --git a/src/tests.c b/src/tests.c index c0350a9de..6dbc84271 100644 --- a/src/tests.c +++ b/src/tests.c @@ -583,7 +583,7 @@ struct message * test_find_messagetype_ex(struct message_list *msgs, const char return ml->msg; } } - return 0; + return NULL; } struct message * test_find_messagetype(struct message_list *msgs, const char *name) @@ -603,7 +603,7 @@ void test_clear_messages(faction *f) { if (f->msgs) { free_messagelist(f->msgs->begin); free(f->msgs); - f->msgs = 0; + f->msgs = NULL; } }