add industry upgrade (t4) to HC - requirement: Orbital station of any kind
"Artillery Station"

Station is an additional orbital that always spawns in combat with the normal orbital station, also getting destroyed alongside it
Shoots at visible enemy fleets with cluster munitions

spawn "Target Reticle" sprites on the campaign
on spawn, quickly accelerate a fading out circle ways from it
slowly change colour from yellow to red
spawn explosion

shot to arm time is 5s,
station reload time is 15s
variable 6-9 splinter explosions (maybe less if larger)

if easy enough: spawn a projectile, have it fly from the stationt to the target
before arrival, split it into X projectiles and have them impact with an explosion

This makes fleets avoid the area, it's from InterdictionPulseAbility:

	public static class IPReactionScript implements EveryFrameScript {
		float delay;
		boolean done;
		CampaignFleetAPI other;
		CampaignFleetAPI fleet;
		float activationDays;
		/**
		 * fleet is using IP, other is reacting.
		 * @param fleet
		 * @param other
		 * @param activationDays
		 */
		public IPReactionScript(CampaignFleetAPI fleet, CampaignFleetAPI other, float activationDays) {
			this.fleet = fleet;
			this.other = other;
			this.activationDays = activationDays;
			delay = 0.3f + 0.3f * (float) Math.random();
			//delay = 0f;
		}
		public void advance(float amount) {
			if (done) return;

			delay -= amount;
			if (delay > 0) return;

			VisibilityLevel level = fleet.getVisibilityLevelTo(other);
			if (level == VisibilityLevel.NONE || level == VisibilityLevel.SENSOR_CONTACT) {
				done = true;
				return;
			}

			if (!(other.getAI() instanceof ModularFleetAIAPI)) {
				done = true;
				return;
			}
			ModularFleetAIAPI ai = (ModularFleetAIAPI) other.getAI();


			float dist = Misc.getDistance(fleet.getLocation(), other.getLocation());
			float speed = Math.max(1f, other.getTravelSpeed());
			float eta = dist / speed;

			float rushTime = activationDays * Global.getSector().getClock().getSecondsPerDay();
			rushTime += 0.5f + 0.5f * (float) Math.random();

			MemoryAPI mem = other.getMemoryWithoutUpdate();
			CampaignFleetAPI pursueTarget = mem.getFleet(FleetAIFlags.PURSUIT_TARGET);

			if (eta < rushTime && pursueTarget == fleet) {
				done = true;
				return;
			}

			float range = InterdictionPulseAbility.getRange(fleet);
			float getAwayTime = 1f + (range - dist) / speed;
			AbilityPlugin sb = other.getAbility(Abilities.SENSOR_BURST);
			if (getAwayTime > rushTime && sb != null && sb.isUsable() && (float) Math.random() > 0.67f) {
				sb.activate();
				done = true;
				return;
			}

			//float avoidRange = Math.min(dist, getRange(other));
			float avoidRange = getRange(other) + 100f;
			ai.getNavModule().avoidLocation(fleet.getContainingLocation(),
											fleet.getLocation(), avoidRange, avoidRange + 50f, activationDays + 0.01f);

			ai.getNavModule().avoidLocation(fleet.getContainingLocation(),
											//fleet.getLocation(), dist, dist + 50f, activationDays + 0.01f);
					Misc.getPointAtRadius(fleet.getLocation(), avoidRange * 0.5f), avoidRange, avoidRange * 1.5f + 50f, activationDays + 0.05f);

			done = true;
		}

		public boolean isDone() {
			return done;
		}
		public boolean runWhilePaused() {
			return false;
		}
	}