@q @prog cmd-who 1 99999 d 1 i $def MIN_IDLE 3 (minutes) : do_and dup ", " rinstr dup if 1 + strcut "and " swap strcat strcat else pop then ; : idletime (d -- i) descriptors begin dup 1 > while rot pop 1 - repeat not if -1 exit then descrcon conidle ; : who-loop (pupstr idlestr asleepstr awakestr dbref -- pupstr idlestr asleepstr awakestr) dup #-1 dbcmp if pop do_and 4 rotate do_and 4 rotate do_and 4 rotate do_and 4 rotate exit then dup player? if dup awake? if dup idletime dup MIN_IDLE 60 * < if pop over if swap ", " strcat swap then dup name rot swap strcat swap else 60 / intostr "[" swap strcat "m]" strcat 5 pick if 5 rotate ", " strcat -5 rotate then over name swap strcat 5 rotate swap strcat -4 rotate then else dup "DARK" flag? not if 3 pick if rot ", " strcat rot rot then dup name 4 rotate swap strcat rot rot then then else dup "_listen" propdir? over "_listen" getpropstr or over "_puppet?" getpropstr tolower "y" 1 strncmp not or if 5 pick if 5 rotate ", " strcat -5 rotate then dup name 6 rotate swap strcat -5 rotate then then next who-loop ; : cmd-who "me" match me ! "" "" "" "" me @ location contents who-loop dup me @ name strcmp not if pop "You are the only one awake here." else "The players awake here are " swap strcat "." strcat then me @ swap notify swap dup if dup ", and " instr not if "Only " swap strcat " is idle here." strcat else "The idlers here are " swap strcat "." strcat then me @ swap notify else pop then me @ location "DARK" flag? not if dup not if pop "There are no sleepers here." else dup ", and " instr not if "Only " swap strcat " is asleep here." strcat else "The sleepers here are " swap strcat "." strcat then then me @ swap notify else pop then dup if dup ", and " instr not if "The only puppet here is " swap strcat else "The puppets here are " swap strcat "." strcat then me @ swap notify else pop then ; . c q @register #me cmd-who=tmp/prog1 @set $tmp/prog1=/_/de:A scroll containing a spell called cmd-who