forked from github/server
separate lighthouse_view_distance from lighthouse_range.
This commit is contained in:
parent
7b7d3cb759
commit
2282160916
|
@ -36,7 +36,7 @@ void update_lighthouse(building * lh)
|
|||
|
||||
r->flags |= RF_LIGHTHOUSE;
|
||||
if (lh->size >= 10) {
|
||||
int d = lighthouse_range(lh, NULL, NULL);
|
||||
int d = lighthouse_range(lh);
|
||||
int x;
|
||||
for (x = -d; x <= d; ++x) {
|
||||
int y;
|
||||
|
@ -79,18 +79,24 @@ void remove_lighthouse(const building *lh) {
|
|||
}
|
||||
}
|
||||
|
||||
int lighthouse_range(const building * b, const faction * f, const unit *u)
|
||||
int lighthouse_range(const building * b)
|
||||
{
|
||||
if (b->size >= 10 && (b->flags & BLD_MAINTAINED)) {
|
||||
int maxd = (int)log10(b->size) + 1;
|
||||
return (int)log10(b->size) + 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (u && skill_enabled(SK_PERCEPTION)) {
|
||||
int lighthouse_view_distance(const building * b, const unit *u)
|
||||
{
|
||||
if (b->size >= 10 && (b->flags & BLD_MAINTAINED)) {
|
||||
int maxd = lighthouse_range(b);
|
||||
|
||||
if (maxd > 0 && u && skill_enabled(SK_PERCEPTION)) {
|
||||
int sk = effskill(u, SK_PERCEPTION, 0) / 3;
|
||||
assert(u->building == b);
|
||||
assert(u->faction == f);
|
||||
if (maxd > sk) maxd = sk;
|
||||
}
|
||||
/* E3A rule: no perception req'd */
|
||||
return maxd;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -39,8 +39,8 @@ extern "C" {
|
|||
bool lighthouse_guarded(const struct region *r);
|
||||
void update_lighthouse(struct building *b);
|
||||
void remove_lighthouse(const struct building *lh);
|
||||
int lighthouse_range(const struct building *b, const struct faction *f,
|
||||
const struct unit *u);
|
||||
int lighthouse_range(const struct building *b);
|
||||
int lighthouse_view_distance(const struct building *b, const struct unit *u);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -26,30 +26,33 @@ static void test_lighthouse_range(CuTest * tc)
|
|||
u1 = test_create_unit(test_create_faction(NULL), r);
|
||||
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||
b = test_create_building(r, test_create_buildingtype("lighthouse"));
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b, NULL, NULL));
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b, u1->faction, NULL));
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b));
|
||||
b->size = 9;
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b));
|
||||
b->size = 10;
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b, NULL, NULL));
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b));
|
||||
b->flags |= BLD_MAINTAINED;
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b));
|
||||
u1->building = b;
|
||||
u2->building = b;
|
||||
u1->number = 10;
|
||||
set_level(u1, SK_PERCEPTION, 3);
|
||||
set_level(u2, SK_PERCEPTION, 3);
|
||||
CuAssertIntEquals(tc, 0, lighthouse_range(b, NULL, NULL));
|
||||
|
||||
b->flags |= BLD_MAINTAINED;
|
||||
CuAssertIntEquals(tc, 1, lighthouse_range(b, u1->faction, u1));
|
||||
CuAssertIntEquals(tc, 1, lighthouse_view_distance(b, u1));
|
||||
set_level(u1, SK_PERCEPTION, 6);
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b, u1->faction, u1));
|
||||
/* lighthouse_range does not check inside_building */
|
||||
CuAssertIntEquals(tc, 1, lighthouse_range(b, u2->faction, u2));
|
||||
CuAssertIntEquals(tc, 1, lighthouse_view_distance(b, u2));
|
||||
CuAssertIntEquals(tc, 2, lighthouse_view_distance(b, u1));
|
||||
b->size = 100;
|
||||
update_lighthouse(b);
|
||||
CuAssertIntEquals(tc, 3, lighthouse_range(b, NULL, NULL));
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b, u1->faction, u1));
|
||||
CuAssertIntEquals(tc, 3, lighthouse_range(b));
|
||||
CuAssertIntEquals(tc, 2, lighthouse_view_distance(b, u1));
|
||||
set_level(u1, SK_PERCEPTION, 9);
|
||||
CuAssertIntEquals(tc, 3, lighthouse_range(b, u1->faction, u1));
|
||||
CuAssertIntEquals(tc, 1, lighthouse_range(b, u2->faction, u2));
|
||||
CuAssertIntEquals(tc, 3, lighthouse_view_distance(b, u1));
|
||||
CuAssertIntEquals(tc, 1, lighthouse_view_distance(b, u2));
|
||||
b->size = 99;
|
||||
CuAssertIntEquals(tc, 2, lighthouse_view_distance(b, u1));
|
||||
|
||||
test_teardown();
|
||||
}
|
||||
|
||||
|
@ -111,7 +114,7 @@ static void test_lighthouse_guard(CuTest * tc) {
|
|||
b = test_create_building(r1, test_create_buildingtype("lighthouse"));
|
||||
b->flags |= BLD_MAINTAINED;
|
||||
b->size = 10;
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b, NULL, NULL));
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b));
|
||||
update_lighthouse(b);
|
||||
CuAssertIntEquals(tc, RF_LIGHTHOUSE, r1->flags&RF_LIGHTHOUSE);
|
||||
CuAssertPtrEquals(tc, NULL, r1->attribs);
|
||||
|
|
|
@ -1596,7 +1596,7 @@ void prepare_report(report_context *ctx, faction *f)
|
|||
for (b = rbuildings(r); b; b = b->next) {
|
||||
if (b && b->type == bt_lighthouse) {
|
||||
/* region owners get maximum range */
|
||||
int lhr = lighthouse_range(b, NULL, NULL);
|
||||
int lhr = lighthouse_view_distance(b, NULL);
|
||||
if (lhr > range) range = lhr;
|
||||
}
|
||||
}
|
||||
|
@ -1613,7 +1613,7 @@ void prepare_report(report_context *ctx, faction *f)
|
|||
*/
|
||||
if (!fval(r, RF_LIGHTHOUSE)) {
|
||||
/* it's enough to add the region once, and if there are
|
||||
* no lighthouses, there is no need to look at more units */
|
||||
* no lighthouses here, there is no need to look at more units */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1633,14 +1633,14 @@ void prepare_report(report_context *ctx, faction *f)
|
|||
/* unit is one of ours, and inside the current lighthouse */
|
||||
if (br == 0) {
|
||||
/* lazy-calculate the range */
|
||||
br = lighthouse_range(b, f, u);
|
||||
}
|
||||
br = lighthouse_view_distance(b, u);
|
||||
if (br > range) {
|
||||
range = br;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (range > 0) {
|
||||
/* we are in at least one lighthouse. add the regions we can see from here! */
|
||||
prepare_lighthouse(f, r, range);
|
||||
|
|
|
@ -495,7 +495,7 @@ void test_prepare_lighthouse_capacity(CuTest *tc) {
|
|||
u1->number = 4;
|
||||
u1->building = b;
|
||||
set_level(u1, SK_PERCEPTION, 3);
|
||||
CuAssertIntEquals(tc, 1, lighthouse_range(b, u1->faction, u1));
|
||||
CuAssertIntEquals(tc, 1, lighthouse_view_distance(b, u1));
|
||||
CuAssertPtrEquals(tc, b, inside_building(u1));
|
||||
u2 = test_create_unit(f, r1);
|
||||
u2->building = b;
|
||||
|
@ -597,7 +597,7 @@ static void test_prepare_lighthouse_owners(CuTest *tc)
|
|||
u = test_create_unit(test_create_faction(NULL), r1);
|
||||
u->building = b;
|
||||
region_set_owner(b->region, f, 0);
|
||||
CuAssertIntEquals(tc, 2, lighthouse_range(b, NULL, NULL));
|
||||
CuAssertIntEquals(tc, 2, lighthouse_view_distance(b, NULL));
|
||||
prepare_report(&ctx, f);
|
||||
CuAssertPtrEquals(tc, r1, ctx.first);
|
||||
CuAssertPtrEquals(tc, NULL, ctx.last);
|
||||
|
|
Loading…
Reference in New Issue