diff --git a/src/conf.c b/src/conf.c new file mode 100644 index 0000000..4214737 --- /dev/null +++ b/src/conf.c @@ -0,0 +1,141 @@ +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" + +#include "main.h" +#include "log.h" +#include "player.h" +#include "opengl.h" +#include "conf.h" + +#define conf_loadInt(n,i) \ +lua_getglobal(L,n); \ +if(lua_isnumber(L, -1)) { \ + i = (int)lua_tonumber(L, -1); \ + lua_remove(L, -1); \ +} + +#define conf_loadBool(n,b) \ +lua_getglobal(L,n); \ +if(lua_isnumber(L, -1)) \ + if((int)lua_tonumber(L, -1) == 1) { \ + b = 1; \ + lua_remove(L, -1); \ + } \ + +#define conf_loadString(n,s) \ +lua_getglobal(L,n); \ +if(lua_isstring(L, -1)) { \ + s = strdup((char*)lua_tostring(L, -1)); \ + lua_remove(L, -1); \ +} + +// Some crap from main. +extern int show_fps; +extern int max_fps; +extern int indjoystick; +extern char* namjoystick; +// From player.c +extern const char* keybindNames[]; // Keybindings. + +// Set the default configuration. +void conf_setDefaults(void) { + // Global. + data = DATA_DEF; + // GL. + gl_screen.w = 800; + gl_screen.h = 640; + gl_screen.fullscreen = 0; + // Joystick. + indjoystick = -1; + namjoystick = NULL; + // Input. + input_setDefault(); +} + +// Ok.. Parse a config file plox. +int conf_loadConfig(const char* file) { + int i; + + lua_State* L = luaL_newstate(); + if(luaL_dofile(L, file) == 0) { + // Conf file exists indeed. + // Global. + conf_loadString("data", data); + + // OpenGL properties.. + conf_loadInt("width", gl_screen.w); + conf_loadInt("height", gl_screen.h); + conf_loadBool("fullscreen", gl_screen.fullscreen); + conf_loadBool("showfps", show_fps); + conf_loadInt("maxfps", max_fps); + + // Joystick. + lua_getglobal(L, "joystick"); + if(lua_isnumber(L, -1)) { + indjoystick = (int)lua_tonumber(L, -1); + lua_remove(L, -1); + } + else if(lua_isstring(L, -1)) { + namjoystick = strdup((char*)lua_tostring(L, -1)); + lua_remove(L, -1); + } + + // If there are any keybindings. Grab them. + char* str; + int type, key, reverse; + for(i = 0; strcmp(keybindNames[i], "end"); i++) { + lua_getglobal(L, keybindNames[i]); + str = NULL; + key = -1; + reverse = 0; + if(lua_istable(L, -1)) { + // It's a gawd damn table!! + lua_pushstring(L, "type"); + lua_gettable(L, -2); + if(lua_isstring(L, -1)) + str = (char*)lua_tostring(L, -1); + + // Get the key. + lua_pushstring(L, "key"); + lua_gettable(L, -3); + if(lua_isnumber(L, -1)) + key = (int)lua_tonumber(L, -1); + + // Is it reversed? Only used for axis. + lua_pushstring(L, "reverse"); + lua_gettable(L, -4); + if(lua_isnumber(L, -1)) + reverse = 1; + + if(key != -1 && str != NULL) { + // Then the keybind is valid. Get the type. + if(strcmp(str, "null")==0) type = KEYBIND_NULL; + else if(strcmp(str, "keyboard")==0) type = KEYBIND_KEYBOARD; + else if(strcmp(str, "jaxis")==0) type = KEYBIND_JAXIS; + else if(strcmp(str, "jbutton")==0) type = KEYBIND_JBUTTON; + else { + WARN("Unknown keybinding of type %s", str); + continue; + } + // Set the keybind. + input_setKeybind((char*)keybindNames[i], type, key, reverse); + } else + WARN("Malformed keybind in %s", file); + + // Clean up after table crap. + lua_remove(L,-1); + lua_remove(L,-1); + lua_remove(L,-1); + lua_remove(L,-1); + } + } + } else { + // Failed to load the config file.. + DEBUG("Config file '%s' not found.", file); + return 1; + } + lua_close(L); + return 0; +} + diff --git a/src/conf.h b/src/conf.h new file mode 100644 index 0000000..2c54f1e --- /dev/null +++ b/src/conf.h @@ -0,0 +1,5 @@ +#pragma once + +void conf_setDefaults(void); +int conf_loadConfig(const char* file); + diff --git a/src/main.c b/src/main.c index 3e3b0eb..701c68c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,10 @@ #include -#include -#include -#include #include #include #include #include "main.h" +#include "conf.h" #include "log.h" #include "physics.h" #include "opengl.h" @@ -28,22 +26,23 @@ #define START_DATA "../dat/start.xml" #define CONF_FILE "conf" +#define VERSION_FILE "VERSION" +#define VERSION_LEN 10 #define MINIMUM_FPS 0.5 - #define FONT_SIZE 12 -extern const char* keybindNames[]; // Keybindings. - static int quit = 0; // Primary loop. static unsigned int time = 0; // Calculate FPS and movement. +static char version[VERSION_LEN]; // Just some default crap. -#define DATA_DEF "data" // Default data pack file. #define DATA_NAME_LEN 25 // Max length of data name. char* data = NULL; char dataname[DATA_NAME_LEN]; -static int show_fps = 1; // Default - True. -static int max_fps = 0; +int show_fps = 1; // Default - True. +int max_fps = 0; +int indjoystick = -1; +char* namjoystick = NULL; // Prototypes. @@ -69,121 +68,22 @@ static void print_usage(char** argv) { } int main(int argc, char** argv) { - int i; // Print the version. - LOG(""APPNAME" v%d.%d.%d", VMAJOR, VMINOR, VREV); + snprintf(version, VERSION_LEN, "%d.%d.%d", VMAJOR, VMINOR, VREV); + LOG(" "APPNAME" v%s", version); // Initialize SDL for possible warnings. SDL_Init(0); - // Default values.. - // Global. - data = DATA_DEF; - gl_screen.w = 800; - gl_screen.h = 640; - gl_screen.fullscreen = 0; - // Joystick. - int indjoystick = -1; - char* namjoystick = NULL; - - // input. + + // Input must be initialized for config to work. input_init(); - input_setDefault(); // Call input crap from player.c - // Use Lua to parse configuration file. - lua_State* L = luaL_newstate(); - if(luaL_dofile(L, CONF_FILE) == 0) { // Conf file exists. - // Global. - lua_getglobal(L, "data"); - if(lua_isstring(L, -1)) { - data = strdup((char*)lua_tostring(L, -1)); - lua_remove(L, -1); - } - // OpenGL properties. - lua_getglobal(L, "width"); - if(lua_isnumber(L, -1)) { - gl_screen.w = (int)lua_tonumber(L, -1); - lua_remove(L, -1); - } - lua_getglobal(L, "height"); - if(lua_isnumber(L, -1)) { - gl_screen.h = (int)lua_tonumber(L, -1); - lua_remove(L, -1); - } - lua_getglobal(L, "fullscreen"); - if(lua_isnumber(L, -1)) - if((int)lua_tonumber(L, -1) == 1) { - gl_screen.fullscreen = 1; - lua_remove(L, -1); - } + // Set the default config values. + conf_setDefaults(); - lua_getglobal(L, "fps"); - if(lua_isnumber(L, -1)) { - max_fps = (int)lua_tonumber(L, -1); - lua_remove(L, -1); - } - - // Joystick. - lua_getglobal(L, "joystick"); - if(lua_isnumber(L, -1)) { - indjoystick = (int)lua_tonumber(L, -1); - lua_remove(L, -1); - } - else if(lua_isstring(L, -1)) { - namjoystick = strdup((char*)lua_tostring(L, -1)); - lua_remove(L, -1); - } - - // Grab the keybindings if there are any. - char* str; - int type, key, reverse; - for(i = 0; strcmp(keybindNames[i],"end"); i++) { - lua_getglobal(L, keybindNames[i]); - str = NULL; - key = -1; - reverse = 0; - if(lua_istable(L, -1)) { // It's a table alright. - // Get the event type. - lua_pushstring(L, "type"); - lua_gettable(L, -2); - if(lua_isstring(L, -1)) - str = (char*)lua_tostring(L, -1); - - // Get the key. - lua_pushstring(L, "key"); - lua_gettable(L, -3); - if(lua_isnumber(L, -1)) - key = (int)lua_tonumber(L, -1); - - // Is it reversed? Only useful for axis. - lua_pushstring(L, "reverse"); - lua_gettable(L, -4); - if(lua_isnumber(L, -1)) - reverse = 1; - - if(key != -1 && str != NULL) { // Keybind is valid! - // Get the type. - if(strcmp(str, "null")==0) type = KEYBIND_NULL; - else if(strcmp(str, "keyboard")==0) type = KEYBIND_KEYBOARD; - else if(strcmp(str, "jaxis")==0) type = KEYBIND_JAXIS; - else if(strcmp(str, "jbutton")==0) type = KEYBIND_JBUTTON; - else { - WARN("Unknown keybinding of type %s", str); - continue; - } - // Set the keybind. - input_setKeybind((char*)keybindNames[i], type, key, reverse); - } else WARN("Malformed keybind in %s", CONF_FILE); - - // Clean up after table stuff. - lua_remove(L, -1); - lua_remove(L, -1); - lua_remove(L, -1); - lua_remove(L, -1); - } - } - } - lua_close(L); + // Have Lua parse the config file. + conf_loadConfig(CONF_FILE); // Parse arguments. static struct option long_options[] = { @@ -409,7 +309,20 @@ static void display_fps(const double dt) { static void data_name(void) { uint32_t bufsize; - char* buf = pack_readfile(DATA, START_DATA, &bufsize); + char* buf; + + // Check the version. + buf = pack_readfile(DATA, VERSION_FILE, &bufsize); + + if(strncmp(buf, version, bufsize) != 0) { + WARN("Lephisto version and data module version differ!"); + WARN("Lephisto is v%s, data is for v%s", version, buf); + } + + free(buf); + + // Load the datafiles name. + buf = pack_readfile(DATA, START_DATA, &bufsize); xmlNodePtr node; xmlDocPtr doc = xmlParseMemory(buf, bufsize); diff --git a/src/main.h b/src/main.h index 9638db1..cc0d148 100644 --- a/src/main.h +++ b/src/main.h @@ -10,8 +10,9 @@ #define MAX(x,y) (((x)>(y))?(x):(y)) #define MIN(x,y) (((x)>(y))?(y):(x)) +#define DATA_DEF "data" // Default data packfile. extern char* data; // Modifiable datafile. -#define DATA data // Data file. +#define DATA data // Data file. // Max filename path. #ifndef PATH_MAX