Intel sponsors gamedev.net search:   
Tesseract's Game Development JournalBy Tesseract      

How I Work
Preferred Language
Actionscript 3
Development Environment
Notepad++ for coding
Flex 3 SDK for compiling
Graphics
The GIMP, among others

See my personal weblog

Completed (and published) Flash Game Projects:
Games
TriGavoid
Tutorials
Creating Textures with Perlin Noise
Simple Trigonometry and Curves Tutorial



Tuesday, January 9, 2007
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.

Comments: 0 - Leave a Comment

Link



Monday, January 1, 2007
Here is the code for the Mersenne Twister class I use to generate seeded pseudo-random numbers.

/*
   A C-program for MT19937, with initialization improved 2002/1/26.
   Coded by Takuji Nishimura and Makoto Matsumoto.

   Before using, initialize the state by using init_genrand(seed)
   or init_by_array(init_key, key_length).

   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

     1. Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.

     2. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.

     3. The names of its contributors may not be used to endorse or promote
        products derived from this software without specific prior written
        permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


   Any feedback is very welcome.
   http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
   email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)

	 -------------------

	 Converted to Actionscript 2006 by John Winkelman
	 Feedback welcome at john@eccesignum.org
*/


/* Period parameters */
class MersenneTwister {
	private var N:Number = 624;
	private var M:Number = 397;
	private var MATRIX_A:Number = 0x9908b0df;   /* constant vector a */
	private var UPPER_MASK:Number = 0x80000000; /* most significant w-r bits */
	private var LOWER_MASK:Number = 0x7fffffff; /* least significant r bits */

	private var mt:Array; /* the array for the state vector  */
	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 number, number of values to return ,max size of returned number
		seed = $seed;
		returnLength = $returnLength;
		maxSize = $maxSize;
		mt = new Array();

		returnArray = [];

		mti = N+1; /* mti==N+1 means mt[N] is not initialized */
		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;
		}
		//returnArray.sort(16);
		//trace(returnArray);
		/*
		trace("\n1000 outputs of genrand_real2()\n");
		for (i=0; i<returnLength; i++) {
		  trace(" " + genrand_real2());
		  if (i%5==4) trace("\n");
		}
		*/
		return returnArray;

	}


	/* initializes mt[N] with a seed */
	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;
			/* for >32 bit machines */
		}
	}

	/* initialize by an array with array-length */
	/* init_key is the array for initializing keys */
	/* key_length is its length */
	/* slight change for C++, 2004/2/26 */
	//	void init_by_array(unsigned long init_key[], int key_length)

	private function init_by_array($seedArray:Array,$seedArrayLength:Number){
		var i = 1;
		var j = 0;
		init_genrand(seed);
		//init_genrand(19650218);
		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; /* non linear */
			mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
			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; /* non linear */
			mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
			i++;
			if (i>=N) {
				mt[0] = mt[N-1];
				i=1;
			}
		}

		mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
	}

	/* generates a random number on [0,0xffffffff]-interval */
	private function genrand_int32():Number	{
		var y:Number;
		var mag01=[0x0, MATRIX_A];
		/* mag01[x] = x * MATRIX_A  for x=0,1 */

		if (mti >= N) { /* generate N words at one time */
			var kk:Number;

			if (mti == N+1)   /* if init_genrand() has not been called, */
				init_genrand(5489); /* a default initial seed is used */

			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++];

		/* Tempering */
		y ^= (y >> 11);
		y ^= (y << 7) & 0x9d2c5680;
		y ^= (y << 15) & 0xefc60000;
		y ^= (y >> 18);

		return y;
	}

	/* generates a random number on [0,0x7fffffff]-interval */
	private function genrand_int31():Number	{
		return (genrand_int32()>>1);
	}

	/* generates a random number on [0,1]-real-interval */
	private function genrand_real1():Number	{
		return genrand_int32()*(1.0/4294967295.0);
		/* divided by 2^32-1 */
	}

	/* generates a random number on [0,1)-real-interval */
	private function genrand_real2():Number {
		return genrand_int32()*(1.0/4294967296.0);
		/* divided by 2^32 */
	}

	/* generates a random number on (0,1)-real-interval */
	private function genrand_real3():Number	{
		return ((genrand_int32()) + 0.5)*(1.0/4294967296.0);
		/* divided by 2^32 */
	}

	/* generates a random number on [0,1) with 53-bit resolution*/
	private function genrand_res53():Number	{
		var a = genrand_int32()>>5;
		var b = genrand_int32()>>6;
		return(a*67108864.0+b)*(1.0/9007199254740992.0);
	}
	/* These real versions are due to Isaku Wada, 2002/01/09 added */
}



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!

Comments: 0 - Leave a Comment

Link


All times are ET (US)

 
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

 RSS 

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