The ship speaker blares fake commercials stitched from the game's own sounds. Each one is real noise that calls Eyeless Dogs - reach the speaker and hit [E] to cut it before they hear. No audio files shipped.
Initial release. The ship speaker periodically broadcasts a fake commercial assembled
from clips the game already has loaded — no audio files are shipped, extracted or
redistributed. Banks are declared in the config as Type.field tokens and resolved by
reflection at runtime, so clips can be added or removed without recompiling.
Four broadcast categories. A jumpscare is rolled first and independently (5%); then an
emergency bulletin if a FlowermanAI or NutcrackerEnemyAI is alive inside; then a weather
bulletin if the moon's currentWeather is set; otherwise an advert. The advert is also the
guaranteed fallback, so a quiet run is never silent.
Long clips preferred. Banks discard anything shorter than MinClipSeconds, and each
pick samples four candidates and keeps the longest. The filter never empties a bank.
Dogs hear the ship. A broadcast feeds the vanilla RoundManager.PlayAudibleNoise from
the ship: silent for NoiseDelaySeconds, then repeating every NoiseRepeatSeconds until
the clip ends. noiseID stays 0 and timesPlayedInSameSpot stays 0 on purpose —
MouthDogAI.DetectNoise ignores IDs 675189/7/546 and any noise past 15 repeats.
Dogs lose interest again. The noise loop dies with the music, SustainedNoiseSkipIfDogNear
refuses to keep calling a dog that already arrived, and FadeInterest drains suspicion
faster than vanilla once the speaker is quiet. The fade only accelerates the game's own
countdown; a dog with a real targetPlayer is never touched.
Skip button. Pressing [E] on the ship speaker cuts the current advert short rather
than switching the speaker off, and with SkipCancelsNoise on it kills the pending noise
too — silence it inside the delay and no creature ever hears it. The hover tip reports
whether the speaker is sounding right now, not whether it is armed.
Terminal commands.speaker on, speaker off and speaker for status, intercepted in
Terminal.ParsePlayerSentence without hijacking option menus.
On-screen adverts. Re-triggers the vanilla HUDManager.ChooseAdItem on its own timer,
keeping the real 3D product model and real store discounts. BypassVanillaAdLimits drops
vanilla's once-per-quota, post-first-quota and multiplayer-only gates so adverts show in
singleplayer from day one.
Host-authoritative multiplayer over Unity Netcode named messages. No NetworkObject is
registered and no NetworkVariable or RPC is declared, so no NetcodePatcher step is needed
and a lobby cannot desync. The host picks every clip and broadcasts bank/index pairs; banks
are de-duplicated and sorted by clip name so index N is the same clip on every machine.
Late joiners are sent the current state automatically.
Physical switch reuses the vanilla InteractTrigger already wired to
StartOfRound.DisableShipSpeaker in the ship scene, found by matching the serialized
UnityEvent binding — no new networked object is spawned, and vanilla behaviour is preserved.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.