 Thinking About the Story Engine |
Posted - 1/9/2007 1:36:32 PM | Now that I have a pretty good handle on the economy engine (which is part of the world -- kind of like the weather or physics), it is now time to begin thinking about the story engine, which will provide the overall structure for the game and allow for the creation of static or randomly generated quests.
Since my project is small I am looking at small (relative to the current crop of MMetcetera) solutions to this problem.
About a year and a half ago I dove heavily into researching interactive fiction, and discovered that someone had made some progress in creating an Interactive Fiction Markup Language based on the Inform. And while the work doesn't seem to have been updated since 2002 it does a good job of breaking down the problems inherent in creating a conditional/stateful story browser.
When I was teaching web design at Kendall College or Art and Design I would have my students write a simple "Choose your own adventure" book in HTML as a way of learning how anchor tags work. Inevitably some of the students would ask how to allow the user to carry items from one room to another, or how to keep score, or something of the like. Then I would have to explain the concept of "having state", which is the same thing as saying "having a past". In order to change to something it is necessary to have changed from something. Otherwise the change is meaningless.
Building a story engine modeled on the work done by the IF crowd makes sense to me. I won't be using the language-based toolset ("Go N"), but the rest will be quite useful.
| |
 Mersenne Twister |
Posted - 1/1/2007 9:37:48 PM | Here is the code for the Mersenne Twister class I use to generate seeded pseudo-random numbers.
class MersenneTwister {
private var N:Number = 624;
private var M:Number = 397;
private var MATRIX_A:Number = 0x9908b0df;
private var UPPER_MASK:Number = 0x80000000;
private var LOWER_MASK:Number = 0x7fffffff;
private var mt:Array;
private var mti:Number;
private var seed:Number;
private var returnLength:Number;
private var maxSize:Number;
private var returnArray:Array;
public function MersenneTwister() {
}
public function twist($seed,$returnLength,$maxSize):Array {
seed = $seed;
returnLength = $returnLength;
maxSize = $maxSize;
mt = new Array();
returnArray = [];
mti = N+1;
var i;
var initArray=(0x123, 0x234, 0x345, 0x456);
init_by_array(initArray,initArray.length);
for (i=0; i<returnLength; i++) {
returnArray[i] = genrand_int32()%maxSize;
}
return returnArray;
}
private function init_genrand($seed)
{
mt[0]= $seed & 0xffffffff;
for (mti=1; mti<N; mti++) {
mt[mti] = (1812433253 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
mt[mti] &= 0xffffffff;
}
}
private function init_by_array($seedArray:Array,$seedArrayLength:Number){
var i = 1;
var j = 0;
init_genrand(seed);
var k = (N>$seedArrayLength) ? N : $seedArrayLength;
for (k; k>0; k--) {
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525)) + $seedArray[j] + j;
mt[i] &= 0xffffffff;
i++;
j++;
if (i >= N) {
mt[0] = mt[N-1];
i=1;
}
if (j >= $seedArrayLength) j=0;
}
for (k=N-1; k; k--) {
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941)) - i;
mt[i] &= 0xffffffff;
i++;
if (i>=N) {
mt[0] = mt[N-1];
i=1;
}
}
mt[0] = 0x80000000;
}
private function genrand_int32():Number {
var y:Number;
var mag01=[0x0, MATRIX_A];
if (mti >= N) {
var kk:Number;
if (mti == N+1)
init_genrand(5489);
for (kk=0;kk<N-M;kk++) {
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
}
for (;kk<N-1;kk++) {
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
}
y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
mti = 0;
}
y = mt[mti++];
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680;
y ^= (y << 15) & 0xefc60000;
y ^= (y >> 18);
return y;
}
private function genrand_int31():Number {
return (genrand_int32()>>1);
}
private function genrand_real1():Number {
return genrand_int32()*(1.0/4294967295.0);
}
private function genrand_real2():Number {
return genrand_int32()*(1.0/4294967296.0);
}
private function genrand_real3():Number {
return ((genrand_int32()) + 0.5)*(1.0/4294967296.0);
}
private function genrand_res53():Number {
var a = genrand_int32()>>5;
var b = genrand_int32()>>6;
return(a*67108864.0+b)*(1.0/9007199254740992.0);
}
}
There is one public function: twist();, which returns an array of numbers
After the class is instantiated, call twist as follows:
twister = new MersenneTwister();
var numbers:Array = twister.twist(seed,return_length,max_size);
...where seed is the initial seed value, return_length is the number of values you wish returned form this seed, and max_size is the maximum value of each of the returned numbers.
Happy New Year!
| |
|
| S | M | T | W | T | F | S | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
OPTIONS
Track this Journal
ARCHIVES
November, 2009
March, 2009
January, 2009
November, 2008
October, 2008
September, 2008
August, 2008
July, 2008
February, 2008
December, 2007
November, 2007
October, 2007
September, 2007
July, 2007
June, 2007
March, 2007
February, 2007
January, 2007
December, 2006
August, 2006
July, 2006
June, 2006
|