BUG 2425: lighthouses can see units.

This commit is contained in:
Enno Rehling 2018-03-11 14:40:38 +01:00
parent 6d98a5dc4f
commit da984b5880
5 changed files with 33 additions and 8 deletions

View file

@ -1471,7 +1471,7 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r)
} }
cr_output_travelthru(F, r, f); cr_output_travelthru(F, r, f);
if (r->seen.mode >= seen_travel) { if (see_region_details(r)) {
message_list *mlist = r_getmessages(r, f); message_list *mlist = r_getmessages(r, f);
cr_output_messages(F, r->msgs, f); cr_output_messages(F, r->msgs, f);
if (mlist) { if (mlist) {
@ -1503,7 +1503,6 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r)
/* visible units */ /* visible units */
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
if (visible_unit(u, f, stealthmod, r->seen.mode)) { if (visible_unit(u, f, stealthmod, r->seen.mode)) {
cr_output_unit_compat(F, f, u, r->seen.mode); cr_output_unit_compat(F, f, u, r->seen.mode);
} }

View file

@ -688,7 +688,7 @@ nr_unit(struct stream *out, const faction * f, const unit * u, int indent, seen_
{ {
char marker; char marker;
int dh; int dh;
bool isbattle = (bool)(mode == seen_battle); bool isbattle = (mode == seen_battle);
char buf[8192]; char buf[8192];
if (fval(u_race(u), RCF_INVISIBLE)) if (fval(u_race(u), RCF_INVISIBLE))
@ -2332,7 +2332,9 @@ report_plaintext(const char *filename, report_context * ctx,
if (b) { if (b) {
nr_building(out, r, b, f); nr_building(out, r, b, f);
while (u && u->building == b) { while (u && u->building == b) {
if (visible_unit(u, f, stealthmod, r->seen.mode)) {
nr_unit(out, f, u, 6, r->seen.mode); nr_unit(out, f, u, 6, r->seen.mode);
}
u = u->next; u = u->next;
} }
b = b->next; b = b->next;
@ -2353,7 +2355,9 @@ report_plaintext(const char *filename, report_context * ctx,
if (sh) { if (sh) {
nr_ship(out, r, sh, f, u); nr_ship(out, r, sh, f, u);
while (u && u->ship == sh) { while (u && u->ship == sh) {
if (visible_unit(u, f, stealthmod, r->seen.mode)) {
nr_unit(out, f, u, 6, r->seen.mode); nr_unit(out, f, u, 6, r->seen.mode);
}
u = u->next; u = u->next;
} }
sh = sh->next; sh = sh->next;

View file

@ -2445,13 +2445,18 @@ bool visible_unit(const unit *u, const faction *f, int stealthmod, seen_mode mod
return true; return true;
} }
else { else {
if (stealthmod > INT_MIN && mode >= seen_unit) { if (stealthmod > INT_MIN && (mode == seen_lighthouse || mode >= seen_unit)) {
return cansee(f, u->region, u, stealthmod); return cansee(f, u->region, u, stealthmod);
} }
} }
return false; return false;
} }
bool see_region_details(const region *r)
{
return r->seen.mode >= seen_travel;
}
void register_reports(void) void register_reports(void)
{ {
/* register datatypes for the different message objects */ /* register datatypes for the different message objects */

View file

@ -135,6 +135,7 @@ extern "C" {
const char *get_mailcmd(const struct locale *loc); const char *get_mailcmd(const struct locale *loc);
bool visible_unit(const struct unit *u, const struct faction *f, int stealthmod, seen_mode mode); bool visible_unit(const struct unit *u, const struct faction *f, int stealthmod, seen_mode mode);
bool see_region_details(const struct region *r);
#define GR_PLURAL 0x01 /* grammar: plural */ #define GR_PLURAL 0x01 /* grammar: plural */
#define MAX_INVENTORY 128 /* maimum number of different items in an inventory */ #define MAX_INVENTORY 128 /* maimum number of different items in an inventory */

View file

@ -823,21 +823,37 @@ static void test_newbie_warning(CuTest *tc) {
test_teardown(); test_teardown();
} }
static void test_cansee_spell(CuTest *tc) { static void test_visible_unit(CuTest *tc) {
unit *u2; unit *u2;
faction *f; faction *f;
ship *sh;
test_setup(); test_setup();
f = test_create_faction(NULL); f = test_create_faction(NULL);
u2 = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); u2 = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
sh = test_create_ship(u2->region, NULL);
CuAssertTrue(tc, cansee(f, u2->region, u2, 0)); CuAssertTrue(tc, cansee(f, u2->region, u2, 0));
CuAssertTrue(tc, visible_unit(u2, f, 0, seen_unit));
CuAssertTrue(tc, visible_unit(u2, f, 0, seen_spell)); CuAssertTrue(tc, visible_unit(u2, f, 0, seen_spell));
CuAssertTrue(tc, visible_unit(u2, f, 0, seen_battle)); CuAssertTrue(tc, visible_unit(u2, f, 0, seen_battle));
CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_travel));
CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_none));
CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_neighbour));
CuAssertTrue(tc, visible_unit(u2, f, 0, seen_lighthouse));
CuAssertTrue(tc, !visible_unit(u2, f, -2, seen_lighthouse));
u2->ship = sh;
CuAssertTrue(tc, visible_unit(u2, f, -2, seen_lighthouse));
u2->ship = NULL;
set_level(u2, SK_STEALTH, 1); set_level(u2, SK_STEALTH, 1);
CuAssertTrue(tc, !cansee(f, u2->region, u2, 0)); CuAssertTrue(tc, !cansee(f, u2->region, u2, 0));
CuAssertTrue(tc, cansee(f, u2->region, u2, 1)); CuAssertTrue(tc, cansee(f, u2->region, u2, 1));
u2->ship = sh;
CuAssertTrue(tc, visible_unit(u2, f, -2, seen_lighthouse));
u2->ship = NULL;
CuAssertTrue(tc, visible_unit(u2, f, 1, seen_spell)); CuAssertTrue(tc, visible_unit(u2, f, 1, seen_spell));
CuAssertTrue(tc, visible_unit(u2, f, 1, seen_battle)); CuAssertTrue(tc, visible_unit(u2, f, 1, seen_battle));
@ -873,6 +889,6 @@ CuSuite *get_reports_suite(void)
SUITE_ADD_TEST(suite, test_arg_resources); SUITE_ADD_TEST(suite, test_arg_resources);
SUITE_ADD_TEST(suite, test_insect_warnings); SUITE_ADD_TEST(suite, test_insect_warnings);
SUITE_ADD_TEST(suite, test_newbie_warning); SUITE_ADD_TEST(suite, test_newbie_warning);
SUITE_ADD_TEST(suite, test_cansee_spell); SUITE_ADD_TEST(suite, test_visible_unit);
return suite; return suite;
} }