Turrets
A turret is an object whose only job is to acquire a target and shoot it, and never move. Two things fall out of one idea:
- a deployable tower - bought or earned as a kit, towed into position with the grav tether, and unfolded into an autonomous emplacement;
- an autonomous mount - the same object welded into a ship's or station's body frame, firing independently of where the pilot is looking.
They share all of their combat code and differ only in where position comes from.
Turning turrets on
Turrets need extra ship data: every turret hull exists only in the add-on's own
turrets/extraShipData_turrets file. Set EXTRA_SHIP_DATA: true in the mission's settings
or profile on an engine that loads it. lm_turrets_enabled() is then true exactly when
those hulls reached the engine this mission. With it off, turrets are off - prefabs yield
0, kits never spawn, and the Peacetime job built on them is not offered - so a turret can
never ask the engine for a hull it was not given.
Once deployed, a turret takes comms orders like any unit: Fire on a target and Hold fire / Weapons free (orders).
Placing one from a mission
prefab_spawn(prefab_lm_turret_tower, {"START_X": x, "START_Y": y, "START_Z": z, "side_value": "tsn"})
Three kinds ship: prefab_lm_turret_tower (beam), _heavy (longer reach, harder hitting,
slower), and _drone (launches attack drones). All carry type: prefab/turret, so a GM
menu enumerates them with no hardcoded list.
Bolting turrets onto a ship or station
lm_turret_bolt_ring(ship_id, 4)
The same call for a station and a hard-maneuvering ship: offsets are body-frame and the engine's tractor holds them there, so neither needs a per-tick reposition.
The deploy ritual
A kit is a physical crate, not an inventory row, so deploying is a crew job:
- Buy or earn
turret_kit_beam/_heavy/_drone. Aprice:is all it takes to appear in the station Market -market_purchasable()collects every item that has one. - Activate it from Weapons or Engineering; a crate ejects ahead of the ship.
- Tow it - Weapons hold-click gives Grav Tow Kit.
- Release where you want it, then hold-click again for Deploy Turret.
Balance
| lever | default | what it does |
|---|---|---|
| per-side cap | LM_TURRET_CAP = 8 |
deploying past it is refused, server-side |
| lifetime | LM_TURRET_LIFETIME = 1200s |
the tower powers down and is removed |
| magazine | LM_TURRET_CHARGE = 60 shots |
charged per shot, then dormant until resupplied |
A mission overrides any of them with a shared of the same name. Upkeep is per shot
rather than per second because //damage/object carries the shooter in
DAMAGE_ORIGIN_ID - a timer would punish a turret nothing ever flew past.
Adding a new tower kind
No code. Add a hull to turrets/shipData_turrets.yaml, a type: prefab/turret prefab,
and (if it should be buyable) an item whose turret_prefab names the prefab. The GM menu,
the market and the deploy route all discover it.
Engine facts worth knowing
Measured on 1.3.5 by LM_TestRange/maps/test_turret_probe.mast and friends.
A turret must use a hull the mission ships itself
A behav_station fires only from a hull the mission declared to the engine.
Stock starbase art produces a turret that never shoots.
The turret hulls live in media/turrets/extraShipData_turrets.yaml and are
registered with ship_data_add_extra, which points the engine and the library at
the same file. They ride the media pack rather than the turrets mastlib
because a mastlib is a zip and the engine cannot read inside one; a media pack is
unpacked to disk once, so the engine can be handed a real folder.
Do not use ship_data_merge_mod for this. It reaches the engine by generating
extraShipData.json, which get_ship_data() then loads back on the next run
while the addon declares the same entries again - 51 hulls became 102 from run 2.
Beam stats are fixed at the hull
beamRange / beamCount / beamDamage are not readable or writable on a live object
- they live in the engine's ship table. A variant with different beams needs its own
shipData entry, and its prefab's range: must be kept in step by hand.
A drone tower is the one kind that is not a behav_station
drone_launch_timer launches drones only under behav_npcship; a behav_station
launches nothing whatever its hull says. The drone tower therefore rides
behav_npcship with throttle 0 and target_pos pinned to its spawn point (0.0u drift
measured over 90s). Stock starbase_torgoth already carries a timer, so it needs no
new art. Note also that a //launch/drone event reports the drone as origin;
the launcher is parent_id.
Turrets are targets
A turret carries turret and neither ship nor station, so turret is named
explicitly in ai_chase_npc's candidate set - that is what makes enemy NPCs engage
one. Feral monsters still hunt players only. A fleet ordered against emplacements
needs test_roles: station,turret.