Dvorak Engine source

From Dvorak - A Blank-Card Game
Jump to: navigation, search

This is the MUSH source code for the Dvorak Engine, written by Kevan Davis in 2000. Anyone's welcome to reuse it or improve it.

@create Dvorak Engine=10
&DECKHOLDER Dvorak Engine=#10031
&READ Dvorak Engine=$readcard *:@pemit %#=%b%b[u(card,%0,2)] <[switch([u(card,%0,3)],A,Action,Thing)]>[switch([u(card,%0,4)],,,%r%b%b[u(card,%0,4)])][switch([u(card,%0,5)],,,%r%b%b(Status : [u(card,%0,5)]))]
&DRAW Dvorak Engine=$drawcard:setq(1,parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Draw,##)]));setq(0,[extract(%q1,[add(1,rand(words(%q1)))],1)]);@switch %q0=,{@emit [name(%#)] attempts to draw a card - draw pile empty...;@fo me=shuffle},{@emit [name(%#)] draws a card.;@pemit %#=You draw - [u(card,%q0,2)] (%q0);@trigger me/submove=%q0,%#}
&RANDRAW Dvorak Engine=[setq(0,add(1,rand([u(cards)])))][switch([extract([u(card%q0)],1,1,~)],Draw,%q0,[u(randraw)])]
&DISCARD Dvorak Engine=$discard *:@switch [extract([u(card%0)],1,1,~)]=%#,{@emit [name(%#)] discards [extract([u(card%0)],2,1,~)] (%0);@trigger me/submove=%0,Discard;},@pemit %#=You don't have that card.
&PLAYCARD Dvorak Engine=$playcard *:@switch %0=* *,,{@switch [extract([u(card%0)],1,1,~)]=%#,{@emit [name(%#)] [switch([u(card,%0,3)],A,plays,puts)] [extract([u(card%0)],2,1,~)] (%0)[switch([u(card,%0,3)],T,%binto play)];@trigger me/submove=%0,[switch([u(card,%0,3)],A,Discard,P%#)]},@pemit %#=You don't have that card.;}
&DESTROY Dvorak Engine=$destroy *:@switch [extract([u(card%0)],1,1,~)]=P*,{@emit [name(%#)] destroys [extract([u(card%0)],2,1,~)] (%0);&card%0 #7753=P%#~[u(card,%0,2)]~[u(card,%0,3)]~[u(card,%0,4)]~;@trigger me/submove=%0,Discard},@pemit %#=That card is not in play.
&NEWCARD Dvorak Engine=$newcard */*/*:@emit [name(%#)] proposes a new card ([add([u(cards)],1)]): %0 ([switch(%1,A,Action,Thing)]) %2;&cards me=[add([u(cards)],1)];&card[u(cards)] me = Vote~%0~%1~%2~
&APPROVE Dvorak Engine=$approve *:@switch [extract([u(card%0)],1,1,~)]=Vote,{@emit [name(%#)] approves [extract([u(card%0)],2,1,~)] (%0);@trigger me/submove=%0,Draw},@pemit %#=That card is not in the voting pile.
@Desc Dvorak Engine=An engine allowing online play of Dvorak, the Nomic card game.%r%rFor an abridged list of commands, type 'dvcommands' - for the full lot, visit http://dvorakgame.co.uk/engine.html
&VIEWDISC Dvorak Engine=$viewdisc:@pemit %#=squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Discard,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)])])
&VIEWHAND Dvorak Engine=$viewhand:@pemit %#=switch(u(handsize,%#),0,Your hand is empty.,squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],%#,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)] )]))
&VIEWPLAY Dvorak Engine=$viewplay:setq(0,squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],P*,[name([delete([u(card,##,1)],0,1)])] - [u(card,##,2)] (##)[switch([u(card,##,5)],,,%b([u(card,##,5)]))]%r)])]));@pemit %#=[switch(trim(%q0),,No cards in play.,%q0)][switch([u(me/notes)],,,%rNotes : [u(me/notes)])]
&SHUFFLE Dvorak Engine=$shuffle:@emit [name(%#)] shuffles the discard pile into the draw pile.;@dolist lnum(1,[u(cards)])=@switch [u(card,##,1)]=Discard,{@trigger me/submove=##,Draw;}
&VIEWVOTE Dvorak Engine=$viewvote:@pemit %#=switch(floor(u(cards)),0,There are no cards in the deck.,squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Vote,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)])]))
&GIVETHING Dvorak Engine=$givething * to *:@emit [name(%#)] gives control of [u(card,%0,2)] (%0) to %1;@trigger me/submove=%0,P[num(*%1)]
&COINTOSS Dvorak Engine=$toss:@emit [switch(rand(2),1,Heads - you may draw a card,Tails - you may not draw)].
&VIEWALL Dvorak Engine=$viewall:@pemit %#=switch(floor(u(cards)),0,There are no cards in the deck.,squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Vote,,Repeal,,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)])]))
&LOGCARDS Dvorak Engine=$logcards:@dolist lnum(1,[u(cards)])=@pemit %#=[switch([u(card,##,1)],[switch([u(card,##,1)],Repeal,(##),Vote,-##-,##)] - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]> [u(card,##,4)])]
&DRAWPILE Dvorak Engine=iter(lnum(1,[u(cards)]),[switch([u(card,##,1)],Draw,##,)])
&VIEWDRAW Dvorak Engine=$viewdraw:@emit [name(%#)] looks through the draw pile.;@pemit %#=squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Draw,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)])])
&COUNT Dvorak Engine=$count *:@pemit %#=[switch(u(handsize,*%0),-1,Can't find player '*%0'.,Cards in [name(num(*%0))]'s hand: [u(handsize,*%0)])]
&COUNTDRAW Dvorak Engine=$countdraw:setq(1,parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Draw,##)]));@pemit %#=Cards in draw pile: [words(%q1)]
&REPEAL Dvorak Engine=$repeal *:@switch [extract([u(card%0)],1,1,~)]=Repeal,@pemit %#=That card has already been repealed.,{@emit [name(%#)] repeals [extract([u(card%0)],2,1,~)] (%0);&card%0 me=Repeal~[extract([u(card%0)],2,1,~)]~[extract([u(card%0)],3,1,~)]~[extract([u(card%0)],4,1,~)]}
&VIEWREP Dvorak Engine=$viewrep:@pemit %#=squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Repeal,## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)])])
&EDIT Dvorak Engine=$editcard *=*/*/*:@emit [name(%#)] edits [u(card,%0,2)] (%0) from%r[u(card,%0,2)] <[u(card,%0,3)]> [u(card,%0,4)]%rto%r%1 <%2> %3;&card%0 me=[u(card,%0,1)]~%1~%2~%3~
&SETNOTES Dvorak Engine=$setnotes *:&notes me=%0;@emit [name(%#)] sets the Notes to "%0".
&CLEARNOTES Dvorak Engine=$setnotes:&notes me=;@emit [name(%#)] clears the Notes.
&DRAWVIS Dvorak Engine=$drawvis:setq(1,parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],Draw,##)]));setq(0,[extract(%q1,[add(1,rand(words(%q1)))],1)]);@switch %q0=,{@emit [name(%#)] attempts to draw a card - draw pile empty...;@fo me=shuffle},{@emit [name(%#)] draws [u(card,%q0,2)] (%q0) and reveals it to all Players.;&card%q0 me=%#~[u(card,%q0,2)]~[u(card,%q0,3)]~[u(card,%q0,4)]}
&NEWDVORAK Dvorak Engine=$newdvorak:@emit [name(%#)] shuffles all the Dvorak cards back together.;@dolist lnum(1,[u(cards)])=@switch [u(card,##,1)]=Vote,,Repeal,,{&card## me=Draw~[u(card,##,2)]~[u(card,##,3)]~[u(card,##,4)]}
&RENAME Dvorak Engine=$rename *=*:@emit [name(%#)] renames [u(card,%0,2)] (%0) to %1;&card%0 me=[u(card,%0,1)]~%1~[u(card,%0,3)]~[u(card,%0,4)]~[u(card,%0,5)]
&VIEW2 Dvorak Engine=$viewhand *:@emit [name(%#)] looks at [name([num(*%0)])]'s hand.;@pemit %#=squish(%b[parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],[num(*%0)],## - [u(card,##,2)] <[switch([u(card,##,3)],A,Action,Thing)]>%r)] )])
&DISCRAND Dvorak Engine=$discrand:setq(2,u(randomcard,%#));@switch %q2=,@pemit %#=You have no cards to discard.,{@emit [name(%#)] discards a card at random - [u(card,%q2,2)] (%q2);@trigger me/submove=%q2,Discard}
&GIVECARD Dvorak Engine=$givecard * to *:@emit [name(%#)] gives [u(card,%0,2)] (%0) to %1;@trigger me/submove=%0,[num(*%1)]
&COMMANDS Dvorak Engine=$dvcommands:@pemit %#=drawcard - Draw a card.%rdrawvis - Draw a card and show it to all Players.%rplaycard # - Play a specified card from your hand%rreadcard # - Read a specified card.%rdiscard # - Discard a specified card from your hand.%rdestroy # - Destroy a specified card in play.%rgivecard # to (player) - Give a specified card to a specified player.%rgivething # to (player) - Give control a specified Thing to a specified player.%rshuffle - Shuffle the discard pile into the draw pile.%r%rviewhand - View cards in your hand.%rviewplay - View cards in play.%rviewdisc - View contents of discard pile.%rcount (player) - Count the number of cards in a specified Player's hand.%rcountdraw - Count the number of cards in the draw pile.%r%rnewcard name/(A or T)/text - Propose a new card%r%b%b%b%b(eg. "newcard Armageddon/A/Destroy all Things.")%rapprove # - Approve a proposed card.%reditcard #=name/(A or T)/text - Edit an existing card.%rrepeal # - Remove a card from the game.
&SAVE Dvorak Engine=$savedeck *:@dolist lnum(1,[u(cards)])=&back%0## [u(deckholder)]=[v(card##)]; &back%0cards [u(deckholder)]=[u(cards)]; &list [u(deckholder)]=setunion(u([u(deckholder)]/list),[ucstr(%0)]); @emit [name(%#)] saves the current game as "%0".
&LOAD Dvorak Engine=$loaddeck *:&cards me=[u([u(deckholder)]/back%0cards)]; @dolist lnum(1,[u(cards)])=&card## me=[get([u(deckholder)]/back%0##)]; @emit [name(%#)] loads an old game - "%0".
&CLEAR Dvorak Engine=$cleardeck:&cards me=0;@emit [name(%#)] clears the current Dvorak deck.
&SHUFCARD Dvorak Engine=$shufcard *:@emit [name(%#)] shuffles [extract([u(card%0)],2,1,~)] (%0) into the draw pile.;&card%0 me=Draw~[extract([u(card%0)],2,1,~)]~[extract([u(card%0)],3,1,~)]~[extract([u(card%0)],4,1,~)]
&HANDSIZE Dvorak Engine=setq(1,parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],[num(%0)],##)]))[switch(num(%0),#-1,-1,[words(%q1)])]
&RANDOMCARD Dvorak Engine=setq(1,parse(lnum(1,[u(cards)]),[switch([u(card,##,1)],[num(%0)],##)]))[extract(%q1,[add(1,rand(words(%q1)))],1)]
&SUBMOVE Dvorak Engine=&card%0 me=%1~[extract([u(card%0)],2,1,~)]~[extract([u(card%0)],3,1,~)]~[extract([u(card%0)],4,1,~)]~[extract([u(card%0)],5,1,~)]
&STATUS Dvorak Engine=$status *=*:@emit [name(%#)] changes the status of [u(card,%0,2)] (%0)[switch([u(card,%0,5)],,,%bfrom "[u(card,%0,5)]")] to "%1";&card%0 me=[u(card,%0,1)]~[u(card,%0,2)]~[u(card,%0,3)]~[u(card,%0,4)]~%1
&PLAYONTO Dvorak Engine=$playcard * onto *:@switch [u(card,%0,3)][u(card,%0,1)]=T%#,{@emit [name(%#)] puts [u(card,%0,2)] (%0) into play on [u(card,%1,2)] (%1);&card%0 me=P%#~[u(card,%0,2)]~[u(card,%0,3)]~[u(card,%0,4)]~on [u(card,%1,2)][switch([u(card,%0,5)],,,%b- [u(card,%0,5)])]},@pemit %#=Either you don't have that card, or it's not a Thing.
&CARDBACK Dvorak Engine=[extract([u(card%0)],%1,1,~)]
&LIST Dvorak Engine=$listdecks:@pemit %#=Saved Dvorak decks: [u(u(deckholder)/list)]
&CARD Dvorak Engine=[extract(u(card%0),%1,1,~)]
&DELETEDECK Dvorak Engine=$deletedeck *:@dolist lnum(1,u([u(deckholder)]/back%0cards))=&back%0## [u(deckholder)]=; &back%0cards [u(deckholder)]=; &list [u(deckholder)]=setdiff(u([u(deckholder)]/list),[ucstr(%0)]); @emit [name(%#)] erases the saved deck "%0".
&LOADCARD Dvorak Engine=$loadcard */*/*:&cards me=[add([u(cards)],1)];&card[u(cards)] me = Draw~%0~%1~%2~
@set Dvorak Engine=COMMANDS

Note that a "deckholder" object also needs to be created, to load and save decks. Its number is given with "&DECKHOLDER Dvorak Engine=", in the source.