Found a little bit of "inefficient" coding in the piece of code that calculates the player's distance from civilization (been snooping around inside the scripts a bit to learn about it).
As you know, it takes the cities' coordinates, the player's coordinates, calculates the distance and then moves down the list to see if any other cities are closer. Then it takes that distance to calculate if the player is far away or not, yadda yadda...
The problem is this (taking first two cities as example):
;anvil = ( -189714, -29375, 298 ) let civilizationPosition["x"] := -189714 let civilizationPosition["y"] := -29375 let civilizationPosition["z"] := 298 ;distance let tempFloat := ( ( playerPosition["x"] - civilizationPosition["x"] ) ^ 2 ) + ( ( playerPosition["y"] - civilizationPosition["y"] ) ^ 2 ) + ( ( playerPosition["z"] - civilizationPosition["z"] ) ^ 2 ) let distance := sqrt tempFloat ;bravil = ( 66180, -35710, 380 ) let civilizationPosition["x"] := 66180 let civilizationPosition["y"] := -35710 let civilizationPosition["z"] := 380 ;distance let tempFloat := ( ( playerPosition["x"] - civilizationPosition["x"] ) ^ 2 ) + ( ( playerPosition["y"] - civilizationPosition["y"] ) ^ 2 ) + ( ( playerPosition["z"] - civilizationPosition["z"] ) ^ 2 ) let tempFloat := sqrt tempFloat ;if smaller than distance to previous, set active distance to current if ( tempFloat < distance ) let distance := tempFloat endif
Notice how 'distance' is immediately made equal to the square root of 'tempFloat', even though it shouldn't have to be.
At the next city 'tempFloat' is recalculated, and again square rooted. Then it is compared to the current value of 'distance'.
What would be better:
Make 'distance' equal to the value of 'tempFloat' straight away, ie. change this line:
let distance := sqrt tempFloat
To this:
let distance := tempFloat
At the next city, remove this line:
let tempFloat := sqrt tempFloat
And just let the two values be compared normally:
if ( tempFloat < distance ) let distance := tempFloat endif
Comparing if A < B is the same as comparing if sqrt(A) < sqrt(B ), but way less CPU-heavy. Especially since a square root calculation is needed for every city as it is now.
The redone code would look like this:
;anvil = ( -189714, -29375, 298 ) let civilizationPosition["x"] := -189714 let civilizationPosition["y"] := -29375 let civilizationPosition["z"] := 298 ;distance let tempFloat := ( ( playerPosition["x"] - civilizationPosition["x"] ) ^ 2 ) + ( ( playerPosition["y"] - civilizationPosition["y"] ) ^ 2 ) + ( ( playerPosition["z"] - civilizationPosition["z"] ) ^ 2 ) let distance := tempFloat ;bravil = ( 66180, -35710, 380 ) let civilizationPosition["x"] := 66180 let civilizationPosition["y"] := -35710 let civilizationPosition["z"] := 380 ;distance let tempFloat := ( ( playerPosition["x"] - civilizationPosition["x"] ) ^ 2 ) + ( ( playerPosition["y"] - civilizationPosition["y"] ) ^ 2 ) + ( ( playerPosition["z"] - civilizationPosition["z"] ) ^ 2 ) ;if smaller than distance to previous, set active distance to current if ( tempFloat < distance ) let distance := tempFloat endif << More cities go here >> ;At the end, square root let distance := sqrt distance ;set distance in units of cells let distance := distance / 4096 ...
It's a (huge wall of text for a) minor thing, since this script is only needed when a new area has been explored, but every little bit helps.