fairland: Simplify search for next wilderness to elevate

To find the wilderness sector to elevate next, elevate_land() searches
the non-mountain, non-capital sectors of the island for one that
maximizes a function of its distance to mountains and to sea.

The search ignores already elevated sectors in a less than obvious
way: 1. it never picks a sector where the function yields -INFINITY or
less, and 2. when elevating a wilderness, its (cached) distances get
reset to values that make the function return a more negative value.

Use a more direct check of "not yet elevated": elevation is still the
initial -INFINITY.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2020-08-16 17:42:02 +02:00
parent 4f0af0bae0
commit 380d2e9f55

View file

@ -1002,15 +1002,16 @@ elevate_land(void)
(100 * (HIGHMIN - LANDMIN)) / (ns - nm - ((c < nc) ? 3 : 1)) : (100 * (HIGHMIN - LANDMIN)) / (ns - nm - ((c < nc) ? 3 : 1)) :
100 * INFINITY; 100 * INFINITY;
for (k = 100 * (HIGHMIN - 1);; k -= dk) { for (k = 100 * (HIGHMIN - 1);; k -= dk) {
highest = -INFINITY; highest = 0;
where = -1; where = -1;
for (i = 0; i < ns; ++i) { for (i = 0; i < ns; ++i) {
if (ELEV != INFINITY && if (ELEV == -INFINITY &&
(c >= nc || ((!(capx[c] == sectx[c][i] && (c >= nc || ((!(capx[c] == sectx[c][i] &&
capy[c] == secty[c][i])) && capy[c] == secty[c][i])) &&
(!(new_x(capx[c] + 2) == sectx[c][i] && (!(new_x(capx[c] + 2) == sectx[c][i] &&
capy[c] == secty[c][i]))))) { capy[c] == secty[c][i]))))) {
h = 3 * (5 - dmoun[i]) + dsea[i]; h = 3 * (5 - dmoun[i]) + dsea[i];
assert(h > 0);
if (h > highest) { if (h > highest) {
highest = h; highest = h;
where = i; where = i;
@ -1025,8 +1026,6 @@ elevate_land(void)
if (newk < LANDMIN) if (newk < LANDMIN)
newk = LANDMIN; newk = LANDMIN;
elev[sectx[c][where]][secty[c][where]] = newk; elev[sectx[c][where]][secty[c][where]] = newk;
dsea[where] = -INFINITY;
dmoun[where] = INFINITY;
} }
/* Elevate the mountains and capitals */ /* Elevate the mountains and capitals */