Yeah, I know about the ACS wait and delay things, it's just I was calling thing_activate directly from a linedef rather than an ACS script. If neccessary I guess I could make some ACS glue logic, do something with ScriptCall to keep an eye on an actor's status and run a 1-tic delay in a while loop until the actor's done. That would work, although I guess it'd be nice to cut out the middleman as it were. But I guess that would work as a backup plan...
This all is mostly because I am conducting very sinful experiments with ZScript based level logic and scripting, partially selfishly motivated by me getting annoyed at repeatedly forgetting to compile my ACS + UDB's script editor having an absolute fit on linux. That, and just seeing if I can, because I've been having fun, let's call it "sticking wrenches into gearboxes"
...Honestly, an alternative would be an ANIMDEF for a switch that's just a quick click-click in and out. So even if you press it a bunch of times it just feels like you're mashing the button repeatedly instead of feeling like it's broken.
After a bit of playing around I decided to just use the ACS method for now, with LOADACS so all maps can see it. Just a quick little script to talk to the actor via ScriptCall and wait until it reports it's finished. The switch stays stuck until the script is done, which is all I wanted in the first place.
script 1024 (int tid)
while (ScriptCall( [...] );