What the mod does
ATG Signals is the transmit and receive layer behind position sharing, and it owns player marker visibility on every map surface — paper map and device screen alike.
Every player position marker the game would have drawn is withheld from everyone. What is drawn instead is this mod’s own picture: each player is sent, on their own connection and nobody else’s, their own position plus everybody their kit actually reaches. A position that is not in a player’s picture never crossed the wire to them, so there is no list on a client to filter and nothing to be read around.
On a server running this mod and nothing else, a player sees their own position when they carry something that can work one out, and sees nobody else. Seeing other people is what kit and a network are for.
Installing it
Load ATG Core before this mod — it is where the settings layers below come from.
Two other mods are found by load order rather than by being declared as dependencies, which means the mod list decides whether they are picked up — and both go BEFORE this one:
- ATG Garmin Vitals for ACE goes BEFORE this mod. It is what lets a contact carry a condition. Loaded after it, or not at all, every contact reads as well.
- A display mod goes BEFORE this mod. This mod is the one that reaches across: the signals tab, and the declaration that makes a display’s map count as a device screen, exist only where a display mod compiled first. With no display mod at all, every surface behaves as paper.
So the order reads: ATG Displays and ATG Garmin Vitals for ACE, then this mod — the two before it in either order between themselves — and anything that reads this mod, such as ATG Map, after all three.
Getting that order wrong fails silently — the guarded code compiles out, nothing errors, and the feature is simply absent. It costs more than the tab: with no declaration, nothing is ever treated as a device, so a display shows its holder their own position and nobody else’s while looking exactly like a display whose network is empty. This mod says which side it landed on in the log at world start:
[ATG_Signals] ATG Displays is not loaded ahead of this mod, so there is no signals tab and device screens show no player positions. List ATG Displays before it if that is not intended.
Devices come from this mod and from others. ATG Signals for RHS Devices fits the same component to RHS’s Garmin watches, DAGR and Orion.
The position picture
Each player is sampled at the rate their own device declares — a cheap watch slowly, a better receiver quickly — and what is sampled is where they were, not where they are. A reading is never interpolated and never moves on its own.
Two ways of losing sight of somebody are deliberately different:
- Somebody stops reporting while you keep your kit. They dropped their device, the link broke, a satellite jammed them. Their marker stays where you last heard from them and greys off as it ages. That is a last known position and it is worth having.
- You lose the kit that reads the picture. The picture goes, in full, at once.
Your own position is neither: either the kit you carry works out where you are or it does not, so it disappears rather than greying, and the picture says whether that is because a satellite is jamming you or because you are carrying nothing that listens.
A contact is drawn as a military symbol framed by what your side makes of them, and fades as the reading behind it goes out of date — so how solid a marker is says how much to trust where it is.
Where the picture is drawn
A device screen and the paper map are the same map. There is one of it in a world and every surface shares it, so what separates them is which surface is showing:
- A device screen shows the whole picture: everybody your kit reaches.
- The paper map shows your own position and nothing else, and only while your own kit can work one out. No tier of kit puts another person on paper.
The paper map is also wiped of everything a player cannot deduce on their own, squad leader markers included. On a server without this mod, the paper map is untouched.
How positions travel
Two layers carry them:
- Bluetooth is short and single-hop. It reaches a display or a relay a few tens of metres away, and two people standing together do not merge their kit.
- The radio data band relays. It takes its reach and its encryption key from the radio its holder is carrying and then does its own distance work, and it never asks whether a transmission was delivered.
A link runs one way, and a set’s reach is how far it transmits. Receiving costs nothing, so a mast that throws 4 km puts the picture in front of a man 3 km away with a pocket set who cannot put his own back. He sees the team and the team does not see him. That is the ordinary state of standing under an antenna, not a fault, and it is why a relay’s reach is worth having at all — under any rule that measured a link at the shorter of its two ends, a mast could never reach further than the handset it was talking to.
Which half you have is drawn on the Signals tab: green where a relay carries to you and you carry to it, amber where it reaches you and you cannot reach it, purple where you reach it and it cannot reach you, and dark where you have neither. The circle around you is your own reach; the circle around a relay is its own, and both are honest outer bounds — a link forms five metres inside one and drops five metres outside, so what is drawn never disagrees with what you have by more than that.
The corner says the same thing in words: RECEIVE ONLY, SEND ONLY, NO NETWORK where
somebody’s picture is arriving over a direct link with no relay carrying it, and
NO SIGNAL only when nothing at all is reaching you.
A hop only exists where a relay is. Anything that does not pass other people’s positions on is a leaf on the graph, so coverage across an operation has to be laid out rather than assumed. This is deliberately unlike the game’s own relays, and it is what gives a signaller a job. A hop between two relays can itself run one way, and it still joins them into one chain — traffic does cross it — so the Signals tab draws it at half width rather than breaking the chain there.
A relay you can no longer hear behaves differently depending on what it is. A mast or an antenna stays on the map: where it stands is not a secret, and one blinking out because you walked over a hill would be the worse lie. A relay somebody put down greys at the point you last had a link to it and fades away over the same window a stale contact takes, because you have no way of knowing where a backpack has walked to.
Reading the network and being part of it are separate declarations. A handheld screen shows its holder the team without carrying a thing for anybody, and a mast carries for everybody without showing anyone anything; a relay pack does both. Only what relays is a hop in a chain, and only what relays is drawn on the Signals tab of a display.
Who sees whom is decided on the server, never by filtering a full list on a client.
Condition
A contact carries a condition as well as a position — unconscious, dead, or neither — and it travels the same network, over the same links, to the same people.
This mod delivers a condition and does not work one out. Whether somebody is unconscious or dead is a medical question, read from whichever vitals mod is loaded.
Who is reportable is a different sensor from the one that finds a position. A condition is read only for somebody wearing a device that declares it can sense one — kit worn against the body with reason to notice. A receiver carried in a pocket or a pack works out where its holder is standing and has no way of knowing whether he is still standing, so it reports nothing about him however good it is at everything else. A casualty with no display of their own is still reported, by whoever is near enough to hear the thing on their wrist.
A condition needs no fix, and a position does. A satellite denying somebody their constellation stops them being placed, and the thing on their wrist goes on knowing what it knows — so it does not stop them saying they have gone down. Their marker stays where they were last heard from, greying, and the news still reaches it. A ground jammer does stop it, because it stops everything on the data band; Bluetooth is untouched, so somebody stood beside the casualty still hears them.
A contact says both what its condition is and how long ago it changed, so a surface drawing it can tell somebody who has just gone down from somebody who has been down a while.
Jamming
There are two jammers and they deny different things. Neither is a version of the other.
The satellite uplink is a ground station that tasks a jamming satellite against a constellation, denying it everywhere at once. A device that hears only that constellation stops being able to work out where it is — and because it does not know where it is, it has nothing to report, so it also disappears from everybody else. That is one denial with two symptoms. The uplink is aimed at the sky, so it is quiet and hard to find, which makes defending or denying one a mission rather than a direction-finding exercise. The satellite runs on a charge: it jams for a while, exhausts, and has to recover before it can jam again, and recovering takes longer than the jamming it buys.
The ground jammer denies sharing and not the fix. It fills the data band with noise for as far as it reaches, so kit inside it still knows exactly where it is and its holder’s own map keeps working, while nothing reaches the network and nothing comes back. It makes no distinction between sides — whoever is standing in it is cut off, including whoever put it there — and it is the loudest thing on the map, which is the counter-play.
Which constellations a device can hear is a property of the device, so cheap kit locked to a single band is what makes it possible to jam your own side as well as theirs. Everything is on one constellation unless a world authors more, so a server that wants none of this gets a single band nobody is jamming.
Both kinds arrive switched off. Putting a jammer down and starting it are two decisions: a player sites one while the ground is quiet and works it when it is worth working, using the action on the device itself. A jammer a scenario places for an objective is driven the same way by whatever placed it.
Placed markers
A marker drawn on the paper map is written on paper, and paper does not transmit. It stays on the machine that drew it and reaches nobody, whatever the person holding the pencil is carrying. Handing one over is something a person does — give somebody the map, or stand next to them and copy what they have drawn — not something the network carries.
Two kinds of marker ignore all of that, and neither consults the network:
- A marker the world placed — every scenario objective, every base marker, anything authored into the map itself. There is no author to trace a chain back to.
- A marker drawn from inside the Game Master editor. Running a session is done from outside the fiction, so a briefing left on the map arrives whether or not anybody is carrying a radio. It is stamped as the marker is drawn, so it survives whoever drew it leaving the editor.
Faction scoping is decided on the server. A marker meant for one side is not sent to the others at all, rather than being sent to everybody and hidden once it arrives.
The name under a placed marker is that marker’s author and is the base game’s own, so a
placed marker says who drew it whatever m_iNamePlayerMarkers is set to.
Text messages
A handset carries typed messages between two people, and it is the one thing in this mod that is not on the network. A message needs the handset in somebody’s kit and nothing else: no link layer carries it, no relay chain has to reach, and nothing above stops it — a satellite blacking out a constellation and a ground jammer filling the band both leave texting exactly as it was. The network decides who can be seen; a handset decides who can be written to.
With m_bGateTextChat on, every ordinary text channel closes. Global, Faction, Group,
Vehicle and Local stop accepting anything typed into them, for everybody, and the only
text anybody can send is handset to one contact. System and admin lines are untouched, and
so are commands: / still reaches whatever registered it, and a line opening with # goes
to the server, so logins, votes and anything an administration mod adds keep working.
It ships off. It takes a channel away from every player on a server that has not asked for it, and a world with no handset in its arsenal would leave nobody able to type at all.
The gate is on the client. The two places a message could be refused on the server sit on the chat channel objects, which are configured in whichever chat entity a world places — reaching them would mean replacing that entity in every world. So the send is refused on the machine that typed it and the receipt is dropped on every machine running this mod, which means a client that bypassed the first still reaches nobody who is running it. It is a rule for a server whose players are running the mod, not a defence against one whose are not.
Being told one arrived
A message landing on a handset makes it sound — a short morse tone, positioned at about pocket height on the person carrying it, so it arrives from where the handset is rather than flat inside your head.
Everybody close enough hears it, not just the person it is for. A handset that goes off in your pocket gives your position away to anyone nearby, which is the point of it being a sound at all: lying up with your phone on is a decision with a cost.
It stays quiet when the handset is already in your hand, and when a chat window is open — for everybody, not only for the person reading. Both mean the device is out and being looked at, and a phone in plain sight has no pocket to sound from.
Nothing about this is configurable. A world that wants a different tone or a different range replaces the sound project the mod ships.
Contacts
Your contacts are everybody on your own side, worked out fresh each time rather than stored, plus any number somebody has handed you.
Two people stood together, each holding a handset, can share numbers with the action on the model. It goes both ways at once, because that is what the act is — a one-way share would leave whoever offered it unable to answer what they had just made possible. Once it is done the action says so and stops offering, so handing a number over has an acknowledgement rather than looking the same as never having tried.
A handset takes quick slot 9 as it is picked up, pushing off whatever was there. Nothing about a radio needs it in your hands, so that slot was spent on an item nobody presses a number for; a handset is useless until it is held. It does not declare itself a radio to get there, so anything asking whether a player is carrying a radio still gets the right answer.
A number belongs to the character, not to whoever is driving it. Somebody running one of the world’s own characters hands over that character’s number, and it goes on working after they let go of it. A message to a character nobody is playing reaches whoever is running the session — everyone with the Game Master editor open, plus whoever is currently driving that character — so a Game Master can be written to in the fiction and answer as the person who was written to.
A contact who has put their handset down stays in the list and is shown as unreachable. They have not stopped being a contact, and dropping them off the list would read as their having left.
The server log records who wrote to whom and never what they wrote. Being able to see that the mechanic is working is one thing; handing over the traffic is another.
The hardware this mod ships
Nothing here needs a particular faction or map. All three emplacements are placeable from the Game Master content browser.
| Prefab | What it is |
|---|---|
Prefabs/Props/Signals/GroundRadioJammer.et | The ground jammer. A cased transmitter on a tripod under a mast and four splayed whips, about 2.5 m tall — deliberately conspicuous, because a jammer that cannot be found has no counter-play |
Prefabs/Props/Signals/SatelliteUplink.et | The satellite uplink ground station. A 0.9 m dish on a low pedestal with its modem case beside it, under a metre tall — deliberately unobtrusive, because finding one is meant to be the mission |
Prefabs/Items/Equipment/Signals/RelayBackpack.et | The short-range relay as it is carried, worn in the backpack slot. It reports its wearer and holds other people’s positions, so wearing one is what lets a signaller see the team |
Prefabs/Items/Equipment/Signals/DeployableRelay.et | The same relay deployed, set down where a chain needs a hop and relaying from where it stands. It carries nobody, so it reports nobody |
Prefabs/Items/Equipment/Signals/GprsHandset.et | The text handset. A pocket set carried in the gadget slot, with a live screen and a contact list; it takes no part in the position network at all |
The relay pack costs the backpack slot. That is the trade the design makes everywhere: seeing the team is paid for in the room it takes up.
The two relay prefabs are one piece of kit and a player moves between them. A pack dropped on the ground offers a deploy action that stands the relay up where it lies, facing whoever deployed it; the deployed relay offers a pack-up action that folds it back into a pack. Each takes ten seconds, so neither is something to do while being shot at. They are separate prefabs rather than one prefab with a switch, because a worn relay reports its wearer and a deployed one reports nobody.
Deploying needs the pack empty. It is a backpack as well as a relay, and the entity holding whatever is stowed in it is the one being taken away — so the action refuses while the pack has anything in it, and the pack’s own storage action sits in the same menu to clear it with. A relay packed up comes back as an empty pack.
The two jammers carry the switch action on the device itself and are replicated, so a client is told whether the thing in front of it is running and the action reads correctly for whoever walks up to it.
Each emplacement carries a recessed screen showing a live readout, drawn only on the machine of a player standing close enough to read it:
| Emplacement | What its screen says |
|---|---|
| Ground jammer | Whether it is running or on standby, and how far its noise reaches |
| Satellite uplink | Whether it is tasking, jamming, recharging or on standby; which band it is aimed at; and how much charge that band’s satellite has left |
| Deployed relay | Whether it is linked, unlinked or sitting in a jammer’s noise, and how many people’s positions it is carrying |
The uplink’s screen is the only place a player can read a satellite’s charge. It is an instrument rather than a broadcast: the reading travels with the station’s own entity, so it is read by going to a station and not from anywhere on the map. The relay’s screen reports counts and a link state and never a name or a position, so anybody who walks up to a working set learns nothing they could not already infer from it standing there.
Settings
Settings live in one JSON file under the server’s profile directory, at
ATG/atg-signals.json. See ATG Core for how the layers stack.
A bool in this file is written true or false. A 1 is ignored — the setting keeps
the value it already had, and nothing says so.
| Key | Default | What it does |
|---|---|---|
m_fDataBandRangeUnstatedM | 800 | How far a radio that states nothing of its own carries the position picture [m]. A ceiling, not a flat figure, so a short-ranged set stays short-ranged. 0 lifts it entirely |
m_fJamSecondsAtFullCharge | 300 | How long a jamming satellite can deny a constellation on a full charge [s] — the length of a blackout |
m_fRechargeSecondsFromEmpty | 1200 | How long an exhausted satellite takes to refill [s]. Keep it well above the jamming time, or a constellation can be held down permanently |
m_fResumeChargeFraction | 0.25 | How much charge has to be back before an exhausted satellite jams again. Stops it stuttering |
m_fGroundJammerRadiusM | 2000 | How far a ground jammer denies the data band [m], for jammers that set no reach of their own |
m_bGateTextChat | false | Close every ordinary text channel and make a handset the only way to type to anybody. Off leaves the base game’s text chat untouched |
m_iNamePlayerMarkers | 2 | Whether a device screen names the player a marker reports. 0 off — no name, not even on hover, so a display says where somebody is without saying who. 1 on hover. 2 the name stands under the marker. Your own is never named at any setting, and a relay or an emplacement never is |
m_iLogVerbosity | -1 | -1 inherit from ATG Core, 0 quiet, 1 normal, 2 verbose, 3 survey |
A complete file, carrying the shipped values:
{
"m_fDataBandRangeUnstatedM": 800,
"m_fJamSecondsAtFullCharge": 300,
"m_fRechargeSecondsFromEmpty": 1200,
"m_fResumeChargeFraction": 0.25,
"m_fGroundJammerRadiusM": 2000,
"m_bGateTextChat": false,
"m_iNamePlayerMarkers": 2,
"m_iLogVerbosity": -1
}
Reading a run
Beyond the readouts on the three emplacements, nothing here draws — so the server log is the only place the link graph, the jammers and the constellations can be judged from as a whole. There are two readings and they are meant to be used together.
The summary line goes out at normal verbosity, once per sweep, and only when something in it has moved. A quiet situation writes nothing and a link dropping writes one line:
[ATG_Signals] 2 player(s), 3 node(s), 2 link(s) - 1 bluetooth, 1 data band, 1 one way - 1 transmitting, 1 receiving, 2 with a fix, 0 denied a fix, 0 jammed off the data band, denied none
Links are counted per pair however many directions they carry, and one way is how many
of those pairs carry in one direction only — the figure to read first when somebody
reports that two people near a working relay cannot see each other, because a one-way pair
is indistinguishable from a two-way one in every other number on the line.
It reports counts, so a link forming in the same sweep as another drops leaves every number where it was and prints nothing.
The state dump is the whole picture — every satellite’s charge, every uplink and ground jammer with its position and whether it is running, every node with what its kit can do and who it reaches, and who each viewer is therefore entitled to see. It ignores the verbosity setting, because it is only ever produced on request.
Ask for it with lctrl+lshift+j, or from the diagnostic menu under ATG Signals. The menu
belongs to the machine it is worked on, so it produces the graph on the machine that is
also the authority — a listen host. On a client it says so, and prints the one piece of
state a client is handed: which constellations it reads as denied.