@q
@program vsys-@vbcast
1 99999 d
i
( vsys-@vbcast    v1.0    Jessy @ FurryMUCK    4/00
  
  Part of the vsys vehicle system, this program handles messaging into
  and out of vehicles.
  
  INSTALLATION:
  
  Port the program, set it Wizard and Link_OK. Create a global exit 
  with a name such as '@vbcast', and link it to the program. Type 
  '<action name> #install'.
  
  Vsys-@vbcast requires lib-vsys and lib-reflist. See the header comment 
  of lib-vsys for more complete documentation on the vehicle system.
  
  USE:
  
    @vbcast #broadcast ........... Broadcast says/poses from room to ext
    @vbcast #!broadcast .......... Don't broadcast to exterior
    @vbcast #listen .............. Listen from ext to all !Q interior rooms
    @vbcast #!listen ............. Do not listen in interior rooms
    @vbcast #quiet ............... Don't broadcast or listen in current room
    @vbcast #!quiet .............. Honor #broadcast and #listen settings
  
  Each of these commands requires administrative privileges for the
  current vehicle.
  
  Vsys-@vbcast may be freely ported. Please comment any changes.
)
 
$include $lib/vsys
$include $lib/reflist
 
$define Tell me @ swap notify $enddef
 
lvar ourString
lvar ourVehicle
 
: DoInit  (  --  )               (* ensure program is W and registerd *)
  
  LibInit
  prog "W" flag? if
    #0 "_reg/vsys/vbcast-prog" prog setprop
    #0 "_reg/vsys/vbcast-com"  trig setprop
  else
    prog name " must be set Wizard." strcat me @ swap notify
    pid kill
  then
;
  
: DoInstall  (  --  )                   (* really doesn't do anything *)
  
  DoInit
  ">>  $prog installed." prog name "$prog" subst Tell
;
 
: DoHelp  (  --  )                                (* show help screen *)
  
  " " Tell
  prog name " (#" strcat prog intostr strcat ")" strcat Tell " " Tell
  
  "This program manages broadcasts to and from vehicle rooms." 
  Tell " " Tell
  
  "  $com #broadcast ....... Broadcast says/poses from room to ext"
  command @ "$com" subst Tell
  "  $com #!broadcast ...... Don't broadcast to exterior"
  command @ "$com" subst Tell
  "  $com #listen .......... Listen from ext to all !Q interior rooms"
  command @ "$com" subst Tell
  "  $com #!listen ......... Do not listen in interior rooms"
  command @ "$com" subst Tell
  "  $com #quiet ........... Don't broadcast or listen in current room"
  command @ "$com" subst Tell
  "  $com #!quiet .......... Honor #broadcast and #listen settings"
  command @ "$com" subst Tell " " Tell
  
  "Each of these commands requires Administrator privileges for the "
  "current vehicle." strcat Tell " " Tell
  
  "For complete information on the vehicle system, type '@view $lib/vsys' "
  "(long)." strcat Tell
;
 
: DoOutToIn  (  --  )                        (* handle #listen output *)
  
  trig "D" flag? if exit then         (* darked vehicles can't listen *)
   
  trig "@v/env" getprop dup if                       (* find env room *)
    dup string? if "" "#" subst atoi dbref then      (* set up prefix *)
    trig name ">" strcat ourString @ strcat ourString !
    contents
    begin                          (* begin vehicle-room-getting loop *)
      dup while
      dup room? if
        dup "@v/quiet" getpropstr not if     (* ignore @v/quiet rooms *)
          dup contents
          begin          (* begin vehicle-room-occupants-getting loop *)
            dup while
            dup ourString @ notify                 (* notify occupant *)
            next
          repeat                        (* end occupants-getting loop *)
          pop
        then
      then
      next
    repeat                                   (* end room-getting loop *)
    pop
  else
    pop
  then
;
 
: DoInToOut  (  --  )                     (* handle #broadcast output *)
  
                                             (* ignore @v/quiet rooms *)
  me @ location "@v/quiet" getpropstr if exit then
  
  me @ GetVehicle dup if
    dup "D" flag? if pop exit then (* darked vehicles can't broadcast *)
    ourVehicle !
    ourVehicle @ name "> " strcat ourString @ strcat ourString !
    ourVehicle @ location contents
    begin         (* loop: notify all occupants of vehicle's location *)
      dup while
      dup ourString @ notify
      next
    repeat
    pop
  else
    pop
  then
;
 
: DoVbcast  (  --  )            (* handle output picked up by _listen *)
  
  me @ GetVehicleEnv if
    DoInToOut
  else
    DoOutToIn
  then
;
 
: DoSetBcast  (  --  )  
                    (* set: poses/says will be broadcast from vehicle *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to set broadcasts." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
    me @ location "_listen/vsys" prog setprop         (* set _listen/ *)
    ">>  Set." Tell
    ">>  Poses and says will be broadcast from this room to the location of"
    Tell
    ">>  the $vehicle." ourVehicle @ name "$vehicle" subst Tell
  else
    ">>  Permission denied." Tell
  then
;
 
: DoSetNotBcast  (  --  )
                (* set: poses/says will not be broadcast from vehicle *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to reset broadcasts." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
    me @ location "_listen/vsys" remove_prop        (* reset _listen/ *)
    ">>  Set." Tell
    ">>  Poses and says will *not* be broadcast "
    "from this room to the location" strcat Tell
    ">>  of the $vehicle." ourVehicle @ name "$vehicle" subst Tell
  else
    ">>  Permission denied." Tell
  then
;
  
: DoSetListen  (  --  )
                    (* set: poses/says will be broadcast into vehicle *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to set listening." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
    ourVehicle @ "_listen/vsys" prog setprop          (* set _listen/ *)
    ">>  Set." Tell
    ">>  Poses and says will be broadcast from the location of the "
    Tell
    ">>  $vehicle to its listening interior rooms." 
    ourVehicle @ name "$vehicle" subst Tell
  else
    ">>  Permission denied." Tell
  then
;
 
: DoSetNotListen  (  --  )
                (* set: poses/says will not be broadcast into vehicle *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to reset listening." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
    ourVehicle @ "_listen/vsys" prog setprop        (* reset _listen/ *)
    ">>  Set." Tell
    ">>  Poses and says will *not* be broadcast from the location of the "
    Tell
    ">>  $vehicle to its listening interior rooms." 
    ourVehicle @ name "$vehicle" subst Tell
  else
    ">>  Permission denied." Tell
  then
;  
 
: DoSetQuiet  (  --  )
                  (* set: current room will not #listen or #broadcast *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to set room." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
          me @ location "@v/quiet" "yes" setprop      (* set @v/quiet *)
    ">>  Set." Tell
    ">>  This room will not receive or transmit vehicle broadcasts." Tell
  else
    ">>  Permission denied." Tell
  then
;
 
: DoSetNotQuiet  (  --  )
        (* set: current room will honor #listen & #broadcast settings *)
  
  me @ GetVehicle dup if                              (* find vehicle *)
    ourVehicle !
  else
    ">>  You are not in a vehicle." Tell
    ">>  Unable to reset room." Tell exit
  then
  
  VehicleAdmin? if                                (* check permission *)
          me @ location "@v/quiet" remove_prop      (* unset @v/quite *)
    ">>  Set." Tell
    ">>  This room will receive and transmit vehicle broadcasts according"
    Tell
    ">>  to #listen and #broadcast settings for the $vehicle."
    ourVehicle @ name "$vehicle" subst Tell
  else
    ">>  Permission denied." Tell
  then
;  
 
: main
  
  "me" match me !
  DoInit
  
  dup if
    ourString !
  then
  
  trig exit? not if DoVbcast exit then
  
  ourString @ if
    "#broadcast"  ourString @ stringpfx if DoSetBcast     exit then
    "#!broadcast" ourString @ stringpfx if DoSetNotBcast  exit then
    "#help"       ourString @ stringpfx if DoHelp         exit then
    "#install"    ourString @ stringpfx if DoInstall      exit then
    "#listen"     ourString @ stringpfx if DoSetListen    exit then
    "#!listen"    ourString @ stringpfx if DoSetNotListen exit then
    "#quiet"      ourString @ stringpfx if DoSetQuiet     exit then
    "#!quiet"     ourString @ stringpfx if DoSetNotQuiet  exit then
  else
    DoVbcast
  then
;
.
c
q