eliminate the O(n) lighthouse/inside complexity from prepare_report

This commit is contained in:
Enno Rehling 2017-05-22 21:15:42 +02:00
parent 17ed46e6a8
commit 51f8f87072
1 changed files with 22 additions and 6 deletions

View File

@ -1425,7 +1425,8 @@ void prepare_report(report_context *ctx, faction *f)
for (r = ctx->first; r!=ctx->last; r = r->next) {
unit *u;
int range = 0;
building *b;
int br = 0, c = 0, range = 0;
if (fval(r, RF_OBSERVER)) {
int skill = get_observer(r, f);
if (skill >= 0) {
@ -1435,7 +1436,6 @@ void prepare_report(report_context *ctx, faction *f)
if (fval(r, RF_LIGHTHOUSE)) {
/* region owners get the report from lighthouses */
if (rule_region_owners && f == region_get_owner(r)) {
building *b;
for (b = rbuildings(r); b; b = b->next) {
if (b && b->type == bt_lighthouse) {
/* region owners get maximm range */
@ -1445,6 +1445,8 @@ void prepare_report(report_context *ctx, faction *f)
}
}
}
b = NULL;
for (u = r->units; u; u = u->next) {
/* if we have any unit in this region, then we get seen_unit access */
if (u->faction == f) {
@ -1453,13 +1455,27 @@ void prepare_report(report_context *ctx, faction *f)
* or the size, if perception is not a skill
*/
if (!fval(r, RF_LIGHTHOUSE)) {
/* it's enough to mark the region once, and if there are
/* it's enough to add the region once, and if there are
* no lighthouses, there is no need to look at more units */
break;
}
if (range == 0 && u->building && u->building->type == bt_lighthouse && inside_building(u)) {
int br = lighthouse_range(u->building, f, u);
if (br > range) range = br;
}
if (range == 0 && u->building && u->building->type == bt_lighthouse) {
if (u->building && b != u->building) {
b = u->building;
c = buildingcapacity(b);
br = 0;
}
c -= u->number;
if (u->faction == f && c >= 0) {
/* unit is one of ours, and inside the current lighthouse */
if (br == 0) {
/* lazy-calculate the range */
br = lighthouse_range(u->building, f, u);
}
if (br > range) {
range = br;
}
}
}
}