history

This app started as a hack of path-o-logic's RandListGen, with ideas from Jeremy Hamilton's GMEmulator.swf open source flash app. What does that mean? It means you can ask it a question, and it will provide an answer as best it can, it's a tool used for GM-less play. It also means you can put in some lists of items, and have it spit an answer back by picking an item randomly. I ended up re-writing all of the RandListGen code from scratch, but credit is due where credit is due. But, as luck would have it, the help section for table parsing on that site works for both. I'd say the tables are vaguely compatible with Bruce Gulke's TableSmith or Inspiration Pad Pro, or the tables at Abulafia. Again, credit is due where credit is due, those are all excellent programs.

Support: ranDM Solo will always work best on the latest browser. Safari is my development platform; I test major releases on the latest versions of Google Chrome, Mozilla Firefox, iOS Safari on iPhone and iPad, and a Motorola Droid X2 Android Device. If you find a bug, let me know, I can be found on Google Plus.

Features, ideas, plots, plans

bug list and bug squashing

the hard way -- black magic variables

long story short, an eval code block. for the parser to interpret it, it must be the only thing on the line. the global variable hash table / object 'variable' is yours to use for convenience. Global vars can't be deleted, but hash table / object entries can. If you understand javascript, this code block explains what's going on:


var yourjavascriptcode = somestring;
evalstring = "{eval {" + somestring + "}}";
var strip = evalstring.match(/^\{eval\s(\{.*\})\}$/,1)
eval(strip[1])

If you don't understand javascript, on the other hand, it was probably gibberish.

and this code block is just here to give you ideas...


definition
|variable varname
[tablename] or {tablename} or #diceexpr#
or... if you're going to set it later with an expr
null or "" or 1@
or... an indexed array of strings
{eval {variable["varname"]=["arrayitem0","arrayitem1","arrayitem2"];}}
or... a hash table / object
{eval {variable["varname"]={ key: "value";};}}
or... a number
{eval {variable["varname"]= 0;}}
or... a string
{eval {variable["varname"]= "value";}}
or... a table call
{eval {variable["varname"]=getrandomarrayitem('tablename');}}
or... a reductive table call
{eval {variable["varname"]=getrandomarrayitem('tablename,true');}}
or... empty a reductive table so the next call to it is full
{eval {reductive["tablename"]=[];}}
or... a dice parser function call
{eval {variable["varname"]=diceparser("1d6*1000/10f+15+30d4");}}
or... a string to send to the parser
{eval {variable["varname"]=parseresult("#3d6# [nested] tables that are [nested] are neat");}}
or... stringified JSON...
{eval {variable["varname"]=json.parse('{"result":true,"count":1}');}}
or... a modal prompt for it
{eval {variable["varname"]=prompt("type a value for variable varname:");}}
or... cut and paste your stringified JSON into a prompt...
{eval {variable["varname"]=prompt("paste your JSON here:"); variable['varname']=json.parse(variable['varname']);}}

or a run block

the result of an eval code block is stored for later reference. If you want an eval block to run every time and display new results, don't use {eval {expr}}, use {run {expr}}. Run results are evaluated every time they come up.

if you're still reading... why not?


or... a function definition (functions can't be deleted)
{eval {function MakeThisStuffUppercase(str){ return str.toUpperCase()}}
or... after we define -- and init, otherwise it didn't happen -- the function, save the results of a function call
{eval {variable["varname"]=MakeThisStuffUppercase(variable["varname"]);}}