@q @program cmd-@create 1 99999 d i ( cmd-@create v1.0 Jessy @ FurryMUCK 3/00 Cmd-@create emulates the standard @create command and incorporates quota control. INSTALLATION: Port cmd-@create and set it Wizard. Link a global action named '@create' to it. Cmd-@create requires lib-quota, which should be available at the MUCK or website where you obtained this program. Cmd-@create may be freely ported. Please comment any changes. ) (2345678901234567890123456789012345678901234567890123456789012345678901) lvar ourCost lvar ourRegname lvar ourString lvar ourThing $include $lib/quota $define Tell me @ swap notify $enddef $define NukeStack begin depth while pop repeat $enddef : DoHelp " " Tell "@create <object> [=<cost> [=<regname>]]" Tell " " Tell "Creates a new object and places it in your inventory. This costs at " "least ten pennies. If <cost> is specified, you are charged that many " "pennies, and in return, the object is endowed with a value according to " "the formula: ((cost / 5) - 1). Usually the maximum value of an object is " "100 pennies, which would cost 505 pennies to create. If a <regname> is " "specified, then the _reg/<regname> property on the player is set to the " "dbref of the new object. This lets players refer to the object as " "$<regname> (ie: $mybutton) in @locks, @sets, etc. Only a builder may use " "this command." strcat strcat strcat strcat strcat strcat strcat strcat Tell ; : DoThingQuota ( -- ) (* return true if user has quota available *) me @ "things" CheckQuota not if (* check user's quota *) "You are at or over your limit of things." Tell 0 exit then NukeStack 1 ; : DoCheckThingCost ( -- i ) (* return true if user can afford object, at either default or specified cost *) me @ Exempt? if 1 exit then ourCost @ not if "10" ourCost ! then ourCost @ number? not if "10" ourCost ! then ourCost @ atoi 0 < if "10" ourCost ! then ourCost @ string? not if ourCost @ intostr ourCost ! then me @ pennies ourCost @ atoi < if "Sorry, you don't have enough $pennies." "pennies" sysparm "$pennies" subst Tell 0 else 1 then ; : DoChargeThingCost ( -- ) (* charge cost for object *) (* calculate if value is specified; charge result or default of 1 *) ourCost @ not if "10" ourCost ! then ourCost @ "10" smatch not if ourThing @ ourCost @ atoi 5 / dup 100 > if pop 100 then dup me @ pennies > if 1 - addpennies else pop ourThing @ me @ pennies addpennies me @ dup pennies -1 * addpennies then then me @ Exempt? not if me @ ourCost @ atoi -1 * addpennies then ; : DoCreate ( -- ) (* create and register Thing object *) me @ ourThing @ newobject ourThing ! "$Thing created with number $dbref." ourThing @ name "$Thing" subst ourThing @ intostr "$dbref" subst Tell DoChargeThingCost ourRegname @ if ourThing @ ourRegname @ RegisterObject then ; : DoParse ( -- ) (* parse command and args *) ourString @ "=" instr if ourString @ dup "=" instr strcut strip ourCost ! strip dup strlen 1 - strcut pop strip ourThing ! ourCost @ "=" instr if ourCost @ dup "=" instr strcut strip ourRegname ! strip dup strlen 1 - strcut pop strip ourCost ! then else ourString @ ourThing ! then DoCheckThingCost not if exit then ourThing @ CheckName if DoCreate else "That's a silly name for a thing!" 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 DoThingQuota not if exit then (* check cost *) DoParse else "Create what?" Tell then ; . c q @set cmd-@create=W