A sci-fi story
Kelly checks her work items. Uh oh, a client freeze. The KickStarter milestone’s been slipping and the money is starting to run out. Right now, showstoppers are exactly what they don’t need.
Thank god Jack’s the one on the forums trying to pass a vote on paring back the milestone requirements. If he can’t get the ‘No’ vote lower than 43%, refunding that percentage of the users will send them insolvent. It takes preternatural calm to operate at the intersection of community management and project management.
She takes a deep breath and pulls from the QA repo. There’s several thousand session recordings in here, but her filters only show the busted ones. Sure enough, there’s a new fork in the replay tree and it’s red. “Watchdog violation: Over 1000 frames since input was last polled”. The offending fork doesn’t look much different from its sibling forks: same sequence of button presses, slightly different timings. If not for the freeze, the QA guy on topiary duty probably would’ve coalesced it into the sibling test cases.
Hmm, the work item has a VM image attached, but with everyone pushing changes like mad throughout the morning, she’d rather repro on the current codebase. She enables the audit log on the client that’s allegedly going to be the victim of this scenario. She taps the tip of that red branch and her PC’s displays take on the appearance of a surveillance system as the various game clients start up one by one and begin replaying the session that lead to the freeze. She rouses the cat from her lap and heads to the kitchen for a coffee.
Five minutes later, Kelly plops back down, coffee in hand. Bingo, it’s still busted. The game phase coroutine is stuck. At least it’s deterministic this time. Looks like the player was in the middle of dismounting their horse when the game froze. The coroutine’s waiting on the end of the dismount animation, but it never comes.
Oddly enough, the player’s current animation isn’t dismount. Where the hell did that value come from? Kelly has her IDE generate a data flow tree for the state variable. Her PC grinds away at rerunning execution from the last checkpoint.
The character animation state machine was a mess of amateurish hacks they’d picked up at auction from a somewhat unluckier project that’d gone belly up. They’d come to regret cutting that particular corner.
Aha! The state is passed around as if the authors were laundering a drug fortune, but the root of the problem is that a grapple interrupted the dismount. This isn’t supposed to happen. Dismount is sacrosanct.
Who implemented grapples? She squints at the fine print in the blame margin of the editor window.
“Radko (12/10/21): Fix exploit where jumps cancel grapples“
Hmm, where in the world is Radko Stamboliyski? Remote contractors had been going AWOL since the finances starting looking bad. They haven’t been able to get in touch with him for a week. He could be anywhere in Bulgaria. Hell, maybe the Bulgaria thing was a lie all along? Either way, she’s not getting an explanation for that commit.
A quick check in the animation timeline reveals the problem. The annotation that suppresses the animation being interrupted stops a frame short of the end. Argh! First frame inclusive, last frame exclusive! When will people learn.
One frame glitch. That explains why it survived until now. Hardly seemed worth the panic. Looks like the fangirls might get their Renaissance action-romance after all.
Inspired by:
- Slightly Mad Studios living up to their name
- The Inform 7 Skein
- Reversible Debugging