Yes, I have noticed that before also. Even worse, if you look into it a little further, in the doit method of the main script, program control is actually checked and controlled by the gProgramControl variable. So in essence as it is written, playercontrol() in a roomscript doesn't do anything because the mains doit method only checks the gProgramControl variable. I can't remember though what the results were when I tried removing the bit about the doit method and just using the procedures to set and reset the variables.
I added a couple of extra variables in there too when I wrote black cauldron. Pausing the timers and whatnot to prevent death from dehydration and starvation or warnings during cut scenes. Likewise to prevent opening inventory during certain times too. But I concur, those procedures need to change the gProgramControl variable, here is the code straight out of BC. You may notice that I also removed the call to ego that stops his motion any time one of these two procedures are called. I wanted to control that in each instance of using the procedure, not just halt him automatically, sometimes I may not want him to stop walking.
(procedure public (ProgramControl)
(User:canControl(FALSE) canInput(FALSE))
(send gEgo:setMotion(NULL))
= gProgramControl TRUE
= canTab FALSE
= pauseTimers TRUE
)
(procedure public (PlayerControl)
(User:canControl(TRUE) canInput(FALSE)) // point and click, no text parsing
(send gEgo:setMotion(NULL))
= gProgramControl FALSE
= canTab TRUE
= pauseTimers FALSE
)