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  
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?).


spoon-discuss mailing list