Daniel Lepage on Sun, 17 Dec 2006 21:25:06 -0700 (MST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [s-d] dice server enhancements |
On Dec 17, 2006, at 4:50 PM, Joel Uckelman wrote: > It sounds like what you want is "text mode" and "code mode", > combined with > statefulness for the interpreter over the whole message. > > What would you think of having something which is more or less a > subset > of C or Perl, with all of the special die-rolling functions as > built-ins? I'd like that, though I'd prefer a subset of python, as I've found that it's generally easier for non-programmers to use bits of python than bits of other languages. Unfortunately, writing parsers for python is a bit tricky because of the indentation-based blocks, and the 'text mode' delimiters are probably easier to get working with clear delimiter characters. > So, you'd do this: > > {{ > if (d6 > 4) {{Wonko dies. E is trapped in limbo for {{2d3}} > ndays, and will emerge then on square ({{d20}},{{d20}}).}} > else {{Wonko survives the attack. E gains {{4d3+1d2}} experience > and finds a {{perm("Sword","Axe","Stick")[0]}} of {{perm > ("Smiting","Power","Suckiness")[0]}} > }} > > Or something like it. The default mode would be text, and each set > of braces > toggles to the opposite mode. You'd also have a positional variable > $n, > corresponding to the output of the nth invocation of code mode. Yeah, this would work. {{Wonko is trapped for {{2d3}} ndays.}} could be an expression that evaluates to the string produced by running that block through the engine; this would also allow you to do things like {{ first 1 perm({{Wonko gains {{1d6}} points.}},{{Wonko loses {{2d5}} Charm.}}, {{Wonko {{first 1 perm("Freezes","Catches Fire")}} }}) }} Incidentally, a "choice" builtin would also be handy, with "choice l" being equivalent to "first 1 perm l". > I'd drop the 'let' from assignment, so you'd have {{ x = 5 }}, like > in any > normal language. Array indices would be easy, just suffix [i] onto > any list. > > The "return" value of a code block {{ }} would be the value of the > last > expression to appear in it. I'm not sure what to do about blocks > where you > don't want a return value, e.g., where you're doing some setup. > That could > be done by having a 'silent' operator: > > {{ silent x = 5 }} > > or just by ending such blocks with an empty list: > > {{ x = 5 ; () }} You could also change the delimiters - maybe use {{! }} or {!{ }!} for silent code? > We could define functions like this: > > {{ sub foo(x,y,z) { x + y + z } }} > I drink {{ foo(d6,1,4d3) }} shots of tequilla. That'd be great. The value of a subroutine declaration is assumed to be ()? > More comments? > > (Sorry for spilling all of this stuff onto the game list, for those of > you who don't care about the minutae.) Perhaps we need a fourth list for discussing such things (spoon- technical? spoon-hacker?). -- Wonko _______________________________________________ spoon-discuss mailing list spoon-discuss@xxxxxxxxx http://lists.ellipsis.cx/mailman/listinfo/spoon-discuss