Gwen's Sabbat Viniculum Global Object

This is World of Darkness global code for Sabbat vampires. If you don't know who the Sabbat are or what the World of Darkness is, it's not likely you'll have alot of use for the code. :) This system two primary functions. To track Sabbat pack members and their Viniculum ratings for each other, and to run individual Vaulderies. Multiple packs are supported, and members of different packs can participate in Vaulderies.

Author: Gwen Morse
Category: Globals
Compatibility: TinyMUSH, TinyMUX.

Instructions

Copy and paste the below code into a compatible MUSH or MUX.

MUSHCode for Gwen's Sabbat Viniculum Global Object

@@ This code is a fusion of two systems written by other programmers. This is
@@ version 1.0 as originally combined by me. I have plans to streamline and
@@ improve it, but, it's function as written, so, I'm posting it now.
@@
@@ This is World of Darkness global code for Sabbat vampires. If you don't
@@ know who the Sabbat are or what the World of Darkness is, it's not likely
@@ you'll have alot of use for the code. :)
@@
@@ This system two primary functions. To track Sabbat pack members and their
@@ Viniculum ratings for each other, and to run individual Vaulderies.
@@ Multiple packs are supported, and members of different packs can participate
@@ in Vaulderies.

@create Global: Sabbat Code
@create Sabbat Database

@@ You need to create the above two objects BEFORE pasting the rest of this
@@ record.
@@
@@ @edit and replace #2317 with the dbref of the Sabbat Database object.
@@
@@ @edit and replace #264 with the dbref of the Sabbat +roster object
@@ (SGP +roster code). You don't need +roster for the other commands to work.
@@
@@ All else should be self-evident to a competant coder.


@Desc Global: Sabbat Code='+sab/help' to get started.
&CREDITS Global: Sabbat Code=This is a fusion of two Sabbat systems. Version 1.1 as combined. Original Sources: Full Circle MUX (Viniculum -- most likely written by Pioghud) and Persistence of Memory MUX (pack database -- written by Orcus). Merged and improved by Gwen Morse <http://www.hatrack.net/mushcode/>.
&DO_SABADD Global: Sabbat Code=$+sabadd *:@switch [isplayer(%0)]=1,{&sab_list #2317=[setunion([u(#2317/sab_list)],[num(*%0)])];@pemit %#=SABBAT CODE: [name(num(*%0))] added to the list.},{@pemit %#=ERROR: '%0' is not a valid player.}
&DO_SABDEL Global: Sabbat Code=$+sabdel *:@switch [isplayer(%0)]=1,{&sab_list #2317=[ldelete([u(#2317/sab_list)],[match([u(#2317/sab_list)],[num(*%0)])])];@pemit %#=SABBAT CODE: [name(num(*%0))] removed from the list.;@wipe #2317/D[num(*%0)]*;@wipe #2317/D*-[num(*%0)]}
&DO_STAFF_SABLIST_UPDATE Global: Sabbat Code=$!sablist/update:@switch [orflags(%#,WZ)]=1,{@dol [u(#264/all.vampire)]=@switch [u(##/type)]=*sabbat*,{&sab_list #2317=[setunion([u(#2317/sab_list)],##)];@pemit %#=SABBAT CODE: Sabbat list updated with '[name(##)]'.}},{@pemit %#=SABBAT CODE: You do not have access to that command.}
&DO_SABADD_PACK Global: Sabbat Code=$+sabadd/pack *=*:@switch [strmatch([u(#2317/sab_list)],*[num(*%0)]*)]=1,{&sab.pack [num(*%0)]=[secure(%1)];@pemit %#=SABBAT CODE: [name(num(*%0))] is now in %1 pack.},{@pemit %#=SABBAT CODE: Error. '%0' is not listed in the sabbat list.}
&DO_SABBADD_POS Global: Sabbat Code=$+sabadd/pos *=*:@switch [strmatch([u(#2317/sab_list)],*[num(*%0)]*)]=1,{&sab.pos [num(*%0)]=[secure(%1)];@pemit %#=SABBAT CODE: [name(num(*%0))] is now listed as a '%1'.},{@pemit %#=SABBAT CODE: Error. '%0' is not listed in the sabbat list.}
&DO_SABINFO_DEL Global: Sabbat Code=$+sabinfo/del *:@switch [strmatch([u(#2317/infonames)],*%0*)]=1,{&infonames #2317=|[ldelete([u(#2317/infonames)],[match([u(#2317/infonames)],*%0*,|)],|)];@pemit %#=SABBAT CODE: %0 removed from the infolist.},{@pemit %#=SABBAT CODE: Error. %0 is not on the list.}
&DO_SABINFO_ADD Global: Sabbat Code=$+sabinfo/add *=*:@switch [isplayer(%0)]=1,{&info-[num(*%0)] #2317=secure(%1);&infonames #2317=|[setunion([u(#2317/infonames)],%0-[num(*%0)],|)];@pemit %#=SABBAT CODE: '%0' Added to the infolist.},{@pemit %#=SABBAT CODE: Error! '%0' is not a player.}
&DO_SABWH_ADD Global: Sabbat Code=$+sabwh/add *=*:&whlist #2317=[u(#2317/whlist)]%b%0;&whinfo-%0 #2317=%1;@pemit %#=SABBAT CODE: %0 added to the Wild Hunt list.
&DO_SABWH_DEL Global: Sabbat Code=$+sabwh/del *:@switch [strmatch([u(#2317/whlist)],*%0)]=1,{&whlist #2317=[ldelete([u(#2317/whlist)],[match([u(#2317/whlist)],*%0*)])];@pemit %#=SABBAT CODE: First entry matching '%0' deleted.},{@pemit %#=SABBAT CODE: No entries matching '%0' found.}
&DO_SAB Global: Sabbat Code=$+sab/*:@switch %0=drink,{@pemit %#=[center(%b Currently on the Vaulderie List%b,78,=)]%r%r[switch(u(#2317/vauld_list),,[center(No Members Currently Drinking,78)],[iter(u(#2317/vauld_list),%r[center(name(##),78)])])]%r%r[center(%b [words(u(#2317/vauld_list))] Members Drinking in The Current Vaulderie%b,78,=)]},list,{@pemit %#=Name[repeat(_,11)]Position[repeat(_,7)]Pack[repeat(_,8)]Clan[repeat(_,12)]Last On[repeat(_,13)][parse([u(#2317/sab_list)],%r[ljust([name(##)],14)]|[ljust([u(##/sab.pos)],14)]|[ljust([u(##/sab.pack)],11)]|[ljust([strtrunc([u(##/class)],12)],15)]|[ljust([switch([hasflag(##,connected)],1,Connected,0,[strtrunc([u(##/last)],10)])],19)]|)]%r[repeat(=,78)]%r},info,{@pemit %#=Name[repeat(_,12)]Notes[repeat(_,57)][parse([after([u(#2317/infonames)],|)],%r[ljust([before(##,-)],15,.)]|[ljust([u(#2317/info-[after(##,-)])],61,.)]|,|)]%r[repeat(=,78)]%r},wh,{@pemit %#=Name[repeat(_,11)]Reason[repeat(_,55)][parse([u(#2317/whlist)],%r[ljust(##,14)]|[ljust([u(#2317/whinfo-##)],60,.)]|)]%r[repeat(=,76)]%r},{@pemit %#={Command[repeat(_,13)]Description[repeat(_,47)]%r[ljust(+Sab/Help,19)]|[ljust(This screen,57)]|%r[ljust(+Sab/list,19)]|[ljust(Global Sabbat WHO,57)]|%r[ljust(+Sab/Info,19)]|[ljust(List Information about someone,57)]|%r[ljust(+Sab/WH,19)]|[ljust(List WildHunt Information,57)]|%r[ljust(+Sabadd <person>,19)]|[ljust(Adds <person> to the list,57)]|%r[ljust(+Sabdel <person>,19)]|[ljust(Removes <person> to the list,57)]|%r[ljust(+Sabadd/Pack X=Y,19)]|[ljust(Places member X into Pack Y,57)]|%r[ljust(+Sabadd/Pos X=Y,19)]|[ljust(Assigns member X position of Y,57)]|%r[ljust(+Sabinfo/add X=Y,19)]|[ljust(Adds person X with info Y,57)]|%r[ljust(+Sabinfo/del <Pers>,19)]|[ljust(Removes <Pers> from infofile - First match found,57)]|%r[ljust(+Sabwh/add X=Y,19)]|[ljust(Adds X to the WildHunt list with Y info,57)]|%r[ljust(+Sabwh/del <Pers>,19)]|[ljust(Removes <Pers> from WildHunt list - First match found,57)]|%r[ljust(+vin/help,19)]|[ljust(List Viniculum commands to run a Vaulderie,57)]|%r[repeat(=,78)]%r}}
&DO_VIN Global: Sabbat Code=$+vin/*:@switch secure(%0)=drink,{@switch [get(#2317/DRANK-%#)]=0,{&DRANK-%# #2317=1;@switch [gt(member(u(#2317/vauld_list),%#),0)]=1,{@pemit %#=Computing Viniculum Ratings...;@dolist setdiff(u(#2317/vauld_list),%#)={@switch [setq(1,[add(rand(10),1)])][gt(%q1,get(#2317/D%#-##))]=1,{&D%#-## #2317=[add(1,default(#2317/D%#-##,0))]},0,,{1}};@wait 3={@pemit %#=Finished.%r[center(%bViniculum Ratings For '%N'%b,78,=)]%r[iter(lattr(#2317/d%#*),%r[center({[name(after(##,-))]:[get(#2317/##)]},78)])]%r%r[repeat(=,78)]}},0,{@pemit %#=You aren't on the drinking list.}},1,{@pemit %#=You've already drank in this Vaulderie.},{@pemit %#=Error: You aren't on the drinklist.}},hints,{@pemit %#=[center(%bGlobal Viniculum Command Hints%b,78,=)]%r%r[space(5)]+drinklist programs the code for all the people's blood you are drinking so it can compute your attachment ratings to them. If you drink without first setting up a 'drinklist' (with the +drinklist command) you will not be drinking the right people's blood. Which is why it is a _VERY_ good idea to clear the drinklist with +drinklist/clear so that the next time you use it if not everyone gets a change to partake...so you don't have the wrong drinklist already set up and mistakenly drink the wrong blood.%r[space(5)]+vin/drink actually runs the computation and stores your permanent ratings on the object itself and removes your name from the drinklist (since you can only bond once per Vaulderie.) (Viewable at any time with +ratings.) %r%r[repeat(=,78)]},help,{@pemit %#=[center(%bGlobal Viniculum Commands%b,78,=)]%r%r+sab/drink[space(26)]lists packmembers who are on the%r[space(40)]'drinklist'%r+drinklist <name1> <nameN> <etc.>[space(3)]inputs all <names> onto the current%r[space(40)]'drinklist'%r[space(40)](i.e. Currently partaking in%r[space(40)]the Vaulderie)%r+drinklist/clear [space(19)]wipes the drinklist clean.%r+vin/drink[space(26)]drinks from the Vaulderie vessel%r[space(40)]and computes Vinic. ratings for%r[space(40)]that person.%r+ratings [space(27)]displays all ratings currently held %r[space(40)]by the enactor toward members of %r[space(40)]her pack that she has Vaulderied with%r+sab/help[space(27)]this help file%r+sab/hints[space(26)]helpful hints on its use%r%rAdministrative Options:%r+setrating <name1>=<name2>=<rate>%b %bgives <name1> a <rate> Vinic rating%r[space(40)]toward <name2>%r+ratings of <name>[space(18)]lists Vin ratings of <name>%r+sabtitle <name>=<position>[space(9)]Sets <name> as <position> on the +sablist.%r[repeat(=,78)]},{@pemit %#=SABBAT CODE: That is not an appropriate choice. Try +vin/help.}
&DO_DRINKLIST Global: Sabbat Code=$+drinklist*:@switch secure(%0)={/show},{@pemit %#=[center(%b Currently on the Vaulderie List%b,78,=)]%r%r[switch(u(#2317/vauld_list),,[center(No Members Currently Drinking,78)],[iter(u(#2317/vauld_list),%r[center(name(##),78)])])]%r%r[center(%b [words(u(#2317/vauld_list))] Members Drinking in The Current Vaulderie%b,78,=)]},{/clear},{@wipe #2317/vauld_list; @pemit %#=Vaulderie List and old Vaulderie Prefs cleared.;@wipe #2317/DRANK*},{@switch [setq(1,[setdiff([iter(secure(%0),[num(*##)])],[iter(u(#2317/sab_list),before(##,%b))])])][gt(words(%q1),0)]=1,{@pemit %#=Sorry, one or more of the people you listed is not a member of the packlist.},{@pemit %#=SABBAT CODE: Drinklist set.;&vauld_list #2317=[iter(secure(%0),[num(*##)])];@wipe #2317/drank*;@dolist [iter(u(#2317/sab_list),before(##,%b))]={&DRANK-## #2317=0}}}
&DO_RATINGS Global: Sabbat Code=$+ratings:@switch [match(u(#2317/sab_list),*%#*))]=0,{@pemit %#=Sorry, authorized personnel only.},{@pemit %#=[center(%bViniculum Rating For %N%b,78,=)]%r%r[iter(lattr(#2317/d%#*),%r[center({[name(after(##,-))]:%b[get(#2317/##)]},78)])]%r%r[repeat(=,78)]}
&DO_RATINGS_OF Global: Sabbat Code=$+ratings of *:@switch [isstaff(%#)]=1,{@switch [words(lattr(#2317/d[num(*%0)]*))]=0,{@pemit %#=Sorry, '%0' has no listed Viniculum Ratings.},{@pemit %#=[center(%bViniculum Ratings For [name(*%0)]%b,78,=)]%r%r[iter(lattr(#2317/d[num(*%0)]*),%r[center({[name(after(##,-))]:[get(#2317/##)]},78)])]%r%r[repeat(=,78)]}},{@pemit %#=Sorry, authorized personnel only.}
&DO_SET_RATING Global: Sabbat Code=$+setrating *=*=*:@switch [isstaff(%#)]=1,{@switch and(match(type(secure(*%0)),PLAYER),match(type(secure(*%1)),PLAYER),isnum(secure(%2)))=1,{@pemit %#=Setting up rating for [secure(name(*%0))].%rBonded with [name(secure(*%1))] at a rating of [secure(%2)].;&D[num(*%0)]-[num(*%1)] #2317=%2},{@pemit %#=Sorry, the correct syntax is:%r+setrating <player1>=<player2>=<rating>%r...where <player1> is to have <rating> for <player2>.}},{@pemit %#=Sorry...authorized personnel only.}
&ISSAB Global: Sabbat Code=[or([orflags(%#,WZ)],[strmatch([u(#2317/sab_list)],*%#*)])]
@set Global: Sabbat code=COMMMANDS
@set Global: Sabbat code=INHERIT
@set Global: Sabbat code=SAFE