Initially, I was worried that this was due to the SetUpDirectionObjects routine not properly setting the object global to the out_obj object (since I still don't entirely trust how Perform uses that routine), but the problem turned out to be in DoExit itsellf (in fact, the out_obj doesn't really matter when DoExit is called since almost all applicable error messages will mention the parent of the player, if anything).
The problem turned out to be that the "so-and-so is closed" VMessage text was expecting the object global to exist, and DoExit wasn't properly defining it in that instance. So, here's a version of DoExit where that is fixed:
replace DoExit{local p#ifclear NO_OBJLIB! >GO OUT winds up calling DoExit with object = out_obj, thanks to! the direction-parsing code in Perform(). English ambiguities being! what they are, we correct that interpretation of "out" here, and! treat the command as a generic instruction to exit whatever! container context we may be in.if object = out_objobject = nothingif object = nothing or object = location{if player in location and out_obj in direction{word[1] = out_obj.nounword[2] = ""return Perform(&DoGo)}}elseif object = d_obj and player in location{return Perform(&DoGo, object)}#endifp = parent(player)#ifclear NO_OBJLIBif object and player not in object#elseif object and player not in object#endifVMessage(&DoExit, 1) ! "You aren't in that."elseif p is openable, not open{object = pVMessage(&DoLookIn, 1) ! "X is closed."}else{if object = nothingobject = pmove player to locationif not object.afterVMessage(&DoExit, 2) ! "You get out.."}return true}
Of course, this will be added to future versions of Roodylib.