From c755c1d69e52c147138c3e4e84b93c577474e502 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 23 Sep 2016 19:51:33 +0200 Subject: [PATCH] for short lighthouse ranges, don't use lists. --- src/reports.c | 67 ++++++++++++++++++++++++++++++++++------------ src/reports.h | 3 ++- src/reports.test.c | 38 ++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 18 deletions(-) diff --git a/src/reports.c b/src/reports.c index e0c2642ba..3e67f2f2b 100644 --- a/src/reports.c +++ b/src/reports.c @@ -1112,30 +1112,43 @@ void reports_done(void) { } } -static int get_regions_distance_arr(region *r, int radius, - region *result[], int size) +int get_regions_distance_arr(region *rc, int radius, region *result[], int size) { int n = 0, i; if (size>n) { - result[n++] = r; + result[n++] = rc; } for (i = 0; i != n; ++i) { - region *adj[MAXDIRECTIONS]; - int d; - + region *r; + int dist; + r = result[i]; - get_neighbours(r, adj); - for (d = 0; d != MAXDIRECTIONS; ++d) { - r = adj[d]; - if (size>n) { - result[n++] = r; + dist = distance(rc, r); + if (dist n) { + if (dist < distance(rc, r)) { + result[n++] = r; + } + } + else { + return -1; + } + } } } } + return n; } -static quicklist *get_regions_distance(region * root, int radius) +quicklist *get_regions_distance(region * root, int radius) { quicklist *ql, *rlist = NULL; int qi = 0; @@ -1193,11 +1206,8 @@ static void add_seen_nb(faction *f, region *r, seen_mode mode) { /** mark all regions seen by the lighthouse. */ -static void prepare_lighthouse(building * b, report_context *ctx) -{ - faction *f = ctx->f; - int range = lighthouse_range(b, f); - quicklist *ql, *rlist = get_regions_distance(b->region, range); +static void prepare_lighthouse_ql(faction *f, quicklist *rlist) { + quicklist *ql; int qi; for (ql = rlist, qi = 0; ql; ql_advance(&ql, &qi, 1)) { @@ -1209,6 +1219,29 @@ static void prepare_lighthouse(building * b, report_context *ctx) ql_free(rlist); } +static void prepare_lighthouse(building * b, report_context *ctx) +{ + faction *f = ctx->f; + int range = lighthouse_range(b, f); + + if (range > 2) { + prepare_lighthouse_ql(f, get_regions_distance(b->region, range)); + } + else { + region *result[64]; + int n, i; + + n = get_regions_distance_arr(b->region, range, result, 64); + assert(n > 0 && n <= 64); + for (i = 0; i != n; ++i) { + region *rl = result[i]; + if (!fval(rl->terrain, FORBIDDEN_REGION)) { + add_seen_nb(f, rl, seen_lighthouse); + } + } + } +} + void reorder_units(region * r) { unit **unext = &r->units; diff --git a/src/reports.h b/src/reports.h index 8684dfa3f..e2484de74 100644 --- a/src/reports.h +++ b/src/reports.h @@ -49,7 +49,8 @@ extern "C" { struct unit *can_find(struct faction *, struct faction *); bool omniscient(const struct faction *f); - + struct quicklist *get_regions_distance(struct region * root, int radius); + int get_regions_distance_arr(struct region *r, int radius, struct region *result[], int size); /* funktionen zum schreiben eines reports */ void sparagraph(struct strlist **SP, const char *s, unsigned int indent, char mark); void lparagraph(struct strlist **SP, char *s, unsigned int indent, char mark); diff --git a/src/reports.test.c b/src/reports.test.c index d9b427ff2..ffa2d215c 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -425,9 +425,47 @@ static void test_seen_travelthru(CuTest *tc) { test_cleanup(); } +static void test_region_distance(CuTest *tc) { + region *r; + region *result[8]; + test_setup(); + r = test_create_region(0, 0, 0); + CuAssertIntEquals(tc, 1, get_regions_distance_arr(r, 0, result, 8)); + CuAssertPtrEquals(tc, r, result[0]); + CuAssertIntEquals(tc, 1, get_regions_distance_arr(r, 1, result, 8)); + test_create_region(1, 0, 0); + test_create_region(0, 1, 0); + CuAssertIntEquals(tc, 1, get_regions_distance_arr(r, 0, result, 8)); + CuAssertIntEquals(tc, 3, get_regions_distance_arr(r, 1, result, 8)); + CuAssertIntEquals(tc, 3, get_regions_distance_arr(r, 2, result, 8)); + test_cleanup(); +} + +static void test_region_distance_ql(CuTest *tc) { + region *r; + quicklist *ql; + test_setup(); + r = test_create_region(0, 0, 0); + ql = get_regions_distance(r, 0); + CuAssertIntEquals(tc, 1, ql_length(ql)); + CuAssertPtrEquals(tc, r, ql_get(ql, 0)); + ql_free(ql); + test_create_region(1, 0, 0); + test_create_region(0, 1, 0); + ql = get_regions_distance(r, 1); + CuAssertIntEquals(tc, 3, ql_length(ql)); + ql_free(ql); + ql = get_regions_distance(r, 2); + CuAssertIntEquals(tc, 3, ql_length(ql)); + ql_free(ql); + test_cleanup(); +} + CuSuite *get_reports_suite(void) { CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_region_distance); + SUITE_ADD_TEST(suite, test_region_distance_ql); SUITE_ADD_TEST(suite, test_prepare_report); SUITE_ADD_TEST(suite, test_seen_neighbours); SUITE_ADD_TEST(suite, test_seen_travelthru);