@q @program places.muf 1 99999 d i ( Places.muf by Deedlit@DragonMUCK / Mara@RanmaMUCK Inspired by places code as seen on various MUSHes. This is a program for creating 'places' to sit/stand/etc within a room, without actually making a seperate room. You can still hear/contribute to anything going on in the rest of the room, but you may also carry on less obvious, 'private' dialogue/etc with persons at your 'place'. Feel free to copy/modify/distribute/digest/whatever as yuo like, just leave my name in the credits for the work I did. ^_^ ) $define puppet? dup thing? swap "Z" flag? and if 1 else 0 then $enddef $include $lib/reflist $include $lib/strings var var1 lvar pscan : pscan1 ( s -- s ) pscan ! "_places/people/" begin loc @ swap nextprop dup not if pop break then loc @ over getpropstr pscan @ stringcmp not if dup 15 strcut swap pop 1 strcut swap pop atoi dbref me @ "^/placetemp" rot REF-add then repeat me @ "^/placetemp" getpropstr if me @ "^/placetemp" REF-list me @ "^/placetemp" remove_prop " Present is: " swap strcat "." strcat .tell then ; : do-places ( -- ) " " .tell "_places/places/" begin loc @ swap nextprop dup not if pop break then dup 15 strcut swap pop var1 ! loc @ over "/name" strcat getpropstr "(#" var1 @ strcat ") has " strcat strcat over "/curplaces" strcat loc @ swap getpropstr strcat " empty places." strcat .tell var1 @ pscan1 repeat loc @ contents begin dup ok? while dup player? over puppet? or not if next continue then "_places/people/" over intostr "#" swap strcat strcat loc @ swap getpropstr not if me @ "^/placetemp" 3 pick REF-add then next repeat pop me @ "^/placetemp" getpropstr if me @ "^/placetemp" REF-list me @ "^/placetemp" remove_prop "Milling around: " swap strcat "." strcat .tell then ; : do-place ( s -- ) loc @ "_places/places/" 3 pick strcat "/name" strcat getpropstr not if pop "There is no place for that number." .tell exit then var1 ! loc @ "_places/places/" var1 @ strcat "/name" strcat getpropstr " (#" var1 @ strcat ") has " strcat strcat loc @ "_places/places/" var1 @ strcat "/curplaces" strcat getpropstr strcat " empty places." strcat .tell var1 @ pscan1 ; : do-depart ( -- ) loc @ "_places/people/" me @ intostr "#" swap strcat strcat getpropstr dup not if command @ "Queued event." stringcmp not if exit then pop "You aren't at a place right now." .tell exit then dup "_places/places/" swap strcat "/name" strcat loc @ swap getpropstr loc @ "_places/places/" 4 pick strcat "/curplaces" strcat getpropstr atoi 1 + intostr loc @ "_places/places/" 5 pick strcat "/curplaces" strcat rot setprop dup "You leave " swap strcat "." strcat .tell me @ name " leaves " strcat swap strcat "." strcat .otell loc @ "_places/people/" me @ intostr "#" swap strcat strcat remove_prop ; : do-join ( s -- ) var1 ! loc @ "_places/places/" var1 @ strcat "/name" strcat getpropstr not if "There is no place for that number." .tell exit then loc @ "_places/places/" var1 @ strcat "/curplaces" strcat getpropstr atoi 1 >= not if "There are no places left there." .tell exit then loc @ "_places/people/" me @ intostr "#" swap strcat strcat getpropstr if do-depart then loc @ "_places/people/" me @ intostr "#" swap strcat strcat var1 @ setprop loc @ "_places/places/" var1 @ strcat "/curplaces" strcat getpropstr atoi 1 - intostr loc @ "_places/places/" var1 @ strcat "/curplaces" strcat rot setprop loc @ "_places/places/" var1 @ strcat "/name" strcat getpropstr " (#" strcat var1 @ strcat ")." strcat "You join " over strcat .tell me @ name " joins " strcat over strcat "." strcat .otell "_places/people/" begin loc @ swap nextprop dup not if pop break then loc @ over getpropstr var1 @ stringcmp not if dup 15 strcut swap pop 1 strcut swap pop atoi dbref me @ name " joins you." strcat notify then repeat ; : do-saypose ( s -- ) dup ":" instr 1 = if 1 strcut swap pop dup 1 strcut pop "[.,?!-' ]" smatch not if " " then swap strcat me @ name swap strcat var1 ! else dup strlen over "!" rinstr = if " exclaims, " else dup strlen over "?" rinstr = if " asks, " else " says, " then then swap "\"" swap strcat strcat "\"" strcat me @ name swap strcat var1 ! then loc @ "_places/people/" me @ intostr "#" swap strcat strcat getpropstr dup not if pop "You need to be at a place first." .tell exit then pscan ! "_places/people/" begin loc @ swap nextprop dup not if pop break then loc @ over getpropstr pscan @ stringcmp not if dup 15 strcut swap pop 1 strcut swap pop atoi dbref "At your location, " var1 @ strcat notify then repeat ; : rem-place ( -- ) "Remove which place #?" .tell read var1 ! loc @ "_places/places/" var1 @ strcat propdir? not if "There is no place for that number." .tell exit then "_places/places/" var1 @ strcat dup "/name" strcat loc @ swap remove_prop dup "/maxplaces" strcat loc @ swap remove_prop "/curplaces" strcat loc @ swap remove_prop "Place cleared." .tell ; : list-places ( -- ) "---------------------------------------------------" .tell "_places/places/" begin loc @ swap nextprop dup not if pop break then dup dup 15 strcut swap pop ") " strcat over loc @ swap "/name" strcat getpropstr strcat "." strcat over loc @ swap "/maxplaces" strcat getpropstr " Allowed people: " swap strcat strcat .tell repeat "---------------------------------------------------" .tell "*Done*" .tell "Type anything to continue." .tell read pop ; : edit-place ( -- ) "Which place # do you wish to edit?" .tell read var1 ! loc @ "_places/places/" var1 @ strcat propdir? not if "There is no place for that number." .tell exit then "Current name of place is '" loc @ "_places/places/" var1 @ strcat "/name" strcat getpropstr strcat "'" strcat .tell "New name?" .tell read loc @ "_places/places/" var1 @ strcat "/name" strcat rot setprop "Current maximum number of people allowed: " loc @ "_places/places/" var1 @ strcat "/maxplaces" strcat getpropstr strcat .tell "New maximum?" .tell read dup loc @ "_places/places/" var1 @ strcat "/maxplaces" strcat getpropstr atoi swap atoi over over >= if dup loc @ "_places/places/" var1 @ strcat "/maxplaces" strcat rot intostr setprop - loc @ "_places/places/" var1 @ strcat "/curplaces" strcat getpropstr atoi swap - intostr loc @ "_places/places/" var1 @ strcat "/curplaces" strcat rot setprop else dup loc @ "_places/places/" var1 @ strcat "/maxplaces" strcat rot intostr setprop swap - loc @ "_places/places/" var1 @ strcat "/curplaces" strcat getpropstr atoi swap + intostr loc @ "_places/places/" var1 @ strcat "/curplaces" strcat rot setprop then "*Done.*" .tell ; : do-help2 ( -- ) "Filler stuff again, sorry. -_-" .tell ; : do-help ( -- ) "Places.muf by Mara@RanmaMUCK / Deedlit@DragonMUCK" .tell "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" .tell "Commands:" .tell " place <number> - Look at who's at place <number>" .tell " places - Look at who's where in this area." .tell " join <number> - Join place <number>" .tell " depart - Leave your current place." .tell " tt - Say/pose to others at your current place." .tell " " .tell "Options:" .tell " #help - This screen." .tell " #config - Configuration editor - room owner ONLY." .tell "*Done*" .tell ; : add-place ( -- ) 1 var1 ! begin loc @ "_places/places/" var1 @ intostr strcat "/" strcat propdir? not if break then var1 @ 1 + var1 ! repeat "Enter the name of the new 'place' to be added:" .tell read loc @ "_places/places/" var1 @ intostr strcat "/name" strcat rot setprop "Enter the maximum number of people allowed at this location:" .tell read dup loc @ "_places/places/" var1 @ intostr strcat "/maxplaces" strcat rot setprop loc @ "_places/places/" var1 @ intostr strcat "/curplaces" strcat rot setprop "*Place added.*" .tell ; : show-configscreen ( -- ) "Places.muf by Mara@RanmaMUCK / Deedlit@DragonMUCK" .tell "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" .tell "Main Configuration Screen" .tell " " .tell "1) Add New Place" .tell "2) Edit Current Place" .tell "3) Remove Place" .tell "4) List Current Places" .tell " " .tell "[ Type 1-4, H for help, or Q to quit. ]" .tell ; : do-config ( -- ) "" begin dup "1" strcmp not if pop add-place "" then dup "2" strcmp not if pop edit-place "" then dup "3" strcmp not if pop rem-place "" then dup "4" strcmp not if pop list-places "" then dup "h" stringcmp not if pop do-help2 "" then "q" stringcmp not if break then show-configscreen read repeat "*Done*" .tell ; : main dup "#help" stringcmp not if pop do-help exit then dup "#config" stringcmp not if me @ loc @ controls not if pop "Permission Denied." .tell exit else pop do-config exit then then command @ dup "Queued event." stringcmp not if pop do-depart exit then dup "tt" stringcmp not if pop do-saypose exit then dup "depart" stringcmp not if pop pop do-depart exit then dup "join" stringcmp not if pop do-join exit then dup "place" stringcmp not if pop do-place exit then pop pop do-places ; . c q