@q
@program vsys-@vrecycle
1 99999 d
i
( vsys-@vrecycle v1.0 Jessy @ FurryMUCK 4/00
Part of the vsys vehicle system, this program handles vehicle
recycling.
INSTALLATION:
Port the program, set it Wizard and Link_OK. Create a global action
with a name such as '@vrecycle;@vrec', and link it to the program.
Type '<action name> #install'.
Vsys-@vrecycle requires lib-vsys. See the header comment of lib-vsys
for more complete documentation of the vehicle system.
Vsys-@vrecycle may be freely ported. Please comment any changes.
)
$include $lib/vsys
$define Tell me @ swap notify $enddef
lvar ourRoom
lvar ourString
lvar ourVehicle
: DoInit ( -- ) (* ensure program is W and registered *)
LibInit
prog "W" flag? if
#0 "_reg/vsys/vrecycle-prog" prog setprop
#0 "_reg/vsys/vrecycle-com" trig setprop
else
prog name " must be set Wizard." strcat me @ swap notify
pid kill
then
;
: DoInstall ( -- ) (* doesn't really do anything *)
DoInit
">> $prog installed." prog name "$prog" subst Tell
;
: DoHelp
" " Tell
prog name " (#" strcat prog intostr strcat ")" strcat Tell " " Tell
"This program recycles vsys vehicles and all rooms associated with "
"them." strcat " " Tell
" $com <vehicle obj> ......... Recycle <vehicle> and its rooms"
command @ "$com" subst Tell " " Tell
"You must be a wizard or the owner of the vehicle to use this command."
Tell " " Tell
"For complete information on the vehicle system, type '@view $lib/vsys' "
"(long)." strcat Tell
;
: DoRecContainedRooms ( d -- ) (* recycle all rooms in d, recursive *)
contents
begin
dup while
dup next swap
dup room? if
dup contents if
dup DoRecContainedRooms
then
recycle
else
pop
then
repeat
pop
;
: DoVrecycle ( -- ) (* recycle vehicle ourString and its rooms *)
ourString @ if (* find vehicle *)
ourString @ match
dup #-1 dbcmp if
">> I don't see that here." Tell exit
then
dup #-2 dbcmp if
">> Ambiguous. I don't know which one you mean!" Tell exit
then
dup #-3 dbcmp if
">> I don't see that here." Tell exit
then
ourVehicle !
me @ ourVehicle @ controls if (* check permission *)
ourVehicle @ GetEnvForVeh dup if (* get vehicle env room *)
ourRoom !
ourRoom @ DoRecContainedRooms (* rec contained rooms *)
ourRoom @ recycle (* rec env room *)
ourVehicle @ "@v/key" getprop ourString !
ourVehicle @ recycle (* rec vehicle object *)
">> Vehicle recycled." Tell
background
ourString @ if
ourString @ string? not if
ourString @ intostr ourString !
then
else
exit
then
#0 (* scan db; find keys; recycle *)
begin
dup dbtop dbcmp not while
dup ok? if
dup "@v/key" getprop dup if
dup string? not if intostr then
ourString @ smatch if
dup "@v/env" getpropstr not if
dup 1 + swap recycle
then
then
else
pop
then
then
1 +
repeat
pop
else
">> $name is not a vsys vehicle."
ourVehicle @ name "$name" subst Tell
then
else
">> Permission denied." Tell
then
else
">> Usage: $com <vehicle obj>"
command @ "$com" subst Tell
then
;
: main
"me" match me !
DoInit
dup if
ourString !
then
ourString @ if
"#help" ourString @ stringpfx if DoHelp exit then
"#install" ourString @ stringpfx if DoInstall exit then
DoVrecycle
else
">> Usage: $com <vehicle object>"
command @ "$com" subst Tell
then
;
.
c
q
@set vsys-@vrecycle=W