Rearranged the order of the code so that it's more performant and added comments to further explain the logic and reasons for the complications, ie. the cheesing with artillery.
- Current behaviour is that when destroyers/defenders are created their target position is set to the entity that killed them.
- If a player picks up the artillery after the capsules spawn then they lose their cause.target and stop, not reaching the cause of the turret death.
- I've changed this behaviour so that if the target.cause is artillery then it spawns a defender/destroyer projectile NOT an entity. The projectile target can therefore be a position not an entity. So the capsules won't stop if the artillery is picked up.
- If the cause is not artillery turret or wagon then a destroyer/defender capsule entity is spawned instead of a projectile because a projectile cannot track the player.
- If the player picks up the artillery turret before the projectile that kills a turret arrives then the event cause.name will be missing and no bots spawn at all. I have changed the behaviour so that "if not cause" then we assume they're doing something fucky. We won't have the entity cause name or position, so let's just spawn double the normal amount of destroyers and just send them at 0, 0 since we know nothing else to do with them.
- Added spidetron to artillery_target_entities list
- Added code to fire a rocket at spidertrons as well as the non-damaging artillery
- Tested effect of 4 and 8 artillery rockets on spidertron. Kills shields quick but spidertron takes about a minute to die. Enough to deter them from staying too long but not too OP.
- If a player didn't have a character when they were jailed we would record their previous destructible state as `nil` which was treated as `false`. Now we treat `nil` as no previous character info and set the previous destructible state on repsawn/join.
- If a player was unjailed when offline or dead, we wouldn't restore the player character's destructible state, now we wait for them to rejoin/respawn to do that.
As per issue #1102.
- Checks if player is in spidertron
- Sets autopilot destination to position when jail used.
- Tried using similar to the train check but it didn't work for spidertron.
When a combat robot expires and is targeting an artillery wagon, it will now explode. This is a work around for a factorio bug where combat robots do not attack artillery wagons.
- Changed get_inventory(1) to get_inventory(defines.inventory.character_main) to make it clearer which inventory we're getting.
- changed area charted to 3x3 full chunks cented on the chunk containing the pinged coordinate. Will now charta 96x96 tile area which is more reasonable considering the cost of /spy