Newer
Older
#include "display.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
static int traceback (lua_State *L) {
lua_Debug ar;
int n;
n = 0;
printf("Lua Error: %s\n", lua_tostring(L, 1));
while(lua_getstack(L, n++, &ar)) {
lua_getinfo(L, "nSl", &ar);
printf("\tAt %s:%d %s\n", ar.short_src, ar.currentline, ar.name?ar.name:"");
}
return 1;
}
static int docall (lua_State *L, int narg, int nret)
{
int status;
int base = lua_gettop(L) - narg; /* function index */
lua_pushcfunction(L, traceback); /* push traceback function */
lua_insert(L, base); /* put it under chunk and args */
status = lua_pcall(L, narg, nret, base);
lua_remove(L, base); /* remove traceback function */
/* force a complete garbage collection in case of errors */
if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0);
return status;
}
void display_utime()
{
struct timeval tv;
struct timezone tz;
struct tm *tm;
gettimeofday(&tv, &tz);
tm=localtime(&tv.tv_sec);
printf(" %d:%02d:%02d %d \n", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
}
// define our data that is passed to our redraw function
typedef struct {
Uint32 color;
} MainStateData;
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_keyhandler);
lua_pushstring(L, "receiveKey");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_keyhandler);
lua_pushnumber(L, event->key.keysym.sym);
lua_pushboolean(L, (event->key.keysym.mod & KMOD_CTRL) ? TRUE : FALSE);
lua_pushboolean(L, (event->key.keysym.mod & KMOD_SHIFT) ? TRUE : FALSE);
lua_pushboolean(L, (event->key.keysym.mod & KMOD_ALT) ? TRUE : FALSE);
lua_pushboolean(L, (event->key.keysym.mod & KMOD_META) ? TRUE : FALSE);
/* Convert unicode UCS-2 to UTF8 string */
if (event->key.keysym.unicode)
{
wchar_t wc = event->key.keysym.unicode;
char buf[4] = {0,0,0,0};
if (wc < 0x80)
{
buf[0] = wc;
}
else if (wc < 0x800)
{
buf[0] = (0xC0 | wc>>6);
buf[1] = (0x80 | wc & 0x3F);
}
else
{
buf[0] = (0xE0 | wc>>12);
buf[1] = (0x80 | wc>>6 & 0x3F);
buf[2] = (0x80 | wc & 0x3F);
}
lua_pushstring(L, buf);
}
else
lua_pushnil(L);
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
case SDL_MOUSEBUTTONDOWN:
if (current_mousehandler != LUA_NOREF)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
lua_pushstring(L, "receiveMouse");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, current_mousehandler);
switch (event->button.button)
{
case SDL_BUTTON_LEFT:
lua_pushstring(L, "left");
break;
case SDL_BUTTON_MIDDLE:
lua_pushstring(L, "middle");
break;
case SDL_BUTTON_RIGHT:
lua_pushstring(L, "right");
break;
case SDL_BUTTON_WHEELUP:
lua_pushstring(L, "wheelup");
break;
case SDL_BUTTON_WHEELDOWN:
lua_pushstring(L, "wheeldown");
break;
}
lua_pushnumber(L, event->button.x);
lua_pushnumber(L, event->button.y);
docall(L, 4, 0);
}
break;
lua_pushstring(L, "tick");
lua_gettable(L, -2);
lua_remove(L, -2);
lua_pushstring(L, "display");
lua_gettable(L, -2);
lua_remove(L, -2);
SDL_Flip(screen);
/* Gather our frames per second */
Frames++;
{
int t = SDL_GetTicks();
if (t - T0 >= 1000) {
float seconds = (t - T0) / 1000.0;
float fps = Frames / seconds;
printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
T0 = t;
Frames = 0;
}
}
PHYSFS_mount("game/modules/tome", "/mod", 1);
PHYSFS_mount("game/modules/tome/data", "/data", 1);
L = lua_open(); /* create state */
luaL_openlibs(L); /* open libraries */
luaopen_core(L);
Uint32 flags=SDL_INIT_VIDEO | SDL_INIT_TIMER;
if (SDL_Init (flags) < 0) {
printf("cannot initialize SDL: %s\n", SDL_GetError ());
return;
}
screen = SDL_SetVideoMode(800, 600, 32, _DEFAULT_VIDEOMODE_FLAGS_);
if (screen==NULL) {
printf("error opening screen: %s\n", SDL_GetError());
return;
}
SDL_WM_SetCaption("T4Engine", NULL);
bool done = FALSE;
SDL_Event event;
while ( !done )
{
/* handle the events in the queue */
while (SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
/* handle key presses */
on_event(&event);
break;
case SDL_QUIT:
/* handle quit requests */
done = TRUE;
break;
default:
break;
}
}
/* draw the scene */
on_redraw();
}