Overtime
Late join a shift in progress, up to 7 players, 14 of the game's own bugs fixed, 42 new customers and the cut content put back. Host decides.
| Last updated | 12 hours ago |
| Total downloads | 13 |
| Total rating | 1 |
| Categories | Mods Misc |
| Dependency string | Vippy-Overtime-1.0.2 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack_IL2CPP
BepInEx pack for IL2CPP x64 Unity games. Preconfigured and ready to use.
Preferred version: 6.0.755Ice_Box_Studio_SAM-ModSettingsMenu
Adds a unified in-game mod configuration screen to the main and pause menus.
Preferred version: 1.1.0Ice_Box_Studio_SAM-ShiftAtMidnightLocalizationAPI
Shift At Midnight Localization API is a simple API module that enables mods to support multiple languages.
Preferred version: 1.0.0README
Overtime
Shift At Midnight with your friends, minus the parts that made you stop playing. Someone can join a shift that's already going. Seven of you fit in the store instead of three. The shelf that locked you in place, the report screen that waited forever on a friend who'd quit, the quit button that didn't quit: fixed. And the studio left a lot of finished writing on the floor, so it's back in: 42 new customers, new reviews, new phone calls, cut characters, and a handful of "wait, was that always there?" moments for people who've been through the story before.
Everything is written in the game's own voice and merged in memory at load. Nothing in your install is touched. Turn any of it off and you can't tell the mod was there.
The host decides. Late join, the player cap, the scares, the story variety and the veteran moments are the host's settings and reach every guest without them changing a thing. A guest without the mod still gets most of it, because it rides the broadcasts the host already sends. Ping, chat and the late join catch-up need it on both ends.
A note from Vippy
This is the first thing I've built for Shift At Midnight and it got out of hand in the best way. It started as "let my friend join late" and turned into a couple of very long nights reading the game's code and putting back what the studio wrote and never shipped. If something's off, or you've got an idea, Vippy's Discord is where I am, and new builds land there before Thunderstore. Ko-fi if you want to keep the lights on.
One more thing, and it's personal. My cat Boe passed away this week, three years old, after a short fight with cancer. He was the most loving animal I've ever known and he spent his last two days getting spoiled rotten. The vet bills were a lot. If you can spare anything, or just share it, here's the GoFundMe. Thank you either way.
What's in it
- Late join. Off, Invites or Open, switched mid shift. A joiner gets the night, the money, the stock, the rating, the timer and every event that already fired.
- Up to seven players. The game's own dropdown stopped working past three. Hunts scale with the head count.
- Eighteen of the game's own bugs fixed, the ones you've hit: the shelf lock, the endless report screen, the frozen pause menu, the scanner you couldn't look away from, the quit hang.
- The Kwalee splash actually plays now on Linux and Steam Deck, instead of stuttering at two thirds speed and getting cut off.
- Story nights that differ between saves, with the customer variants the game wrote and never sends.
- 42 new customers, 3 new drivers, 20 new reviews, cut characters restored, all in the game's format and voice.
- Veteran moments, rare and off the save's own seed, for people who've finished the story.
- Spectate cycling, a ping marker, text chat, a better mic, skip tutorials, an unstuck key.
- Every setting in the game's settings menu, applies live, no restart.
The rest of this page is the long version.
Joining a shift that has already started
A friend can walk into a shift in progress, and they do not need this mod to do it. The game already spawns a mid-shift joiner and already resyncs them from the host about three seconds later. One Steam lobby key was the whole blocker, and clearing it is what Overtime does.
Three modes, host side, switchable without leaving the shift:
| Mode | What happens |
|---|---|
| Off | Vanilla. Nobody joins a shift in progress, and Overtime makes no Steam calls of its own. |
| Invites | Friends, invites and Steam overlay joins get in. The lobby stays out of the server browser. |
| Open | The same, plus a live row in the browser with the night it is on. |
Invites is the default. The host decides who actually gets in:
- a lobby at its limit turns them away, and nothing gets past seven whatever the limit says
- the gap between the end of the shift and the end of day report turns them away, because a joiner is never enrolled in the completion roster for that night
- a cutscene turns them away, unless you say otherwise
- arriving during a hunt is allowed, and the joiner waits it out
- anything that is not the shift itself is left to the game, which already turns those joins away
Each decision writes one line to the log with the player and the reason. A refused joiner gets the game's own disconnect message, and there is no way to tell them why without both ends running Overtime.
What the joiner arrives with
The game hands a late joiner the money, the day, the inventories, the tokens, the shop refreshes and the store upgrades on its own. Overtime sends the rest:
- the running revenue, which the game only ever broadcasts as a change, so a joiner would otherwise start their night at zero
- hygiene, stock, store rating, seconds left, doppels let through, diffusers, completions and flashlights, none of which the game sends at all
- the night number, how far into the night it is, and tonight's running order
- the one-off events that already fired tonight, so the ambulance, the antlers, the dentists, the rakes and the rest are where everyone else sees them
Shelves fill themselves in about half a second, so nothing is sent for those.
All of that needs Overtime on both machines. A friend without it still walks in and still gets the game's own resync, which is exactly what they would get from a host running nothing at all.
Joining during a hunt
You come in watching over somebody else's shoulder. When the hunt ends you get your own eyes back
where your character is standing. Nothing about the hunt is driven for you, because half a hunt is
worse than none. 10 Late Join / Resync Hunt State turns that off and leaves a joiner with whatever
the game gave them.
More of you
10 Late Join / Max Players starts at three, where the game starts, and stops at seven, where the
game's own identity table runs out. Past seven a player loses their name and their voice and nothing
in the log says so, which is why nothing goes past it.
The game was never really stuck at three. Its create lobby dropdown offered one, two, three and six, and every row past the fourth did nothing at all. Overtime fills the gap: the dropdown runs one to seven now, and the warning popup the six-player row used to raise is gone, because you already chose this on the slider.
Above three the hunt gets more to spend, a quarter more for each player past the third, so a full
lobby of seven faces twice what a lobby of three does. At three or fewer the night is exactly what
the game wrote. That is 40 Scares / Scale Difficulty With Players.
The night
00 Overtime / Scares is a budget rather than a firehose, because a horror game that scares you
constantly stops being scary. More, the default, gives the host two extra scares a night with at
least two minutes of quiet between them. Much More doubles the budget and halves the gap. Vanilla
and Off both leave the night exactly as the game wrote it; the log says which of the two you
picked.
Nothing it reaches for is new, and nothing it reaches for is ahead of the story. Every extra scare is a prop the studio built and pinned to one night, and it only comes back on a later night than that one: the ambulance from night 4, the doppelganger at the pumps from night 8, the dentist on the bus from night 10, the dentist on the roof, the crawling dentist and the bathroom guy from night 12, the dentist in the storage room from night 13. So every one is a callback to something you have already seen, never a preview. Nights 1 to 3 get no extra scares at all; the game's own nights stand on their own. In endless there is no story to spoil and every plain prop is in, the creepy painting with them.
Tools, objectives, creatures and anything that spawns are never in the list. The anomaly lens is the game's tool for checking customers, the antlers belong to the shrine objective, and the truck drops real items, so none of them turn up early.
It also holds off. No scare lands in the opening quiet of a shift, during a hunt, or while the end of day report is up, and the same one never turns up twice running. It is asked on the night's own beats instead of running a timer of its own, so a guest with no mod installed sees all of it exactly as the host does.
Odd moments ride Humour instead and they are rarer, two a night with five minutes between them: the
telephone holding a conversation with itself, the thing in the dumpster back somewhere it has
already been, and, if you turn them on, a customer who stops shopping and wanders off, the cow, and
a prize wheel that occasionally drops a second coin. The thing in the dumpster only goes back to
spots the game already walked it to, never on ahead, and stays put once it climbs in. The cow only
shows in a save where the game has already shown it. No new jokes. Every one of them is something
the store already does, turning up when it has no business turning up.
40 Scares / Night Scare Budget and Minimum Gap Seconds are the numbers More uses, and the ones
Much More doubles and halves.
Story runs
A second run of the story should not play like a rerun. The game already draws the everyday
customers at random, but everything around that draw repeats: the order they come in follows a
fixed ranking, each doppelganger always gives itself away on the same question, and a restart
rerolls the night instead of replaying it. 00 Overtime / Story Variety works on those, and only
those.
The story does not move. Night 1, the tutorial, is exactly the game's. Every customer pinned to a night comes on that night in that slot, and so does anyone the story leans on. Events, set pieces, emails, calls and the dentist are the game's, on the game's nights. Endless is random already and is left alone.
Light, the default:
- A night plays from a seed made of the save, the slot and the night. Loading a night again gives the same people, the same order and the same event slot, so a bad night cannot be rerolled. A new save gets nights of its own. The game's own random stream is put back the moment the night is built.
- Some people were written more than once, each version slipping on a different question, and the game only ever sends the first. Andal Khan's nametag is one version; his construction uniform and the face the anomaly lens does not find are two more that have never come in. Any of them can now, on the nights the rules allow, and a version only the lens can catch still waits for the lens.
- The everyday customers come in a different order each night. Story customers keep their places.
Full also deals out which of the everyday customers are doppelgangers, keeping how many there
are, so remembering who was one last time does not help. Off builds the nights exactly the way
the game does.
It is the host's call and it is on the create lobby screen, in the row under max players that it
shares with Skip Tutorials. Each
part has its own switch in 45 Story Variety. Everything happens on the host while the night is
built, so a guest without Overtime sees the same customers everybody else does. The diagnostics file
gets the night's seed and one line for everything that was changed. The whole map of what the game
holds fixed and what it rolls is in docs/STORY-VARIETY-2026-09-21.md.
Moments for people who know the game
Somewhere past the fifth or sixth run of the thirteen nights, the game stops being a game. You know
which questions catch which copy, you know which faces have never once been wrong, and you stop
asking. 00 Overtime / Veteran Moments is for that player.
Everything it adds leans on something this save has already done, which is why a first time player reads all of it as an ordinary Tuesday. A person who came in on an earlier night. A name on the killed list. A prop the story has already shown you. Nothing arrives before the night the game itself would have got there, nothing is added before night 4, and endless is left alone.
- Somebody comes back. A human you looked over and let through turns up again on a later night with a second set of lines, written as a second visit. Russell Crane is still after his ten percent. Morris Seagrave has been thinking about the question he asked you. Marjorie Cole wants to know whose ambulance that was.
- Karen Whitfield comes back. The studio wrote Karen a second visit, drunk, celebrating the deal she was one signature away from closing the first time you met her. They wrote her report line and they shipped her lines, and the game can never send her, because coming back needs her to have been in already and being in already uses her up. She can now.
- The question you always ask. Two of the copies get a second version that answers the question you have been asking since your third run, correctly, and gives itself away somewhere else entirely. Cara Hastings knows her own date of birth this time. Travis Dunn still has the lisp.
- Somebody is asking after the one you shot. If Troy Howes is on the save's killed list, his fifteen year old sister comes in looking for him. Search his name on the computer while she is at the counter and she will answer about his file, the way Tommy Delgado answers about Catherine's.
- A review that was about your night. Now and then a five star review mentions what was actually in the store, and only while it is in there.
- The one who was never a copy. Off by default. There are faces in this game that have only ever
been written human, and a returning player works that out and stops checking them. On rare runs,
the one who came back is not them. The lie is checkable against their own record, the report says
so afterwards, and the game counts it as a doppelganger properly: no fifteen dollar penalty for
shooting it, and a bigger hunt if you let it through. It is off because it takes away something you
earned.
47 Veteran Moments / Copies Of The Uncopiedis the switch.
Rare, the default, means a run holds one, sometimes two. Often is about twice that. Never two
nights running, never the same one twice in a save, and never more than one a night. A veteran
customer takes one of the slots 60 Content / Extra Customers Per Night already asked for rather
than adding one, so the night is exactly as long as it was going to be.
It is the host's call, and it comes off the same per save seed the story variety work uses, so
loading a night again plays the same moment rather than rolling for a new one. Each part has its own
switch in 47 Veteran Moments, and the diagnostics file gets one line a night with the seed on it.
The design, the ranking and everything that was considered and dropped is in
docs/VETERAN-MOMENTS-2026-09-21.md.
The new writing
New text in the game's own voice and the game's own format: forty two new speakers, three new car drivers, ten second visits for people the game already ships and seven more named dialogue entries, fifty three end of day report rows, twenty two reviews, ten reviewer names, five hints, ten identity records and three plates.
None of it replaces anything. The mod does not touch a single file in the game folder. The game loads and parses its own text exactly as it always does and Overtime appends to the result in memory, so two mods can do this at once without fighting and a game update that re-encrypts the tables changes nothing.
English is written. The other eight languages ship carrying English and fall back a line at a time, so a French player gets French for everything the studio wrote and English for everything Overtime added, until somebody translates it.
Two of the additions are really fixes:
- Seven review rows the game ships have never been possible to see. The rolls that pick a review stop
one row short of what was written, so
Perfect Review 40and the last row of each of the six mid and bad runs have sat unread since release. - One reviewer name was drawing ten times as often as the other forty nine. That is fixed, and there are ten more names besides.
New people walk into the store as well. A couple a night, mixed into the queue the game already built, saying their own lines and handing over their own identity card. Nobody turns up twice in one shift, nobody comes back on a later night while somebody else is still waiting, and they get their own line in the end of day report like everybody else. The save remembers who has been, and in story a night loaded again brings the same people. Two of them are Harold Brant 55 and 56, variants the studio wrote report copy and a database record for and then never shipped dialogue for, and each of them comes once a save.
They arrive in a body the game already ships, because that is the only way anybody arrives at all: a customer is a prefab, and every prefab in the build was made for somebody who already exists. A player without Overtime sees whoever the game would have sent instead, which is what they would get from an unmodded host either way. The body is only lent: the game writes every body in the night into the save's met list, and the ones the pack borrowed come back off it before the save is written, so the person it belongs to can still walk in on a later night.
The night schedule gets the same treatment. The game declares a random event scheduler, gives it a menu entry in the editor, and never calls it, so every night plays the one event it was written for and nothing else. Overtime writes the missing piece. A night still usually plays out the way it shipped; now and then it carries an event from an earlier night instead, once, and the save remembers it. Nothing arrives before the night it was written for.
The pack is read on a worker thread while the game is still booting, so the frame where the game loads its own text only pays for the merge itself, and the log's Verbose level says how long that took for each table.
It all sits under 60 Content, and 00 Overtime / New Content turns the lot off.
Cut content, finished
Things the studio built, wrote or half wired and then never let happen. Every one of them was traced
to why it is dead before it was touched, and every one is finished the way the game itself would
have finished it, on the nights its own story allows. docs/CUT-CONTENT-2026-09-21.md is the full
sweep, including what was left alone and why. It all sits under 65 Cut Content.
People the game finished and never scheduled. A customer only reaches a night through an Npc asset, and six finished bodies have no asset pointing at them: Marjorie's second visit, Diana's second visit, the Karen Whitfield doppelganger, the human Dimitri Markou, Doug Kramer and the firefighter Aaliyah Johnson. All six have dialogue, a report row and an identity record. They are back, weighted and gated off the sibling asset the studio wrote for the same person, so they arrive as often and as late as their other visits do.
Two of those are really wiring faults. The customer list's Doug Kramer 1 entry was duplicated from
Derrick Vaughn and never repointed, so Derrick could be drawn twice and Doug never at all; it now
points at Doug. And the front page about the fire at Parkside Plaza spawned nobody, while the
firefighter whose first line is about that fire sat in the build unspawnable: every other newspaper
that names somebody carries them, and now so does that one.
The Karen Whitfield copy is the one to watch. Her lie about the blood on her hands and the report line that explains it were both written, and hers was the only one of the three Karens the game could not send.
Two thieves and three drivers. The game sends thieves out of its own list at its own moments and pulls cars up through its own no-repeat bag, so nothing here schedules either. When one of the six thief bodies or one of the three cars the pack was written against turns up, it can carry a new person instead: the thief says the pack's lines, and the car carries a new driver with a plate of their own that the registry device really answers. A driver only ever rides the car they were written for, because a driver has to answer the questions that car's own clutter raises and ask for the amount of petrol that car's tank takes. One of the three is human, two are copies, and both tells are the game's own kind: what the registry says against what is parked in front of you.
Norbert remembers. The lemonade seller is not cut, but his fork is half written. His own hittable records being shot, his stand reads the flag and turns on one of two children, and the pair outside your door on the ninth night are both the same one line. The side for somebody who shot him now says so.
The hints the game wrote and never showed. Three rows sit in the shipped table with nothing that can queue them, and two of the three have an empty method and a still-reset save flag behind them: the line for when the thing in the vents gets irritated, the line telling you what a token is for, and the third line of the low review score pair. They show at the moment each one explains, once a save, through the game's own hint box. Five new hints ride along on the same rules.
A phone that rings with something new. Four calls, on the nights the story has room for them: the manager twice, a wrong number, and something in the forest. A call is the game's own recipe, an objective, a whosCalling id, the ringing sound and a chat line every four seconds. It never rings before the night's own event has been and gone, never during a hunt, never twice in a night, once each per save, and only when everybody in the session is on Overtime, because the lines travel on the game's chat log and a player without the pack would see a blank where the line should be. The phone is put back exactly as it was afterwards, so the night's own call is never left unanswerable.
Fixes
These are the game's own defects. All of them are invisible when they work, and each has a switch in
20 Bug Fixes under the Bug Fixes master.
| Fix | What you would have seen |
|---|---|
| Keybind Lookup Cache | your keybinds parsed out of a string seven times a frame, all session, for anybody on a keyboard |
| Countdown Text Rate | the rat and roach timers rebuilding their label fifty times a second and reassigning the font on every tick |
| Counting Script Clamp | a finished counter still redrawing every frame three minutes later |
| Saved Volume At Start | the Kwalee splash and the first launch screens at full volume whatever your sliders say, because the game only applies them once the menu loads and the splash video skips the mixer entirely |
| Interact Retry Queue | a vent, bin, ID card or gun case that made no sound and no animation for somebody who had just joined |
| Shelf Release | stuck staring at a shelf with every back press ignored, because another player touched it while you were stocking it |
| Restock Race | "Shelf Stocked!" on a shelf that is still short, because a customer took from it while you were stocking it and you had to go back in for it |
| Missing Text Fallback | [DIALOGUE NOT FOUND IN FILES] on screen where a line should have been |
| Report Player Count | the end of day report waiting on somebody who has quit, so nobody goes back to the store |
| Player List On Join | a late joiner missing from the store's player list, which is the list the finale reads to revive people |
| Tutorial Gate | night one's register stuck on "ALL players must complete the tutorial first" after somebody joined or left partway through the ID check |
| Car Computer Release | going down at the licence plate scanner and coming back up still looking at its screen |
| Question Pause | the pause menu dead for the rest of the night after you left a customer's questions |
| Night Stall Watch | a night that stopped moving and no way afterwards to say where it stopped |
| Quit Watchdog | Quit leaving the window up for good, because the engine shuts down cleanly and the process then hangs on the way out |
| Splash Timing | the Kwalee splash freezing on its last second, because the menu load was timed from before the video started |
| Run In Background | the game pausing the moment its window lost focus: a launch stuck on the splash or in the lobby because another window had focus, and a host who alt-tabbed freezing the whole lobby |
| Splash Video | on Linux and Steam Deck, the splash stuttering at two thirds speed with the sound breaking up and getting cut off at 3 seconds, because Wine decodes the 4K clip in software; a 1080p copy plays instead, and a video that never starts no longer holds the launch |
30 Performance, under the Performance Fixes master, is LOD bias (raised, so distant objects stop
popping in), shadow distance (raised), and rope culling, because the game simulates every rope in
the level at full cost whether or not you are anywhere near one. Straight answer on frame rate,
since you'll check: Overtime runs the game at the same fps as vanilla, measured idle and in a hunt.
The raised draw distance costs about 2%; set LOD Bias to 2 and Shadow Distance to 40 to get that
back. It does not make the game faster and I'm not going to pretend it does.
Things that could stall a night
A night is a list of tokens the host walks: a customer, a car, an event, a hunt, then END DAY. Each
one is closed by something happening in the store, and if that something cannot happen, the list
stops where it is. The ones Overtime fixes are above. The ones it will not touch are a customer who
cannot find her way out, a hunt with an enemy nobody can reach, a night whose customer list came up
short, and a save loaded in the middle of a shift, because unsticking any of those means Overtime
deciding what the game meant to happen. What it does instead is say so: on the host, a night that has
not moved for five minutes while everybody is up and nothing scripted is playing writes one line
naming the token it stopped on and the whole running order, and /night prints the same thing on
demand. docs/PROGRESSION-2026-09-21.md has the full list, with the body lines each one was read
off, and what would have to be true to fix it.
Two items off the defect list are not fixed and will not be. The cow's scene searching turned out not
to be a defect, the game already stops after one pass per approach. The menu selection search on a
gamepad is real, but the only faithful patch replaces two whole Update bodies that do other work,
and the payoff is menu frame time and nothing in game.
Small things
- Spectate cycling. Being dead used to mean watching one person for the rest of the shift. Now
NextandPrevious, as you have them bound, move between everyone still alive. - Ping. Mark something and the others see the game's own arrow and hear its own alert. Colours
are per player and are fixed when the marker is placed, so changing your shirt never repaints a
marker somebody is already looking at.
Mouse2by default. - Text chat. Typed lines go into the dialogue history the game already draws, checked, rate
limited and named by the host rather than by the sender.
Yopens the box, because the game already usesTfor the history. It stands down entirely if Chatter is installed, so nobody ends up with two chats. - Skipping the tutorials. Night 1's clean up list and ID check, and the car tutorial on night 4,
finish themselves when they would start, through the same calls the game makes when you do them,
so the register opens and the car can be sent off for everybody.
Returning Players, the default, only does it when everyone in the session has been past that night before. The game keeps no tutorial flag, so that means a story save past it on your own machine, the story finished, or, for night 1, having scanned an ID and used the computer before.Alwaysdoes it regardless. The host picks it on the create lobby screen, in the row under max players it shares with Story Variety, or in70 Polish / Skip Tutorials, and a change mid shift applies from the next tutorial that starts.
Ping and chat need Overtime on both ends. Spectate cycling does not. Skip Tutorials only needs it on
the host, but a guest without it can't say what they have played, so Returning Players keeps the
tutorials on whenever one is in the session.
Your voice
The game builds its recorder at 48 kHz and leaves the rest at Photon's stock VOIP settings, and its
default input mode, Voice Activation, lets the detector decide when you are talking, which clips the
start of words. 55 Voice / Studio Mic sends your voice at 510 kbps in 20 ms frames with the
detector out of the way, and builds the Opus encoder in audio mode at its highest effort, full band.
Everyone hears the difference and nobody else needs Overtime for it. Push To Talk and mute still
work, Voice Activation sends like Open Mic while Mic Always Send is on, and turning Studio Mic
off mid shift puts the recorder back the way the game set it up. The four WebRTC switches are off,
which is the purest chain; any one of them puts Photon's processor in front of the encoder.
Console
BackQuote (the key left of 1) opens a command box in the same hint line the chat uses. Type a
command and press Enter; Escape cancels. A chat line that starts with a slash, /unstuck in the Y
box, does the same thing and never goes out as chat. Replies land in your own dialogue history and
nobody else sees them. Outside the store there is no hint line or history to borrow, so the box
still works but you type blind and the reply is only in the log.
| Command | Who | What it does |
|---|---|---|
unstuck |
anyone | lets go of whatever is holding you: the shelf you walked into, the computer, the car computer, an ID card, a poster, the conversation you are in, the customisation menu, a web, the pause menu. Then your camera, movement, cursor and controls come back |
unstuck move |
anyone | the same, then puts you on the nearest store floor |
latejoin off|invites|open |
host | sets 00 Overtime / Late Join Mode |
scares off|vanilla|more|muchmore |
host | sets 00 Overtime / Scares |
cap 3 to cap 7 |
host | sets 10 Late Join / Max Players, which applies from the next lobby you host |
night |
host | where tonight's running order is: the token it is on, the whole order, and the customer and car counts |
diag |
anyone | the last twenty lines of the diagnostics file and what each module has said |
help |
anyone | the list |
F8 runs unstuck without typing anything, for when nothing else responds. If nothing was holding
you, press it again within ten seconds and it puts you on the nearest store floor, the same as
unstuck move. The move is the game's own teleport to a point the customers walk on, and it is
refused during a hunt and while you are down. unstuck gives you your camera back in the middle of a
cutscene too, so leave cutscenes alone.
Every unstuck stop is the game's own, aimed only at the thing you are in, so nobody else is pulled
out of what they are doing. The settings commands write the same entry the settings menu does, so the
file is saved and a host setting reaches everybody the usual way. On a guest they say so and change
nothing. Both keys are in 70 Polish; empty Unstuck Key turns F8 off. The game's own
IngameDebugConsole is in the build without its window, so there is nothing of it to open.
What the host decides
A setting whose description says [Host] is the host's to set, and the host's copy is what the
session runs on. It goes out to everybody when they connect, and again whenever one changes.
The settings menu clones the game's own controls and there is no read-only one among them, so those entries stay editable in a guest's menu. Changing one changes that guest's own file and nothing else, and the host's value is still what the game uses. Nothing the host sends is ever written into a guest's config file, and a guest's own values come back the moment the session ends.
What a guest is allowed to send is a host decision too. Every command a client sends the host in this
game is open and nothing checks who sent it, so a guest running the right mod can set your money, end
your night, reload your save, buy at a price they invented, trigger the finale or pull the whole
lobby to the end scene, and your game treats all of it as real. 21 Network Integrity / Validate Rpc Senders turns those away on the host and it is on. Ordinary play is untouched: the list is short and
specific, everything else a client sends goes straight through, and a refusal is one line in the log
per command per session. Nobody is kicked and the guest is not told.
The host can always tell a command that arrived over the wire from one it issued itself, so nothing a guest sends can pretend to be the host. It cannot tell one guest from another, because the sender is not readable from a mod in this build. A guest aiming something at you is stopped; a guest aiming something at another guest is not. Purchases are the exception to the refusal, where the price is replaced with the host's own rather than the purchase being dropped, because buying the thing was legitimate and only the number was not.
The settings menu
ModSettingsMenu puts every section in the pause menu. Overtime runs without it and the settings are
in the config file either way. Everything applies the moment you change it, nothing needs a restart,
and the sections carry a number because that menu sorts flat, so 00 Overtime is at the top of the
list with the seven knobs most people never look past.
Overtime is quiet by default. Put 90 Advanced / Log Level up to Info to see what it is doing.
Reading a session back
90 Advanced / Diagnostics File is on, and while it is, every line any module would say at any
level goes to Overtime-diagnostics.log in the BepInEx folder, whatever Log Level is set to.
The file is written fresh each launch. It opens with the version, the game version and the state of
every module, then carries a marker for each night and for the end of each session, and after each
session and again at unload it counts what every module said and names the ones that said nothing.
A module on that last line either had nothing to do or did not work, and the lines above it say
which. Modules that act without a word otherwise, the keybind cache, the missing text fallback, the
interact replay and spectate cycling, each say so here.
Dependencies
BepInEx-BepInExPack_IL2CPP-6.0.755Ice_Box_Studio_SAM-ModSettingsMenu-1.1.0Ice_Box_Studio_SAM-ShiftAtMidnightLocalizationAPI-1.0.0, which the settings menu pulls in anyway
Neither Chatter nor Beacon is a dependency. Overtime's chat stands down when Chatter is loaded, so with both installed you get Chatter's and only Chatter's. Beacon is not used at all: it does the same job as the ping, and the ping went to the game's own arrow and alert sound instead so the colour could travel with each marker rather than as one value per player.
What it can't do
- Ping, chat and everything a late joiner is sent need Overtime on both ends. The rest of the mod works for a guest who has never heard of it, because it rides broadcasts the host already sends.
DirectProg-CheatsForeverreopens the developer cheat menu on a client, and every button in it sends a commandValidate Rpc Sendersrefuses. Running it on purpose means turning that setting off in21 Network Integrity. Overtime will not quietly make it half work.- Four other mods raise the player cap:
TNTcraftHIM-ShiftMorePlayers,Fuzz-ShiftAtMidnightMorePlayers,Decahedron_Studios-MoreShiftAtMidnightPlayersandanthropic-ShiftLobbyPlus. Not one of them checks host authority before rewriting the lobby size and not one of them stops at seven, so any of them can take a player's name and voice away with nothing in the log. Overtime does its own raise. Run one or the other, not both. - Seven detail switches are declared and not built, so no knob is shown for them:
Revenue Countup Proportional,Extra Dialogue,Revive Norbert,Extra Phone Lines,Dead Player Voice,Shelf FeedbackandName Plate Fallback. The two content ones gate writing thatNew Contentmerges anyway, so nothing is missing on that side. - A skipped ID check moves the players done count and the final box, not each player's own three ticks, because the game never sends those to anybody. The clean up list only ends for everybody at once, so if the host has already walked into it, it runs as normal for everyone.
- Steam only. The Xbox platform layer is untested and not claimed.
- Host migration. The game deliberately ends the session when the original host leaves, and undoing that is a different mod.
- None of it has been through a real shift yet. The logic under
Logic/is unit tested and the patches are not playtested as of this build.
Every setting
Generated from Logic/ConfigSchema.cs, which is the only place these are declared.
| Section | Setting | Default | Range | Host |
|---|---|---|---|---|
| 00 Overtime | Late Join Mode | Invites | Off / Invites / Open | yes |
| 00 Overtime | Scares | More | Off / Vanilla / More / Much More | |
| 00 Overtime | Humour | More | Off / Vanilla / More | |
| 00 Overtime | Story Variety | Light | Off / Light / Full | yes |
| 00 Overtime | Veteran Moments | Rare | Off / Rare / Often | yes |
| 00 Overtime | New Content | on | yes | |
| 00 Overtime | Performance Fixes | on | ||
| 00 Overtime | Bug Fixes | on | ||
| 10 Late Join | Allow Mid Hunt | on | yes | |
| 10 Late Join | Allow During Cutscene | off | yes | |
| 10 Late Join | Allow After Day Complete | off | yes | |
| 10 Late Join | Update Night In Browser | on | yes | |
| 10 Late Join | Announce Joins To Host Log | on | yes | |
| 10 Late Join | Resync Revenue | on | yes | |
| 10 Late Join | Resync Scene Toggles | on | yes | |
| 10 Late Join | Resync Hunt State | on | yes | |
| 10 Late Join | Max Players | 3 | 3 to 7 | yes |
| 20 Bug Fixes | Keybind Lookup Cache | on | ||
| 20 Bug Fixes | Countdown Text Rate | on | ||
| 20 Bug Fixes | Counting Script Clamp | on | ||
| 20 Bug Fixes | Splash Timing | on | ||
| 20 Bug Fixes | Splash Video | on | ||
| 20 Bug Fixes | Run In Background | on | ||
| 20 Bug Fixes | Saved Volume At Start | on | ||
| 20 Bug Fixes | Quit Watchdog | on | ||
| 20 Bug Fixes | Shelf Release | on | ||
| 20 Bug Fixes | Restock Race | on | ||
| 20 Bug Fixes | Interact Retry Queue | on | ||
| 20 Bug Fixes | Missing Text Fallback | on | ||
| 20 Bug Fixes | Report Player Count | on | yes | |
| 20 Bug Fixes | Player List On Join | on | yes | |
| 20 Bug Fixes | Tutorial Gate | on | yes | |
| 20 Bug Fixes | Car Computer Release | on | ||
| 20 Bug Fixes | Question Pause | on | ||
| 20 Bug Fixes | Night Stall Watch | on | yes | |
| 20 Bug Fixes | 21 Network Integrity | Validate Rpc Senders | on | |
| 21 Network Integrity | Block Cheat Menu Rpcs | on | yes | |
| 21 Network Integrity | Rate Limit Resync Requests | on | yes | |
| 21 Network Integrity | Log Rejected Rpcs | on | yes | |
| 30 Performance | Obi Rope Culling | on | ||
| 30 Performance | Obi Rope Cull Distance | 40 | 10 to 200 | |
| 30 Performance | LOD Bias | 5 | 0.5 to 10 | |
| 30 Performance | Shadow Distance | 80 | 10 to 150 | |
| 40 Scares | Night Scare Budget | 2 | 0 to 10 | yes |
| 40 Scares | Minimum Gap Seconds | 120 | 30 to 600 | yes |
| 40 Scares | Reuse Vanilla Toggles | on | yes | |
| 40 Scares | Scale Difficulty With Players | on | yes | |
| 45 Story Variety | Replay Same Night | on | yes | |
| 45 Story Variety | Alternate Tells | on | yes | |
| 45 Story Variety | Shuffle Queue | on | yes | |
| 45 Story Variety | Doppel Or Human | on | yes | |
| 47 Veteran Moments | Return Visits | on | yes | |
| 47 Veteran Moments | Copies Of The Uncopied | off | yes | |
| 47 Veteran Moments | Second Tells | on | yes | |
| 47 Veteran Moments | Family Of The Dead | on | yes | |
| 47 Veteran Moments | Karen Whitfield Returns | on | yes | |
| 47 Veteran Moments | Review Echoes | on | yes | |
| 50 Humour | Cow Behaviour | off | yes | |
| 50 Humour | Wandering Customers | off | yes | |
| 50 Humour | Odd Moments | on | yes | |
| 50 Humour | Spin Wheel Surprises | off | yes | |
| 55 Voice | Studio Mic | on | ||
| 55 Voice | Mic Bitrate | 510000 | 6000 to 510000 | |
| 55 Voice | Mic Sample Rate | 48000 | 48000 / 24000 / 16000 | |
| 55 Voice | Mic Frame Ms | 20 | 20 / 10 / 40 / 60 | |
| 55 Voice | Mic Always Send | on | ||
| 55 Voice | Mic Noise Suppression | off | ||
| 55 Voice | Mic High Pass | off | ||
| 55 Voice | Mic Auto Gain | off | ||
| 55 Voice | Mic Echo Cancel | off | ||
| 60 Content | Extra Customers | on | yes | |
| 60 Content | Extra Customers Per Night | 2 | 0 to 8 | yes |
| 60 Content | Extra Reviews | on | yes | |
| 60 Content | Extra EOD Lines | on | yes | |
| 60 Content | Extra ID Records | on | yes | |
| 60 Content | Random Event Roller | on | yes | |
| 60 Content | Harold Brant 55 56 | on | yes | |
| 60 Content | Reserved Eod Ids | on | yes | |
| 65 Cut Content | Cut Customers | on | yes | |
| 65 Cut Content | Cut Hints | on | ||
| 65 Cut Content | Extra Phone Lines | on | yes | |
| 65 Cut Content | New Drivers | on | yes | |
| 65 Cut Content | New Thieves | on | yes | |
| 65 Cut Content | Norbert Remembers | on | yes | |
| 70 Polish | Spectate Cycling | on | ||
| 70 Polish | Ping Marker | on | ||
| 70 Polish | Ping Key | Mouse2 | ||
| 70 Polish | Text Chat | on | ||
| 70 Polish | Chat Key | Y | ||
| 70 Polish | Skip Tutorials | Returning Players | Off / Returning Players / Always | yes |
| 70 Polish | Console | on | ||
| 70 Polish | Console Key | BackQuote | ||
| 70 Polish | Unstuck Key | F8 | ||
| 90 Advanced | Config Version | 1.0.0 | ||
| 90 Advanced | Log Level | Warning | Off / Error / Warning / Info / Verbose | |
| 90 Advanced | Self Check On Load | off | ||
| 90 Advanced | Diagnostics File | on | ||
| 90 Advanced | Disable All Patches | off |
Building
dotnet build -c Release -p:GalePluginsDir=<somewhere>
dotnet test Overtime.Tests
dotnet test Overtime.Content.Tests
Leave GalePluginsDir off and it deploys into the Gale profile. scripts/package.sh builds the
Thunderstore zip. The build copies Content/pack next to the DLL, which is where the mod looks for
it and what the zip carries.
Overtime.Content.Tests checks the writing itself: the id space, the field sets, the length
envelope, typography and all nine languages. Some of it compares against the game's own decrypted
tables, which are never in this repository. Regenerate them from your own copy of the game with
tools/content/decode.py, or point OVERTIME_SHIPPED_TABLES at them.
Every new line is listed in docs/CONTENT-REVIEW.md next to the shipped line its voice came from.
The house rules it was written against are in docs/CONTENT-STYLE.md.