@q
@program cmd-@xdig
1 99999 d
i
( cmd-@xdig v1.0 Jessy @ FurryMUCK 3/00
Cmd-@xdig allows users to create a room, an exit leading to the room,
and a backlink from the newly created room in a single step. It is
integrated with lib-quota to provide quota control.
INSTALLATION:
Port cmd-@xdig and set it Wizard. Linke a global action named '@xdig'
to it.
USAGE:
@xdig <room> [=<exit to room> [=<backlink from room>]]
Creates a new room and, optionally, an exit leading from your current
location to the room, and/or an exit leading from the room to your current
location. The room is automatically parented to the same position in the
environment tree as your current location. Creating a room costs 10
pennies. Creating an exit costs 1 penny. Only a builder may use this
command.
Cmd-@xdig may be freely ported. Please comment any changes.
)
lvar ourBack
lvar ourRoom
lvar ourString
lvar ourThere
(2345678901234567890123456789012345678901234567890123456789012345678901)
$include $lib/quota
$define Tell me @ swap notify $enddef
$define NukeStack begin depth while pop repeat $enddef
: DoHelp ( -- ) (* show help screen *)
" " Tell
"@xdig <room> [=<exit to room> [=<backlink from room>]]" Tell " " Tell
"Creates a new room and, optionally, an exit leading from your current "
"location to the room, and/or an exit leading from the room to your "
"current location. The room is automatically parented to the same "
"position in the environment tree as your current location. Creating a "
"room costs 10 pennies. Creating an exit costs 1 penny. Only a builder "
"may use this command. "
strcat strcat strcat strcat strcat Tell
;
: DoRoomQuota ( -- )
me @ "rooms" CheckQuota not if (* check user's quota *)
"You are at or over your limit of rooms." Tell 0 exit
then
me @ "rooms" CheckCost not if (* check user's pennies *)
"Sorry, you don't have enough $pennies."
"pennies" sysparm "$pennies" subst Tell 0 exit
then
NukeStack 1
;
: DoExitQuota ( -- )
me @ "exits" CheckQuota not if (* check user's quota *)
"You are at or over your limit of exits." Tell 0 exit
then
me @ "exits" CheckCost not if (* check user's pennies *)
"Sorry, you don't have enough $pennies."
"pennies" sysparm "$pennies" subst Tell 0 exit
then
NukeStack 1
;
: DoThereExit ( -- ) (* create exit to new room *)
"Trying to create exit to $room..." (* notify *)
ourRoom @ name "$room" subst Tell
me @ dup location controls not if (* check permission *)
"You may not open an exit here." Tell exit
then
(* check name; create link if valid *)
ourThere @ CheckName if
DoExitQuota if
me @ location ourThere @ newexit
"Exit created with number $dbref."
over intostr "$dbref" subst Tell
ourRoom @ setlink
"Linked to $room."
ourRoom @ unparseobj "$room" subst Tell
me @ Exempt? not if me @ -1 addpennies then
then
else
"That's a silly name for an exit!" Tell
then
;
: DoBackExit ( -- ) (* create backlink *)
"Trying to create exit from $room to here..." (* notify *)
ourRoom @ name "$room" subst Tell
me @ dup location controls not if (* check permission *)
me @ location "L" flag? not if
"You may not link to $here."
me @ location name "$here" subst Tell exit
then
then
ourBack @ CheckName if (* check name; create link if valid *)
DoExitQuota if
ourRoom @ ourBack @ newexit
"Exit created with number $dbref."
over intostr "$dbref" subst Tell
me @ location setlink
"Linked to $room."
me @ location unparseobj "$room" subst Tell
me @ Exempt? not if me @ -1 addpennies then
then
else
"That's a silly name for an exit!" Tell
then
;
: DoDigRoom ( -- ) (* create a new room *)
DoRoomQuota if
me @ location location
dup not if
pop #0
then
ourRoom @ newroom ourRoom !
"$name created with room number $dbref."
ourRoom @ name "$name" subst
ourRoom @ intostr "$dbref" subst Tell
then
me @ Exempt? not if me @ -10 addpennies then
ourThere @ if
DoThereExit
then
ourBack @ if
DoBackExit
then
;
: DoParse ( -- ) (* parse arg string *)
(* tokenize arg string *)
ourString @ "=" instr if
ourString @ dup "=" instr strcut strip ourThere !
strip dup strlen 1 - strcut pop strip ourRoom !
ourThere @ "=" instr if
ourThere @ dup "=" instr strcut strip ourBack !
strip dup strlen 1 - strcut pop strip ourThere !
then
else
ourString @ ourRoom !
then
ourRoom @ CheckName if
DoDigRoom
else
"That's a silly name for a room!" Tell
then
;
: main
"me" match me !
me @ "B" flag? not if
"That command is restricted to authorized builders." Tell exit
then
dup if
ourString !
"#help" ourString @ stringpfx if DoHelp exit then
DoRoomQuota not if exit then
DoParse
else
"You must specify a name for the room." Tell
then
;
.
c
q
@set cmd-@xdig=W