@create Scrabule @parent Scrabule=Function Parent @desc Scrabule=----Scrabule Commands----%rSCRABVIEW : View the board.%rSCRABNEW : Start a new game.%rSCRABPASS : Give up your turn.%rSCRABUNDO : Take back the previous turn. (For wrong words, or misplaced moves).%rSCRABA ,= : Play across, starting at (x,y).%rSCRABD ,= : Play down, starting at (x,y).%rSCRABVALUE : Tells you the score value of %rSCRABSWAP : Use your turn to change from your rack.%rSCRABSAVE : Saves the current board as : Overwrites current board with previously saved .%rSCRABLIST : List saved games.%rCREDITS : Bah, it's obvious.%rSCRABPEEK : Look at 's tiles.%r------------------------- &cmd_credits Scrabule=$credits:@pemit %#=Scrabule coded by RavenBlack, when the bird should have been doing work.%rhttp://www.ravenblack.net/%rravenblack@ravenblack.net%rThis Scrabule has no switches, and only four @triggers. Be impressed.[u(str_extracredits[strmatch(owner(me),%#)])] &cmd_scrabpeek Scrabule=$scrabpeek *:@pemit %#=%0's tiles: [u(tiles[setq(0,member(u(players),num(*%0)))]%q0)]; @switch %q0=0,,@oemit %#=%n looks at [name(extract(u(players),%q0,1))]'s Scrabule tiles. &str_extracredits1 Scrabule=%r%rTroubleshooting :%r@Set Scrabule=COMMANDS%r@parent Scrabule=Function Parent; @@ You /do/ have RavenBlack's Function Parent?%r@set Scrabule=!HALTED; @@ If even 'CREDITS' doesn't work, COMMANDS or HALTED are likely wrong.%rStill no luck? Perhaps if you find RavenBlack, it'll help. Perhaps not. &cleanboard0 Scrabule=00| @ . . . = . . @ . . = . . . @ &cleanboard1 Scrabule=01| . + . . . = . . . = . . . + . &cleanboard2 Scrabule=02| . . + . . . - . - . . . + . . &cleanboard3 Scrabule=03| . . . + . . . - . . . + . . . &cleanboard4 Scrabule=04| = . . . + . . . . . + . . . = &cleanboard5 Scrabule=05| . = . . . - . . . - . . . = . &cleanboard6 Scrabule=06| . . - . . . . . . . . . - . . &cleanboard7 Scrabule=07| @ . . - . . . + . . . - . . @ &cleanboard8 Scrabule=08| . . - . . . . . . . . . - . . &cleanboard9 Scrabule=09| . = . . . - . . . - . . . = . &cleanboard10 Scrabule=10| = . . . + . . . . . + . . . = &cleanboard11 Scrabule=11| . . . + . . . - . . . + . . . &cleanboard12 Scrabule=12| . . + . . . - . - . . . + . . &cleanboard13 Scrabule=13| . + . . . = . . . = . . . + . &cleanboard14 Scrabule=14| @ . . . = . . @ . . = . . . @ &board15 Scrabule=--+------------------------------ &board16 Scrabule=##| 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 &board17 Scrabule=##| %b %b %b %b %b %b %b %b %b %b 0 1 2 3 4 &cleantiles Scrabule=A A A A A A A A A B B C C D D D D E E E E E E E E E E E E F F G G G H H I I I I I I I I I J K L L L L M M N N N N N N O O O O O O O O P P Q R R R R R R S S S S T T T T T T U U U U V V W W X Y Y Z # # &tilebag Scrabule= &players Scrabule= &score1 Scrabule= &tiles1 Scrabule= &valueA Scrabule=1 &valueB Scrabule=3 &valueC Scrabule=3 &valueD Scrabule=2 &valueE Scrabule=1 &valueF Scrabule=4 &valueG Scrabule=2 &valueH Scrabule=4 &valueI Scrabule=1 &valueJ Scrabule=8 &valueK Scrabule=5 &valueL Scrabule=1 &valueM Scrabule=3 &valueN Scrabule=1 &valueO Scrabule=1 &valueP Scrabule=3 &valueQ Scrabule=10 &valueR Scrabule=1 &valueS Scrabule=1 &valueT Scrabule=1 &valueU Scrabule=1 &valueV Scrabule=4 &valueW Scrabule=4 &valueX Scrabule=8 &valueY Scrabule=4 &valueZ Scrabule=10 &value# Scrabule=0 &multipliers Scrabule=- = + @ . &multiplyl1 Scrabule=2 &multiplyl2 Scrabule=3 &multiplyl3 Scrabule=1 &multiplyl4 Scrabule=1 &multiplyl5 Scrabule=1 &multiplyw1 Scrabule=1 &multiplyw2 Scrabule=1 &multiplyw3 Scrabule=2 &multiplyw4 Scrabule=3 &multiplyw5 Scrabule=1 &cmd_scrabpass Scrabule=$scrabpass:@trigger me/ext_scrabpass[u(fn_turn_of,%#)]=%# &ext_scrabpass0 Scrabule=@pemit %0=It's not your turn. &ext_scrabpass1 Scrabule=&lastturn me=u(currturn); &lastconsecutivepasses me=u(consecutivepasses); &consecutivepasses me=add(1,u(consecutivepasses)); &lasttilebag me=u(tilebag); &lastscore me=u(score[setq(0,u(currturn))]%q0); &lasttiles me=u(tiles%q0); @emit [name(%0)] gives up [poss(%0)] Scrabule turn.;&currturn me=u(fn_nextturn);@pemit extract(u(players),u(currturn),1)=[u(fn_cangameover[gte(u(consecutivepasses),words(u(players)))])] &fn_cangameover1 Scrabule=You can type 'SCRABGAMEOVER' now to end the game due to consecutive passes. &cmd_scrabundo Scrabule=$scrabundo:@trigger me/ext_scrabundo[not(strlen(u(lastscore)))]=%# &ext_scrabundo0 Scrabule=&consecutivepasses me=u(lastconsecutivepasses);&currturn me=setq(0,u(lastturn))%q0; &score%q0 me=u(lastscore); &lastscore me=; &tilebag me=u(lasttilebag); &tiles%q0 me=u(lasttiles); @dolist lnum(15)=&board## me=u(lastboard##); @emit Last Scrabule turn undone. &ext_scrabundo1 Scrabule=@pemit %0=Sorry, Scrabule can't undo at this point. &cmd_scrabview Scrabule=$scrabview:@pemit %#=iter(lnum(18),%r[u(board##)] [u(fn_scrabview[lt(##,words(u(players)))][or(eq(##,12),eq(##,14))][eq(##,16)],add(##,1),%#)]) &fn_scrabview100 Scrabule=[rjust(name(extract(u(players),%0,1)),20)] : [u(score%0)] &fn_scrabview010 Scrabule=[u(fn_scrabview010[lt(%0,14)])] &fn_scrabview0100 Scrabule=%b %b %b %b %b [words(u(tilebag))] tiles remaining. &fn_scrabview0101 Scrabule=[rjust(name(extract(u(players),u(currturn),1)),20)] to play. &fn_scrabview001 Scrabule=[u(fn_leadstring,%b %b %b %bYour tiles :%b,u(tiles[member(u(players),%1)]))] &cmd_scrabnew Scrabule=$scrabnew *:&consecutivepasses me=0;&lastscore me=;&players me=setunion(%#,iter(%0,u(fn_player_dbref,##,me))); @dolist lnum(15)={&board## me=u(cleanboard##)}; @emit Game of Scrabule started : [iter(u(players),name(##))].; &currturn me=1; &tilebag me=u(cleantiles);@dolist lnum(words(u(players)))={&score[add(1,##)] me=0; &tiles[add(1,##)] me=[setq(3,u(fn_gettiles1,u(tilebag),7))][extract(%q3,1,1,|)]; &tilebag me=extract(%q3,2,1,|)} &cmd_scraba Scrabule=$scraba *,*=??*:@trigger me/ext_scrab[u(fn_turn_of,%#)][gt(setq(0,u(fn_scorea1,ucstr(%2%3%4),u(tiles[u(currturn)]),add(%0,2),%1,1,0))%q0,0)]=%#,%q0,add(%0,2),%1,ucstr(%2%3%4),1,0 &cmd_scrabd Scrabule=$scrabd *,*=??*:@trigger me/ext_scrab[u(fn_turn_of,%#)][gt(setq(0,u(fn_scored1,ucstr(%2%3%4),u(tiles[u(currturn)]),add(%0,2),%1,1,0))%q0,0)]=%#,%q0,add(%0,2),%1,ucstr(%2%3%4),0,1 &ext_scrab00 Scrabule=@pemit %0=It's not your turn. &ext_scrab01 Scrabule=@pemit %0=It's not your turn. &ext_scrab10 Scrabule=@pemit %0=Illegal play. &ext_scrab11 Scrabule=&lastturn me=u(currturn); &lastconsecutivepasses me=u(consecutivepasses); &consecutivepasses me=0; &lasttilebag me=u(tilebag); &lastscore me=u(score[setq(0,u(currturn))]%q0); &lasttiles me=u(tiles%q0); &score%q0 me=add(u(score%q0),%1);@dolist lnum(15)={&lastboard## me=u(board##)};@dolist iter(lnum(strlen(%4)),[mid(%4,##,1)]|[add(%2,mul(%5,##))]|[add(%3,mul(%6,##))])={&tiles%q0 me=u(fn_tilefromrack[setq(2,strmatch(u(multipliers),*[extract(u(board[extract(##,3,1,|)]),extract(##,2,1,|),1)]*))]%q2,extract(##,1,1,|),u(tiles%q0));&tilebag me=u(fn_tilefrombag%q2,extract(u(tiles%q0),words(u(tiles%q0)),1)); &board[extract(##,3,1,|)] me=u(fn_tiletoboard,u(board[extract(##,3,1,|)]),extract(##,2,1,|),extract(##,1,1,|))};@emit [name(%0)] scrabs '%4' for %1 points.;&currturn me=u(fn_nextturn); @wait 1=@trigger me/ext_outtatiles[words(u(tiles%q0))]=%q0 &ext_outtatiles0 Scrabule=@pemit extract(u(players),u(currturn),1)=[name(setq(3,extract(u(players),%0,1))%q3)] has no tiles left. Type 'SCRABGAMEOVER' or 'SCRABUNDO'.; &consecutivepasses me=20; &currturn me=0; @pemit %q3=Waiting for next player to type 'SCRABGAMEOVER' or 'SCRABUNDO'. &fn_turn_of Scrabule=[strmatch(extract(u(players),u(currturn),1),%0)] &fn_nextturn Scrabule=[u(fn_nextturn[gt(setq(1,add(u(currturn),1))%q1,words(u(players)))],%q1)] &fn_nextturn0 Scrabule=%0 &fn_nextturn1 Scrabule=1 &fn_scorea0 Scrabule=-9999 &fn_scorea1 Scrabule=[u(fn_scoreanext[gt(strlen(%0),0)][setq(2,extract(u(board%3),%2,1))][and(1,strlen(u(value%q2)))][strmatch(u(multipliers),*%q2*)],%0,%1,%2,%3,%4,%5,%q2)] &fn_scoreanext100 Scrabule=-9999 &fn_scoreanext101 Scrabule=[setq(3,u(multiplyw[member(u(multipliers),%6)]))][setq(4,mid(%0,0,1))][add(u(fn_qscore,%2,%3,0,1,%q4,%q3),u(fn_scorea[strmatch(%1,*%q4*)],mid(%0,1,15),remove(%1,%q4),add(1,%2),%3,mul(%4,%q3),add(%5,mul(u(value%q4),u(multiplyl[member(u(multipliers),%6)])))))] &fn_scoreanext110 Scrabule=[u(fn_scorea[strmatch(mid(%0,0,1),%6)],mid(%0,1,15),%1,add(%2,1),%3,%4,add(u(value%6),%5))] &fn_scoreanext000 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_scoreanext001 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_scoreanext010 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_scored0 Scrabule=-9999 &fn_scored1 Scrabule=[u(fn_scorednext[gt(strlen(%0),0)][setq(2,extract(u(board%3),%2,1))][and(1,strlen(u(value%q2)))][strmatch(u(multipliers),*%q2*)],%0,%1,%2,%3,%4,%5,%q2)] &fn_scorednext100 Scrabule=-9999 &fn_scorednext101 Scrabule=[setq(3,u(multiplyw[member(u(multipliers),%6)]))][setq(4,mid(%0,0,1))][add(u(fn_qscore,%2,%3,1,0,%q4,%q3),u(fn_scored[strmatch(%1,*%q4*)],mid(%0,1,15),remove(%1,%q4),%2,add(1,%3),mul(%4,%q3),add(%5,mul(u(value%q4),u(multiplyl[member(u(multipliers),%6)])))))] &fn_scorednext110 Scrabule=[u(fn_scored[strmatch(mid(%0,0,1),%6)],mid(%0,1,15),%1,%2,add(%3,1),%4,add(u(value%6),%5))] &fn_scorednext000 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_scorednext001 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_scorednext010 Scrabule=[add(mul(%5,%4),u(fn_cleanrackbonus[words(%1)]))] &fn_cleanrackbonus0 Scrabule=[u(fn_cleanrackbonus0[words(u(tiles[u(currturn)]))])] &fn_cleanrackbonus07 Scrabule=50 &fn_qscore Scrabule=[u(fn_qscore[or(strlen(u(value[extract(u(board[add(%1,%3)]),add(%0,%2),1)])),strlen(u(value[extract(u(board[sub(%1,%3)]),sub(%0,%2),1)])))],%0,%1,%2,%3,%4,%5)] &fn_qscore0 Scrabule=0 &fn_qscore1 Scrabule=[mul(%5,add(mul(u(multiplyl[member(u(multipliers),extract(u(board%1),%0,1))]),u(value%4)),u(fn_qscore11,add(%2,%0),add(%3,%1),%2,%3,%5),u(fn_qscore11,sub(%0,%2),sub(%1,%3),-%2,-%3)))] &fn_qscore11 Scrabule=[u(fn_qscore11[setq(2,u(value[extract(u(board%1),%0,1)]))][gt(strlen(%q2),0)],%0,%1,%2,%3,%q2)] &fn_qscore110 Scrabule=0 &fn_qscore111 Scrabule=[add(%4,u(fn_qscore11,add(%0,%2),add(%1,%3),%2,%3))] &fn_tilefromrack0 Scrabule=%1 &fn_tilefromrack1 Scrabule=[remove(%1,%0)] [extract(u(tilebag),add(1,rand(words(u(tilebag)))),1)] &fn_tilefrombag0 Scrabule=[u(tilebag)] &fn_tilefrombag1 Scrabule=[remove(u(tilebag),%0)] &fn_gettiles1 Scrabule=[setq(3,extract(%0,add(1,rand(words(%0))),1))]%q3 [u(fn_gettiles[gt(%1,1)],remove(%0,%q3),sub(%1,1))] &fn_gettiles0 Scrabule=|%0 &fn_tiletoboard Scrabule=[extract(%0,1,sub(%1,1))] %2 [extract(%0,add(%1,1),15)] @@ currturn (1,2,3) @@ ext_scrab00,%# (wrong player, illegal move) @@ ext_scrab01,%# (wrong player) @@ ext_scrab10,%# (illegal move) @@ ext_scrab11,%#,score,x,y,word,dx,dy (happy) @@ fn_tilefromrack,tile,tiles @@ fn_tiletoboard,linestring,x,tile @@ fn_turn_of,player @@ fn_scorea,word,tiles,x,y,wordmul,wordscore (returns -9999 for illegal) (recurses) @@ fn_scored,word,tiles,x,y,wordmul,wordscore @@ fn_qscore,x,y,dx,dy,char[,wordmul] (recurses) &cmd_scrabvalue Scrabule=$scrabvalue ?:@pemit %#=u(fn_scrabvalue[not(strlen(u(value%0)))],ucstr(%0)) &fn_scrabvalue0 Scrabule=Value of '%0' is [u(value%0)]. &fn_scrabvalue1 Scrabule=There is no '%0' tile in Scrabule. &cmd_scrabswap Scrabule=$scrabswap *:@trigger me/ext_scrabswap[and(lt(strlen(%0),8),lte(strlen(%0),words(u(tilebag))))][u(fn_turn_of,%#)]=%#,ucstr(%0) &ext_scrabswap00 Scrabule=@pemit %0=It's not your turn. &ext_scrabswap10 Scrabule=@pemit %0=It's not your turn. &ext_scrabswap01 Scrabule=@pemit %0=You can't swap [strlen(%1)] tiles now. &ext_scrabswap11 Scrabule=@trigger me/ext_scrabswap[u(fn_tilecheck11,u(tiles[u(currturn)]),setq(0,iter(lnum(strlen(%1)),mid(%1,##,1)))%q0)]=%0,%q0 &ext_scrabswap1 Scrabule=&lastturn me=u(currturn); &lastscore me=u(score[u(currturn)]); &lasttilebag me=u(tilebag); &lasttiles me=u(tiles[u(currturn)]); &tiles[u(currturn)] me=u(fn_multiremove,u(tiles[u(currturn)]),%1);&tiles[u(currturn)] me=[u(tiles[u(currturn)])] [extract(setq(1,u(fn_gettiles1,u(tilebag),words(%1)))%q1,1,1,|)]; &tilebag me=[extract(%q1,2,1,|)] %1; @emit [name(extract(u(players),u(currturn),1))] swaps [words(%1)] tiles.;&currturn me=u(fn_nextturn) &ext_scrabswap0 Scrabule=@pemit %0=You don't have tiles '%1'. &fn_tilecheck11 Scrabule=[u(fn_tilecheck[gt(words(%1),0)][gt(member(%0,extract(%1,1,1)),0)],remove(%0,extract(%1,1,1)),extract(%1,2,10))] &fn_tilecheck00 Scrabule=1 &fn_tilecheck01 Scrabule=1 &fn_tilecheck10 Scrabule=0 &cmd_scrabgameover Scrabule=$scrabgameover:@trigger me/ext_scrabgameover[gte(u(consecutivepasses),words(u(players)))]=%# &ext_scrabgameover1 Scrabule=&lastscore me=;&consecutivepasses me=;@dolist lnum(words(u(players)))={&score[setq(1,add(##,1))]%q1 me=add(u(score%q1),setq(0,u(fn_gameoverscore[gt(words(u(tiles%q1)),0)],%q1))%q0); @emit [name(extract(u(players),%q1,1))] [u(fn_gainsstr[eq(words(u(tiles%q1)),0)],%q0,u(tiles%q1))], making [poss(extract(u(players),%q1,1))] final score [u(score%q1)].};&currturn me=0 &ext_scrabgameover0 Scrabule=@pemit %0=All players must pass consecutively, or one player must clear their rack to end game. &fn_gameoverscore0 Scrabule=[u(fn_sum,iter(lnum(words(u(players))),u(fn_rackvalue,u(tiles[add(##,1)]))))] &fn_gameoverscore1 Scrabule=-[u(fn_rackvalue,u(tiles%0))] &fn_rackvalue Scrabule=[u(fn_sum,iter(%0,u(value##)))] &fn_gainsstr0 Scrabule=loses [trim(%0,,-)] points (%1) &fn_gainsstr1 Scrabule=gains %0 points &cmd_scrabsave Scrabule=$scrabsave ???*:&saveposs%0%1%2%3 me=1; @trigger me/ext_scrabsave[u(saveposs%0%1%2%3)][not(member(u(savedgames),ucstr(%0%1%2%3)))]=%#,ucstr(%0%1%2%3); &saveposs%0%1%2%3 me= &ext_scrabsave1 Scrabule=@pemit %0=%1 is not a valid save name. Try using just letters. &ext_scrabsave0 Scrabule=@pemit %0=%1 is not a valid save name. Try using just letters. &ext_scrabsave10 Scrabule=@pemit %0=There's already a game saved as %1. &ext_scrabsave11 Scrabule=&savedgames me=setunion(u(savedgames),%1); @dolist lnum(15)=&save%1board## me=u(board##); &save%1players me=u(players); @dolist lnum(words(u(players)))={&save%1tiles[add(##,1)] me=u(tiles[add(##,1)]); &save%1score[add(##,1)] me=u(score[add(##,1)])}; &save%1currturn me=u(currturn); &save%1tilebag me=u(tilebag); @emit Scrabule game saved as %1. &cmd_scrabload Scrabule=$scrabload ???*:@trigger me/ext_scrabload[gt(member(u(savedgames),ucstr(%0%1%2%3)),0)][gt(member(u(save%0%1%2%3players),%#),0)]=%#,ucstr(%0%1%2%3) &ext_scrabload00 Scrabule=@pemit %0=There is no game saved as %1. &ext_scrabload01 Scrabule=@pemit %0=There is no game saved as %1. &ext_scrabload10 Scrabule=@pemit %0=You can't load game %1, as you're not one of its players. &ext_scrabload11 Scrabule=@dolist lnum(15)=&board## me=u(save%1board##); &players me=u(save%1players); @dolist lnum(words(u(save%1players)))={&tiles[add(##,1)] me=u(save%1tiles[add(##,1)]); &score[add(##,1)] me=u(save%1score[add(##,1)])}; &currturn me=u(save%1currturn); &tilebag me=u(save%1tilebag); &lastscore me=; &consecutivepasses me=; @emit Scrabule game %1 loaded. &cmd_scrablist Scrabule=$scrablist:@pemit %#=----Saved Scrabule games----[iter(u(savedgames),%r## - [u(fn_scrablist,##)])]%r---------------------------- &fn_scrablist Scrabule=[iter(u(save%0players),name(##))] &cmd_scrabdelete Scrabule=$scrabdelete ???*:@trigger me/ext_scrabdelete[gt(member(u(savedgames),ucstr(%0%1%2%3)),0)][or(member(u(save%0%1%2%3players),%#),strmatch(owner(me),%#))]=%#,ucstr(%0%1%2%3) &ext_scrabdelete00 Scrabule=@pemit %0=There is no game saved as %1. &ext_scrabdelete01 Scrabule=@pemit %0=There is no game saved as %1. &ext_scrabdelete10 Scrabule=@pemit %0=You can't delete game %1, as you're not one of its players. &ext_scrabdelete11 Scrabule=&savedgames me=setdiff(u(savedgames),%1); @dolist lnum(15)=@wipe me/save%1board*; @wipe me/save%1tile*; @wipe me/save%1score*; @wipe me/save%1currturn; @wipe me/save%1players; @pemit %0=Scrabule game %1 deleted.