Silence extremely chatty debug line
Fix upgrade bugs. Not always updating after research. Was not applying
upgrades after loading savegame - closes ticket:4020. Was not applying
body hitpoint upgrades on new droids.
Allow designing and building obsolete tanks.

Since you sometimes might want to a bunch of cheap MG tanks as a decoy, even if you have twin AG researched.

Also, remove an unrelated uselessly-duplicated test in action.cpp.
Give preference to the power generators with modules.
semperfi-js: Update cyborg body stat names
Add tech handler for campaign
Make the minimum damage that a weapon causes configurable, so that varying
degrees of 'armour penetration' ability can be set for each weapon.
Remove unused ski and jump propulsion types
Prettify terrain table stats a bit.
Do not allow Nexus AI to build hardened sensor towers before being researched.

Fixes ticket:4025.
Make VTOLs return to rearm when out of ammo, if told to patrol or circle.

However, if set to hold fire, don't return to rearm, even when reaching a patrol endpoint.

Fixes ticket:3705.
Add Shift+V to select all fully-armed VTOLs.
Simplify droid selection type code.
When entering a map name, sort maps by some kind of similarity to the entered map name.

Previous behaviour was to ignore the entered map name, and reset it. This meant that typing a map name was actually
somewhat futile.
Stop and disconnect derricks when starting to demolish.

Fixes ticket:3176.
Fix completely broken effectStructureUpdates() and remove redundant variable RES_EXTRACTOR::active.

The best part of effectStructureUpdates() was using the same variable i as an inner and outer loop variable, even
though the inner loop didn't actually do anything (except changing i).
Fix wall alignment with fortresses.

Take into account the 2×2 size.

Fixes ticket:1520 and ticket:3236.
Make waiting-at-HQ units go to newly-built repair facilities or rearming pads.

Fixes ticket:3105.
identity: Give players unique unspoofable player IDs.

Players generate private keys (stored in the .sta files). Replies to NET_PING are now signed, so if the ping of a
player is not ∞, and you recognise the player ID of the player, then you know the ping is from the same player as
before.