Skip to content
Snippets Groups Projects
Commit d044ee3e authored by dg's avatar dg
Browse files

zones

git-svn-id: http://svn.net-core.org/repos/t-engine4@14 51575b47-30f0-44d4-a5cc-537603b46e54
parent 5eb93829
No related branches found
No related tags found
No related merge requests found
local Game = require "tome.class.Game"
local Game = require "mod.class.Game"
-- Global
local game = Game.new()
game:setCurrent()
return game
/**
/**
* @file SFMT.c
* @brief SIMD oriented Fast Mersenne Twister(SFMT)
*
......@@ -35,7 +35,7 @@ typedef struct W128_T w128_t;
/*--------------------------------------
FILE GLOBAL VARIABLES
internal state, index counter and flag
internal state, index counter and flag
--------------------------------------*/
/** the 128-bit internal state array */
static w128_t sfmt[N];
......@@ -75,7 +75,7 @@ inline static void swap(w128_t array[], int size);
#endif
/**
* This function simulate a 64-bit index of LITTLE ENDIAN
* This function simulate a 64-bit index of LITTLE ENDIAN
* in BIG ENDIAN machine.
*/
#ifdef ONLY64
......@@ -182,13 +182,13 @@ inline static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
lshift128(&x, a, SL2);
rshift128(&y, c, SR2);
r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> SR1) & MSK2) ^ y.u[0]
r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> SR1) & MSK2) ^ y.u[0]
^ (d->u[0] << SL1);
r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> SR1) & MSK1) ^ y.u[1]
r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> SR1) & MSK1) ^ y.u[1]
^ (d->u[1] << SL1);
r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> SR1) & MSK4) ^ y.u[2]
r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> SR1) & MSK4) ^ y.u[2]
^ (d->u[2] << SL1);
r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> SR1) & MSK3) ^ y.u[3]
r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> SR1) & MSK3) ^ y.u[3]
^ (d->u[3] << SL1);
}
#else
......@@ -199,13 +199,13 @@ inline static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
lshift128(&x, a, SL2);
rshift128(&y, c, SR2);
r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> SR1) & MSK1) ^ y.u[0]
r->u[0] = a->u[0] ^ x.u[0] ^ ((b->u[0] >> SR1) & MSK1) ^ y.u[0]
^ (d->u[0] << SL1);
r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> SR1) & MSK2) ^ y.u[1]
r->u[1] = a->u[1] ^ x.u[1] ^ ((b->u[1] >> SR1) & MSK2) ^ y.u[1]
^ (d->u[1] << SL1);
r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> SR1) & MSK3) ^ y.u[2]
r->u[2] = a->u[2] ^ x.u[2] ^ ((b->u[2] >> SR1) & MSK3) ^ y.u[2]
^ (d->u[2] << SL1);
r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> SR1) & MSK4) ^ y.u[3]
r->u[3] = a->u[3] ^ x.u[3] ^ ((b->u[3] >> SR1) & MSK4) ^ y.u[3]
^ (d->u[3] << SL1);
}
#endif
......@@ -237,7 +237,7 @@ inline static void gen_rand_all(void) {
* This function fills the user-specified array with pseudorandom
* integers.
*
* @param array an 128-bit array to be filled by pseudorandom numbers.
* @param array an 128-bit array to be filled by pseudorandom numbers.
* @param size number of 128-bit pseudorandom numbers to be generated.
*/
inline static void gen_rand_array(w128_t array[], int size) {
......@@ -392,7 +392,7 @@ inline uint32_t gen_rand32(void) {
* This function generates and returns 64-bit pseudorandom number.
* init_gen_rand or init_by_array must be called before this function.
* The function gen_rand64 should not be called after gen_rand32,
* unless an initialization is again executed.
* unless an initialization is again executed.
* @return 64-bit pseudorandom number
*/
inline uint64_t gen_rand64(void) {
......@@ -508,7 +508,7 @@ void init_gen_rand(uint32_t seed) {
psfmt32[idxof(0)] = seed;
for (i = 1; i < N32; i++) {
psfmt32[idxof(i)] = 1812433253UL * (psfmt32[idxof(i - 1)]
psfmt32[idxof(i)] = 1812433253UL * (psfmt32[idxof(i - 1)]
^ (psfmt32[idxof(i - 1)] >> 30))
+ i;
}
......@@ -547,7 +547,7 @@ void init_by_array(uint32_t init_key[], int key_length) {
} else {
count = N32;
}
r = func1(psfmt32[idxof(0)] ^ psfmt32[idxof(mid)]
r = func1(psfmt32[idxof(0)] ^ psfmt32[idxof(mid)]
^ psfmt32[idxof(N32 - 1)]);
psfmt32[idxof(mid)] += r;
r += key_length;
......@@ -556,7 +556,7 @@ void init_by_array(uint32_t init_key[], int key_length) {
i = 1;
count--;
for (i = 1, j = 0; (j < count) && (j < key_length); j++) {
r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)]
r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)]
^ psfmt32[idxof((i + N32 - 1) % N32)]);
psfmt32[idxof((i + mid) % N32)] += r;
r += init_key[j] + i;
......@@ -565,7 +565,7 @@ void init_by_array(uint32_t init_key[], int key_length) {
i = (i + 1) % N32;
}
for (; j < count; j++) {
r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)]
r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)]
^ psfmt32[idxof((i + N32 - 1) % N32)]);
psfmt32[idxof((i + mid) % N32)] += r;
r += i;
......@@ -574,7 +574,7 @@ void init_by_array(uint32_t init_key[], int key_length) {
i = (i + 1) % N32;
}
for (j = 0; j < N32; j++) {
r = func2(psfmt32[idxof(i)] + psfmt32[idxof((i + mid) % N32)]
r = func2(psfmt32[idxof(i)] + psfmt32[idxof((i + mid) % N32)]
+ psfmt32[idxof((i + N32 - 1) % N32)]);
psfmt32[idxof((i + mid) % N32)] ^= r;
r -= i;
......@@ -587,3 +587,25 @@ void init_by_array(uint32_t init_key[], int key_length) {
period_certification();
initialized = 1;
}
uint32_t rand_div(uint32_t m)
{
uint32_t r, n;
/* Hack -- simple case */
if (m <= 1) return (0);
uint32_t used = m;
used |= used >> 1;
used |= used >> 2;
used |= used >> 4;
used |= used >> 8;
used |= used >> 16;
// Draw numbers until one is found in [0,n]
do r = gen_rand32() & used; // toss unused bits to shorten search
while( r >= m );
/* Use the value */
return (r);
}
/**
* @file SFMT.h
/**
* @file SFMT.h
*
* @brief SIMD oriented Fast Mersenne Twister(SFMT) pseudorandom
* number generator
......@@ -18,7 +18,7 @@
* and you have to define PRIu64 and PRIx64 in this file as follows:
* @verbatim
typedef unsigned int uint32_t
typedef unsigned long long uint64_t
typedef unsigned long long uint64_t
#define PRIu64 "llu"
#define PRIx64 "llx"
@endverbatim
......@@ -65,13 +65,14 @@ void init_by_array(uint32_t init_key[], int key_length);
char *get_idstring(void);
int get_min_array_size32(void);
int get_min_array_size64(void);
uint32_t rand_div(uint32_t m);
/* These real versions are due to Isaku Wada */
/** generates a random number on [0,1]-real-interval */
inline static double to_real1(uint32_t v)
{
return v * (1.0/4294967295.0);
/* divided by 2^32-1 */
return v * (1.0/4294967295.0);
/* divided by 2^32-1 */
}
/** generates a random number on [0,1]-real-interval */
......@@ -83,7 +84,7 @@ inline static double genrand_real1(void)
/** generates a random number on [0,1)-real-interval */
inline static double to_real2(uint32_t v)
{
return v * (1.0/4294967296.0);
return v * (1.0/4294967296.0);
/* divided by 2^32 */
}
......@@ -96,7 +97,7 @@ inline static double genrand_real2(void)
/** generates a random number on (0,1)-real-interval */
inline static double to_real3(uint32_t v)
{
return (((double)v) + 0.5)*(1.0/4294967296.0);
return (((double)v) + 0.5)*(1.0/4294967296.0);
/* divided by 2^32 */
}
......@@ -108,14 +109,14 @@ inline static double genrand_real3(void)
/** These real versions are due to Isaku Wada */
/** generates a random number on [0,1) with 53-bit resolution*/
inline static double to_res53(uint64_t v)
{
inline static double to_res53(uint64_t v)
{
return v * (1.0/18446744073709551616.0L);
}
/** generates a random number on [0,1) with 53-bit resolution*/
inline static double genrand_res53(void)
{
inline static double genrand_res53(void)
{
return to_res53(gen_rand64());
}
}
#endif
......@@ -6,6 +6,7 @@
#include "types.h"
#include "script.h"
#include "display.h"
#include "SFMT.h"
#include "sge.h"
#include <SDL_ttf.h>
......@@ -393,6 +394,65 @@ static const struct luaL_reg sdl_font_reg[] =
{NULL, NULL},
};
/******************************************************************
******************************************************************
* RNG *
******************************************************************
******************************************************************/
static int rng_dice(lua_State *L)
{
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int i, res = 0;
for (i = 0; i < x; i++)
res += 1 + rand_div(y);
lua_pushnumber(L, res);
return 1;
}
static int rng_range(lua_State *L)
{
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
lua_pushnumber(L, x + rand_div(1 + y - x));
return 1;
}
static int rng_call(lua_State *L)
{
int x = luaL_checknumber(L, 1);
lua_pushnumber(L, rand_div(x));
return 1;
}
static int rng_seed(lua_State *L)
{
int seed = luaL_checknumber(L, 1);
if (seed>=0)
init_gen_rand(seed);
else
init_gen_rand(time(NULL));
return 0;
}
static int rng_chance(lua_State *L)
{
int x = luaL_checknumber(L, 1);
lua_pushboolean(L, rand_div(x) == 0);
return 1;
}
static const struct luaL_reg rnglib[] =
{
{"__call", rng_call},
{"range", rng_range},
{"dice", rng_dice},
{"seed", rng_seed},
{"chance", rng_chance},
{NULL, NULL},
};
int luaopen_core(lua_State *L)
{
auxiliar_newclass(L, "fov{core}", fov_reg);
......@@ -403,5 +463,6 @@ int luaopen_core(lua_State *L)
luaL_openlib(L, "core.mouse", mouselib, 0);
luaL_openlib(L, "core.key", keylib, 0);
luaL_openlib(L, "core.game", gamelib, 0);
luaL_openlib(L, "rng", rnglib, 0);
return 1;
}
......@@ -7,6 +7,7 @@
#include "lauxlib.h"
#include "lualib.h"
#include "fov/fov.h"
#include "SFMT.h"
#include "sge.h"
#include "types.h"
......@@ -121,10 +122,14 @@ static int docall (lua_State *L, int narg, int clear) {
*/
int run(int argc, char *argv[])
{
// RNG init
init_gen_rand(time(NULL));
/***************** Physfs Init *****************/
PHYSFS_init(argv[0]);
PHYSFS_mount("game/", "/", 1);
PHYSFS_mount("game/modules/tome", "/tome", 1);
PHYSFS_mount("game/modules/tome", "/mod", 1);
PHYSFS_mount("game/modules/tome/data", "/data", 1);
/***************** Lua Init *****************/
L = lua_open(); /* create state */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment