@create Bowler=10 @lock Bowler=#0&!#0 &CMD-BOWL Bowler=$+bowl:think [setq(0, rollper(add(if(setr(1, hasattr(me, BOWL-%#)), mul(sub(u(BOWL-%#), 10), 5)), div(stat_get(%#, reflexes), 5), stat_get(%#, observation), skill_get(%#, thrown weapons))))] ;@emit %n [pickrand(knocks bowls topples)] [pickrand(down over)] [spellnum(setr(3, bound(add(10, div(%q0, 5)), 0, setr(2, default(me/BOWL-%#, 10)))))] pin[switch(%q3, 1,,s)], leaving [spellnum(setr(4, sub(%q2, %q3)))]. [switch(1, and(match(%q3, 10), not(%q1)), Strike! New frame., not(%q4), [if(gte(words(u(SCORE-%#), |), 11),,Spare!)] New frame., or(%q1, not(%q4)), New frame., setq(6, 1))] ;&SCORE-%# me=[cat(setr(5, u(SCORE-%#)), [switch(1, and(match(%q4, 0), %q1), %q3 /, match(%q3, 10), 10 X, %q3)][if(or(%q1, not(%q4)), |)] )] ;@pemit %#=GAME> Th[if(t(%q6), is is, at was)] Frame [setr(7, max(1, words(%q5, |)))][switch(1, and(match(%q7, 10), t(match(extract(u(SCORE-%#), 10, 1, |), X))), . You get two more for that Strike., and(match(%q7, 10), t(match(extract(u(SCORE-%#), 10, 1, |), /))), . You get one more for that Spare., and(match(%q7, 10), %q1), . That's game.)] ; @if or(%q1, not(%q4))={@wipe me/BOWL-%# }, {&BOWL-%# me=%q4 } ;@if gte(%q3, die(1, 30))= {@pemit/contents #3329=The sound of bowling echoes up from downstairs.} @Desc Bowler=CMD: +bowl %R[setr(0, u(SCORE-%#))] = [ladd(edit(strip(%q0, /X), |, %b))] + [ladd(iter(%q0, switch(1, t(match(##, X)), edit(edit(extract(%q0, inc(#@), 1, |), X, 10), /, 10), t(match(##, /)), first(edit(edit(extract(%q0, inc(#@), 1, |), X, 10), /, 10))), |))] @Ause Bowler=@wipe me/SCORE-%# @Use Bowler=You clear your scores. &CMD-CLEAR Bowler=$+bowl/clear:@pemit %#=GAME> You clear your bowling scores. ;@wipe me/SCORE-%# ;@wipe me/BOWL-%# &FN-SCORE Bowler=[ladd(edit(strip(extract(%0, 1, 10, |), /X), |, %b))] + [ladd(iter(extract(%0, 1, 10, |), switch(1, t(match(##, X)), extract(strip(extract(%0, inc(#@), 2, |), |/X), 1, 2), t(match(##, /)), extract(strip(extract(%0, inc(#@), 1, |), |/X), 1, 1)), |))] &CMD-SCORE Bowler=$+bowl/score*:@pemit/list setr(0, setunion(%#, parse(secure(%0), locate(%#, ##, ahimnpV))))=*[center(= %n's Score =, 23, =)]* ; @dolist/delimit | [u(SCORE-%#)]|YYY=@switch ##= YYY, {@pemit/list %q0=*[center(%b[setr(0, u(FN-SCORE, u(SCORE-%#)))] = [add(first(%q0), last(%q0))]%b, 23, =)]* }, {@pemit/list %q0=[center(= Frame [mod(#@, 10)] =, 25, -)]%R%b [edit(edit(trim(extract(u(SCORE-%#), #@, 1, |)), X, [space(13)]STRIKE), /, [space(12)][if(lte(#@, 10), [space(not(match(##, 10)))]SPARE)])] } &CMD-BOWLPLUS Bowler=$+bowl *:think [setq(0, rollper(add(if(setr(1, hasattr(me, BOWL-%#)), mul(sub(u(BOWL-%#), 10), 5)), ladd(secure(%0)), div(stat_get(%#, reflexes), 5), stat_get(%#, observation), skill_get(%#, thrown weapons))))] ;@emit %n [pickrand(knocks bowls topples)] [pickrand(down over)] [spellnum(setr(3, bound(add(10, div(%q0, 5)), 0, setr(2, default(me/BOWL-%#, 10)))))] pin[switch(%q3, 1,,s)], leaving [spellnum(setr(4, sub(%q2, %q3)))]. [switch(1, and(match(%q3, 10), not(%q1)), Strike! New frame., not(%q4), [if(gte(words(u(SCORE-%#), |), 11),,Spare!)] New frame., or(%q1, not(%q4)), New frame., setq(6, 1))] ;&SCORE-%# me=[cat(setr(5, u(SCORE-%#)), [switch(1, and(match(%q4, 0), %q1), %q3 /, match(%q3, 10), 10 X, %q3)][if(or(%q1, not(%q4)), |)] )] ;@pemit %#=GAME> Th[if(t(%q6), is is, at was)] Frame [setr(7, max(1, words(%q5, |)))][switch(1, and(match(%q7, 10), t(match(extract(u(SCORE-%#), 10, 1, |), X))), . You get two more for that Strike., and(match(%q7, 10), t(match(extract(u(SCORE-%#), 10, 1, |), /))), . You get one more for that Spare., and(match(%q7, 10), %q1), . That's game.)] ; @if or(%q1, not(%q4))={@wipe me/BOWL-%# }, {&BOWL-%# me=%q4 } @set Bowler=DARK @set Bowler=INHERIT @set Bowler=SAFE @set Bowler=STICKY