Refactored config into a macro hell
This commit is contained in:
parent
de6deaca64
commit
32f7edd24e
24 changed files with 453 additions and 455 deletions
329
src/config.c
329
src/config.c
|
@ -7,181 +7,136 @@
|
|||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "global.h"
|
||||
#include "paths/native.h"
|
||||
#include "taisei_err.h"
|
||||
|
||||
ConfigEntry configdefs[] = {
|
||||
{CFGT_KEYBINDING, KEY_UP, "key_up"},
|
||||
{CFGT_KEYBINDING, KEY_DOWN, "key_down"},
|
||||
{CFGT_KEYBINDING, KEY_LEFT, "key_left"},
|
||||
{CFGT_KEYBINDING, KEY_RIGHT, "key_right"},
|
||||
static bool config_initialized = false;
|
||||
|
||||
{CFGT_KEYBINDING, KEY_FOCUS, "key_focus"},
|
||||
{CFGT_KEYBINDING, KEY_SHOT, "key_shot"},
|
||||
{CFGT_KEYBINDING, KEY_BOMB, "key_bomb"},
|
||||
CONFIGDEFS_EXPORT ConfigEntry configdefs[] = {
|
||||
#define CONFIGDEF(type,entryname,default,ufield) {type, entryname, {.ufield = default}},
|
||||
#define CONFIGDEF_KEYBINDING(id,entryname,default) CONFIGDEF(CONFIG_TYPE_KEYBINDING, entryname, default, i)
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) CONFIGDEF(CONFIG_TYPE_INT, entryname, default, i)
|
||||
#define CONFIGDEF_INT(id,entryname,default) CONFIGDEF(CONFIG_TYPE_INT, entryname, default, i)
|
||||
#define CONFIGDEF_FLOAT(id,entryname,default) CONFIGDEF(CONFIG_TYPE_FLOAT, entryname, default, f)
|
||||
#define CONFIGDEF_STRING(id,entryname,default) CONFIGDEF(CONFIG_TYPE_STRING, entryname, NULL, s)
|
||||
|
||||
{CFGT_KEYBINDING, KEY_FULLSCREEN, "key_fullscreen"},
|
||||
{CFGT_KEYBINDING, KEY_SCREENSHOT, "key_screenshot"},
|
||||
{CFGT_KEYBINDING, KEY_SKIP, "key_skip"},
|
||||
CONFIGDEFS
|
||||
{0}
|
||||
|
||||
{CFGT_KEYBINDING, KEY_IDDQD, "key_iddqd"},
|
||||
{CFGT_KEYBINDING, KEY_HAHAIWIN, "key_skipstage"},
|
||||
|
||||
{CFGT_INT, FULLSCREEN, "fullscreen"},
|
||||
{CFGT_INT, NO_SHADER, "disable_shader"},
|
||||
{CFGT_INT, NO_AUDIO, "disable_audio"},
|
||||
{CFGT_INT, NO_MUSIC, "disable_bgm"},
|
||||
{CFGT_FLOAT, SFX_VOLUME, "sfx_volume"},
|
||||
{CFGT_FLOAT, BGM_VOLUME, "bgm_volume"},
|
||||
{CFGT_INT, NO_STAGEBG, "disable_stagebg"},
|
||||
{CFGT_INT, NO_STAGEBG_FPSLIMIT, "disable_stagebg_auto_fpslimit"},
|
||||
{CFGT_INT, SAVE_RPY, "save_rpy"},
|
||||
{CFGT_INT, VID_WIDTH, "vid_width"},
|
||||
{CFGT_INT, VID_HEIGHT, "vid_height"},
|
||||
{CFGT_STRING, PLAYERNAME, "playername"},
|
||||
|
||||
{CFGT_INT, GAMEPAD_ENABLED, "gamepad_enabled"},
|
||||
{CFGT_INT, GAMEPAD_DEVICE, "gamepad_device"},
|
||||
{CFGT_INT, GAMEPAD_AXIS_UD, "gamepad_axis_ud"},
|
||||
{CFGT_INT, GAMEPAD_AXIS_LR, "gamepad_axis_lr"},
|
||||
{CFGT_FLOAT, GAMEPAD_AXIS_DEADZONE, "gamepad_axis_deadzone"},
|
||||
{CFGT_INT, GAMEPAD_AXIS_FREE, "gamepad_axis_free"},
|
||||
{CFGT_FLOAT, GAMEPAD_AXIS_UD_SENS, "gamepad_axis_ud_free_sensitivity"},
|
||||
{CFGT_FLOAT, GAMEPAD_AXIS_LR_SENS, "gamepad_axis_lr_free_sensitivity"},
|
||||
|
||||
// gamepad controls
|
||||
{CFGT_INT, GP_UP, "gamepad_key_up"},
|
||||
{CFGT_INT, GP_DOWN, "gamepad_key_down"},
|
||||
{CFGT_INT, GP_LEFT, "gamepad_key_left"},
|
||||
{CFGT_INT, GP_RIGHT, "gamepad_key_right"},
|
||||
|
||||
{CFGT_INT, GP_FOCUS, "gamepad_key_focus"},
|
||||
{CFGT_INT, GP_SHOT, "gamepad_key_shot"},
|
||||
{CFGT_INT, GP_BOMB, "gamepad_key_bomb"},
|
||||
|
||||
{CFGT_INT, GP_SKIP, "gamepad_key_skip"},
|
||||
{CFGT_INT, GP_PAUSE, "gamepad_key_pause"},
|
||||
|
||||
{CFGT_INT, VSYNC, "vsync"},
|
||||
|
||||
{0, 0, 0}
|
||||
#undef CONFIGDEF
|
||||
#undef CONFIGDEF_KEYBINDING
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
#undef CONFIGDEF_INT
|
||||
#undef CONFIGDEF_FLOAT
|
||||
#undef CONFIGDEF_STRING
|
||||
};
|
||||
|
||||
ConfigEntry* config_findentry(char *name) {
|
||||
void config_init(void) {
|
||||
if(config_initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
#define CONFIGDEF_KEYBINDING(id,entryname,default)
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default)
|
||||
#define CONFIGDEF_INT(id,entryname,default)
|
||||
#define CONFIGDEF_FLOAT(id,entryname,default)
|
||||
#define CONFIGDEF_STRING(id,entryname,default) stralloc(&configdefs[CONFIG_##id].val.s, default);
|
||||
|
||||
CONFIGDEFS
|
||||
|
||||
#undef CONFIGDEF_KEYBINDING
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
#undef CONFIGDEF_INT
|
||||
#undef CONFIGDEF_FLOAT
|
||||
#undef CONFIGDEF_STRING
|
||||
|
||||
config_initialized = true;
|
||||
}
|
||||
|
||||
void config_uninit(void) {
|
||||
for(ConfigEntry *e = configdefs; e->name; ++e) {
|
||||
if(e->type == CONFIG_TYPE_STRING && e->val.s) {
|
||||
free(e->val.s);
|
||||
e->val.s = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void config_reset(void) {
|
||||
#define CONFIGDEF(id,default,ufield) configdefs[CONFIG_##id].val.ufield = default;
|
||||
#define CONFIGDEF_KEYBINDING(id,entryname,default) CONFIGDEF(id, default, i)
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) CONFIGDEF(id, default, i)
|
||||
#define CONFIGDEF_INT(id,entryname,default) CONFIGDEF(id, default, i)
|
||||
#define CONFIGDEF_FLOAT(id,entryname,default) CONFIGDEF(id, default, f)
|
||||
#define CONFIGDEF_STRING(id,entryname,default) stralloc(&configdefs[CONFIG_##id].val.s, default);
|
||||
|
||||
CONFIGDEFS
|
||||
|
||||
#undef CONFIGDEF
|
||||
#undef CONFIGDEF_KEYBINDING
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
#undef CONFIGDEF_INT
|
||||
#undef CONFIGDEF_FLOAT
|
||||
#undef CONFIGDEF_STRING
|
||||
}
|
||||
|
||||
#ifndef CONFIG_RAWACCESS
|
||||
ConfigEntry* config_get(ConfigIndex idx) {
|
||||
assert(idx >= 0 && idx < CONFIGIDX_NUM);
|
||||
return configdefs + idx;
|
||||
}
|
||||
#endif
|
||||
|
||||
ConfigEntry* config_find_entry(char *name) {
|
||||
ConfigEntry *e = configdefs;
|
||||
do if(!strcmp(e->name, name)) return e; while((++e)->name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ConfigEntry* config_findentry_byid(int id) {
|
||||
ConfigEntry *e = configdefs;
|
||||
do if(id == e->key) return e; while((++e)->name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void config_preset(void) {
|
||||
memset(tconfig.strval, 0, sizeof(tconfig.strval));
|
||||
memset(tconfig.intval, 0, sizeof(tconfig.intval));
|
||||
memset(tconfig.fltval, 0, sizeof(tconfig.fltval));
|
||||
|
||||
tconfig.intval[KEY_UP] = SDL_SCANCODE_UP;
|
||||
tconfig.intval[KEY_DOWN] = SDL_SCANCODE_DOWN;
|
||||
tconfig.intval[KEY_LEFT] = SDL_SCANCODE_LEFT;
|
||||
tconfig.intval[KEY_RIGHT] = SDL_SCANCODE_RIGHT;
|
||||
|
||||
tconfig.intval[KEY_FOCUS] = SDL_SCANCODE_LSHIFT;
|
||||
tconfig.intval[KEY_SHOT] = SDL_SCANCODE_Z;
|
||||
tconfig.intval[KEY_BOMB] = SDL_SCANCODE_X;
|
||||
|
||||
tconfig.intval[KEY_FULLSCREEN] = SDL_SCANCODE_F11;
|
||||
tconfig.intval[KEY_SCREENSHOT] = SDL_SCANCODE_P;
|
||||
tconfig.intval[KEY_SKIP] = SDL_SCANCODE_LCTRL;
|
||||
|
||||
tconfig.intval[KEY_IDDQD] = SDL_SCANCODE_Q;
|
||||
tconfig.intval[KEY_HAHAIWIN] = SDL_SCANCODE_E;
|
||||
|
||||
tconfig.intval[FULLSCREEN] = 0;
|
||||
|
||||
tconfig.intval[NO_SHADER] = 0;
|
||||
tconfig.intval[NO_AUDIO] = 0;
|
||||
tconfig.intval[NO_MUSIC] = 0;
|
||||
tconfig.fltval[SFX_VOLUME] = 1.0;
|
||||
tconfig.fltval[BGM_VOLUME] = 1.0;
|
||||
|
||||
tconfig.intval[NO_STAGEBG] = 0;
|
||||
tconfig.intval[NO_STAGEBG_FPSLIMIT] = 40;
|
||||
|
||||
tconfig.intval[SAVE_RPY] = 2;
|
||||
|
||||
tconfig.intval[VID_WIDTH] = RESX;
|
||||
tconfig.intval[VID_HEIGHT] = RESY;
|
||||
|
||||
char *name = "Player";
|
||||
tconfig.strval[PLAYERNAME] = malloc(strlen(name)+1);
|
||||
strcpy(tconfig.strval[PLAYERNAME], name);
|
||||
|
||||
for(int o = CONFIG_GPKEY_FIRST; o <= CONFIG_GPKEY_LAST; ++o)
|
||||
tconfig.intval[o] = -1;
|
||||
|
||||
tconfig.intval[GAMEPAD_AXIS_LR] = 0;
|
||||
tconfig.intval[GAMEPAD_AXIS_UD] = 1;
|
||||
|
||||
tconfig.fltval[GAMEPAD_AXIS_UD_SENS] = 1.0;
|
||||
tconfig.fltval[GAMEPAD_AXIS_LR_SENS] = 1.0;
|
||||
|
||||
tconfig.intval[GP_FOCUS] = 0;
|
||||
tconfig.intval[GP_SHOT] = 1;
|
||||
tconfig.intval[GP_BOMB] = 2;
|
||||
tconfig.intval[GP_SKIP] = 3;
|
||||
tconfig.intval[GP_PAUSE] = 4;
|
||||
|
||||
tconfig.intval[VSYNC] = 1;
|
||||
}
|
||||
|
||||
int config_scan2key(int scan) {
|
||||
int i;
|
||||
for(i = CONFIG_KEY_FIRST; i <= CONFIG_KEY_LAST; ++i)
|
||||
if(scan == tconfig.intval[i])
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_button2gpkey(int btn) {
|
||||
int i;
|
||||
for(i = CONFIG_GPKEY_FIRST; i <= CONFIG_GPKEY_LAST; ++i)
|
||||
if(btn == tconfig.intval[i])
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following function is no less ugly than it's name...
|
||||
* The reason for this crap: config_button2gpkey maps the button ID to the first gamepad control option that's bound to the value of the button, similar to config_sym2key.
|
||||
* However, we need that in the KEY_* format to use in stuff like player and replay events.
|
||||
* So we have to transform them, somehow.
|
||||
* Since I don't think relying on the enum's layout is a better idea, here comes a dumb switch.
|
||||
*/
|
||||
|
||||
int config_gpkey2key(int gpkey) {
|
||||
switch(gpkey) {
|
||||
case GP_UP : return KEY_UP ;break;
|
||||
case GP_DOWN : return KEY_DOWN ;break;
|
||||
case GP_LEFT : return KEY_LEFT ;break;
|
||||
case GP_RIGHT : return KEY_RIGHT ;break;
|
||||
case GP_SHOT : return KEY_SHOT ;break;
|
||||
case GP_FOCUS : return KEY_FOCUS ;break;
|
||||
case GP_BOMB : return KEY_BOMB ;break;
|
||||
case GP_SKIP : return KEY_SKIP ;break;
|
||||
KeyIndex config_key_from_scancode(int scan) {
|
||||
for(int i = CONFIG_KEY_FIRST; i <= CONFIG_KEY_LAST; ++i) {
|
||||
if(configdefs[i].val.i == scan) {
|
||||
return CFGIDX_TO_KEYIDX(i);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_button2key(int btn) {
|
||||
return config_gpkey2key(config_button2gpkey(btn));
|
||||
GamepadKeyIndex config_gamepad_key_from_gamepad_button(int btn) {
|
||||
for(int i = CONFIG_GAMEPAD_KEY_FIRST; i <= CONFIG_GAMEPAD_KEY_LAST; ++i) {
|
||||
if(configdefs[i].val.i == btn) {
|
||||
return CFGIDX_TO_GPKEYIDX(i);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
KeyIndex config_key_from_gamepad_key(GamepadKeyIndex gpkey) {
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) case GAMEPAD_##id: return id;
|
||||
switch(gpkey) {
|
||||
GPKEYDEFS
|
||||
default: return -1;
|
||||
}
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
}
|
||||
|
||||
GamepadKeyIndex config_gamepad_key_from_key(KeyIndex key) {
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) case id: return GAMEPAD_##id;
|
||||
switch(key) {
|
||||
GPKEYDEFS
|
||||
default: return -1;
|
||||
}
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
}
|
||||
|
||||
KeyIndex config_key_from_gamepad_button(int btn) {
|
||||
return config_key_from_gamepad_key(config_gamepad_key_from_gamepad_button(btn));
|
||||
}
|
||||
|
||||
FILE* config_open(char *filename, char *mode) {
|
||||
|
@ -204,30 +159,6 @@ FILE* config_open(char *filename, char *mode) {
|
|||
return out;
|
||||
}
|
||||
|
||||
int config_intval_p(ConfigEntry *e) {
|
||||
return tconfig.intval[e->key];
|
||||
}
|
||||
|
||||
char* config_strval_p(ConfigEntry *e) {
|
||||
return tconfig.strval[e->key];
|
||||
}
|
||||
|
||||
float config_fltval_p(ConfigEntry *e) {
|
||||
return tconfig.fltval[e->key];
|
||||
}
|
||||
|
||||
int config_intval(char *key) {
|
||||
return config_intval_p(config_findentry(key));
|
||||
}
|
||||
|
||||
char* config_strval(char *key) {
|
||||
return config_strval_p(config_findentry(key));
|
||||
}
|
||||
|
||||
float config_fltval(char *key) {
|
||||
return config_fltval_p(config_findentry(key));
|
||||
}
|
||||
|
||||
void config_save(char *filename) {
|
||||
FILE *out = config_open(filename, "w");
|
||||
ConfigEntry *e = configdefs;
|
||||
|
@ -238,20 +169,21 @@ void config_save(char *filename) {
|
|||
fputs("# Generated by taisei\n", out);
|
||||
|
||||
do switch(e->type) {
|
||||
case CFGT_INT:
|
||||
fprintf(out, "%s = %i\n", e->name, config_intval_p(e));
|
||||
case CONFIG_TYPE_INT:
|
||||
fprintf(out, "%s = %i\n", e->name, e->val.i);
|
||||
break;
|
||||
|
||||
case CFGT_KEYBINDING:
|
||||
fprintf(out, "%s = %s\n", e->name, SDL_GetScancodeName(config_intval_p(e)));
|
||||
case CONFIG_TYPE_KEYBINDING:
|
||||
fprintf(out, "%s = %s\n", e->name, SDL_GetScancodeName(e->val.i));
|
||||
break;
|
||||
|
||||
case CFGT_STRING:
|
||||
fprintf(out, "%s = %s\n", e->name, config_strval_p(e));
|
||||
case CONFIG_TYPE_STRING:
|
||||
fprintf(out, "%s = %s\n", e->name, e->val.s);
|
||||
break;
|
||||
|
||||
case CFGT_FLOAT:
|
||||
fprintf(out, "%s = %f\n", e->name, config_fltval_p(e));
|
||||
case CONFIG_TYPE_FLOAT:
|
||||
fprintf(out, "%s = %f\n", e->name, e->val.f);
|
||||
break;
|
||||
} while((++e)->name);
|
||||
|
||||
fclose(out);
|
||||
|
@ -264,7 +196,7 @@ void config_save(char *filename) {
|
|||
#define FLOATOF(s) ((float)strtod(s, NULL))
|
||||
|
||||
void config_set(char *key, char *val) {
|
||||
ConfigEntry *e = config_findentry(key);
|
||||
ConfigEntry *e = config_find_entry(key);
|
||||
|
||||
if(!e) {
|
||||
warnx("config_set(): unknown setting '%s'", key);
|
||||
|
@ -272,29 +204,28 @@ void config_set(char *key, char *val) {
|
|||
}
|
||||
|
||||
switch(e->type) {
|
||||
case CFGT_INT:
|
||||
tconfig.intval[e->key] = INTOF(val);
|
||||
case CONFIG_TYPE_INT:
|
||||
e->val.i = INTOF(val);
|
||||
break;
|
||||
|
||||
case CFGT_KEYBINDING: {
|
||||
case CONFIG_TYPE_KEYBINDING: {
|
||||
SDL_Scancode scan = SDL_GetScancodeFromName(val);
|
||||
|
||||
if(scan == SDL_SCANCODE_UNKNOWN) {
|
||||
warnx("config_set(): unknown key '%s'", val);
|
||||
} else {
|
||||
tconfig.intval[e->key] = scan;
|
||||
e->val.i = scan;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
case CFGT_STRING:
|
||||
stralloc(&(tconfig.strval[e->key]), val);
|
||||
case CONFIG_TYPE_STRING:
|
||||
stralloc(&e->val.s, val);
|
||||
break;
|
||||
|
||||
case CFGT_FLOAT:
|
||||
tconfig.fltval[e->key] = FLOATOF(val);
|
||||
case CONFIG_TYPE_FLOAT:
|
||||
e->val.f = FLOATOF(val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -309,9 +240,11 @@ void config_load(char *filename) {
|
|||
char key[CONFIG_LOAD_BUFSIZE];
|
||||
char val[CONFIG_LOAD_BUFSIZE];
|
||||
|
||||
config_preset();
|
||||
if(!in)
|
||||
config_init();
|
||||
|
||||
if(!in) {
|
||||
return;
|
||||
}
|
||||
|
||||
while((c = fgetc(in)) != EOF) {
|
||||
if(c == '#' && !i) {
|
||||
|
|
238
src/config.h
238
src/config.h
|
@ -11,118 +11,186 @@
|
|||
|
||||
#include <SDL_keycode.h>
|
||||
|
||||
typedef struct Config {
|
||||
int intval[64];
|
||||
char* strval[64];
|
||||
float fltval[64];
|
||||
} Config;
|
||||
/*
|
||||
Define these macros, then use CONFIGDEFS to expand them all for all config entries, or KEYDEFS for just keybindings.
|
||||
Don't forget to undef them afterwards.
|
||||
Remember that the id won't have the CONFIG_ prefix, prepend it yourself if you want a ConfigIndex constant.
|
||||
*/
|
||||
|
||||
extern Config tconfig;
|
||||
// #define CONFIGDEF_KEYBINDING(id,entryname,default)
|
||||
// #define CONFIGDEF_GPKEYBINDING(id,entryname,default)
|
||||
// #define CONFIGDEF_INT(id,entryname,default)
|
||||
// #define CONFIGDEF_FLOAT(id,entryname,default)
|
||||
// #define CONFIGDEF_STRING(id,entryname,default)
|
||||
|
||||
/*
|
||||
* <Akari> IMPORTANT: When adding new controls, ALWAYS add them RIGHT AFTER the last KEY_* constant.
|
||||
* Not doing so will likely break replays! And don't forget to update CONFIG_KEY_LAST below.
|
||||
* Same goes for GP_*.
|
||||
* DO NOT REORDER KEYBINDINGS.
|
||||
*
|
||||
* The KEY_* constants are used by replays. These are formed from KEYDEFS.
|
||||
* Always add new keys at the end of KEYDEFS, never put them directly into CONFIGDEFS.
|
||||
*
|
||||
* KEYDEFS can be safely moved around within CONFIGDEFS, however.
|
||||
* Stuff in GPKEYDEFS is safe to reorder.
|
||||
*/
|
||||
|
||||
typedef enum ConfigKey {
|
||||
KEY_UP = 0,
|
||||
KEY_DOWN,
|
||||
KEY_LEFT,
|
||||
KEY_RIGHT,
|
||||
KEY_FOCUS,
|
||||
KEY_SHOT,
|
||||
KEY_BOMB,
|
||||
#define KEYDEFS \
|
||||
CONFIGDEF_KEYBINDING(KEY_UP, "key_up", SDL_SCANCODE_UP) \
|
||||
CONFIGDEF_KEYBINDING(KEY_DOWN, "key_down", SDL_SCANCODE_DOWN) \
|
||||
CONFIGDEF_KEYBINDING(KEY_LEFT, "key_left", SDL_SCANCODE_LEFT) \
|
||||
CONFIGDEF_KEYBINDING(KEY_RIGHT, "key_right", SDL_SCANCODE_RIGHT) \
|
||||
CONFIGDEF_KEYBINDING(KEY_FOCUS, "key_focus", SDL_SCANCODE_LSHIFT) \
|
||||
CONFIGDEF_KEYBINDING(KEY_SHOT, "key_shot", SDL_SCANCODE_Z) \
|
||||
CONFIGDEF_KEYBINDING(KEY_BOMB, "key_bomb", SDL_SCANCODE_X) \
|
||||
CONFIGDEF_KEYBINDING(KEY_FULLSCREEN, "key_fullscreen", SDL_SCANCODE_F11) \
|
||||
CONFIGDEF_KEYBINDING(KEY_SCREENSHOT, "key_screenshot", SDL_SCANCODE_P) \
|
||||
CONFIGDEF_KEYBINDING(KEY_SKIP, "key_skip", SDL_SCANCODE_LCTRL) \
|
||||
CONFIGDEF_KEYBINDING(KEY_IDDQD, "key_iddqd", SDL_SCANCODE_Q) \
|
||||
CONFIGDEF_KEYBINDING(KEY_HAHAIWIN, "key_skipstage", SDL_SCANCODE_E) \
|
||||
CONFIGDEF_KEYBINDING(KEY_PAUSE, "key_pause", SDL_SCANCODE_PAUSE) \
|
||||
|
||||
KEY_FULLSCREEN,
|
||||
KEY_SCREENSHOT,
|
||||
KEY_SKIP,
|
||||
|
||||
KEY_IDDQD, // must be present even without DEBUG!
|
||||
KEY_HAHAIWIN,
|
||||
#define GPKEYDEFS \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_UP, "gamepad_key_up", -1) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_DOWN, "gamepad_key_down", -1) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_LEFT, "gamepad_key_left", -1) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_RIGHT, "gamepad_key_right", -1) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_FOCUS, "gamepad_key_focus", 0) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_SHOT, "gamepad_key_shot", 1) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_BOMB, "gamepad_key_bomb", 2) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_SKIP, "gamepad_key_skip", 3) \
|
||||
CONFIGDEF_GPKEYBINDING(KEY_PAUSE, "gamepad_key_pause", 4) \
|
||||
|
||||
FULLSCREEN,
|
||||
|
||||
NO_SHADER,
|
||||
NO_AUDIO,
|
||||
NO_MUSIC,
|
||||
SFX_VOLUME,
|
||||
BGM_VOLUME,
|
||||
#define CONFIGDEFS \
|
||||
CONFIGDEF_STRING (PLAYERNAME, "playername", "Player") \
|
||||
CONFIGDEF_INT (FULLSCREEN, "fullscreen", 0) \
|
||||
CONFIGDEF_INT (VID_WIDTH, "vid_width", RESX) \
|
||||
CONFIGDEF_INT (VID_HEIGHT, "vid_height", RESY) \
|
||||
CONFIGDEF_INT (VSYNC, "vsync", 1) \
|
||||
CONFIGDEF_INT (NO_SHADER, "disable_shader", 0) \
|
||||
CONFIGDEF_INT (NO_AUDIO, "disable_audio", 0) \
|
||||
CONFIGDEF_INT (NO_MUSIC, "disable_bgm", 0) \
|
||||
CONFIGDEF_FLOAT (SFX_VOLUME, "sfx_volume", 1.0) \
|
||||
CONFIGDEF_FLOAT (BGM_VOLUME, "bgm_volume", 1.0) \
|
||||
CONFIGDEF_INT (NO_STAGEBG, "disable_stagebg", 0) \
|
||||
CONFIGDEF_INT (NO_STAGEBG_FPSLIMIT, "disable_stagebg_auto_fpslimit", 40) \
|
||||
CONFIGDEF_INT (SAVE_RPY, "save_rpy", 2) \
|
||||
KEYDEFS \
|
||||
CONFIGDEF_INT (GAMEPAD_ENABLED, "gamepad_enabled", 0) \
|
||||
CONFIGDEF_INT (GAMEPAD_DEVICE, "gamepad_device", 0) \
|
||||
CONFIGDEF_INT (GAMEPAD_AXIS_UD, "gamepad_axis_ud", 1) \
|
||||
CONFIGDEF_INT (GAMEPAD_AXIS_LR, "gamepad_axis_lr", 0) \
|
||||
CONFIGDEF_INT (GAMEPAD_AXIS_FREE, "gamepad_axis_free", 1) \
|
||||
CONFIGDEF_FLOAT (GAMEPAD_AXIS_UD_SENS, "gamepad_axis_ud_free_sensitivity", 1.0) \
|
||||
CONFIGDEF_FLOAT (GAMEPAD_AXIS_LR_SENS, "gamepad_axis_lr_free_sensitivity", 1.0) \
|
||||
CONFIGDEF_FLOAT (GAMEPAD_AXIS_DEADZONE, "gamepad_axis_deadzone", 0.0) \
|
||||
GPKEYDEFS \
|
||||
|
||||
NO_STAGEBG,
|
||||
NO_STAGEBG_FPSLIMIT,
|
||||
|
||||
SAVE_RPY,
|
||||
typedef enum ConfigIndex {
|
||||
#define CONFIGDEF(id) CONFIG_##id,
|
||||
#define CONFIGDEF_KEYBINDING(id,entryname,default) CONFIGDEF(id)
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) CONFIGDEF(GAMEPAD_##id)
|
||||
#define CONFIGDEF_INT(id,entryname,default) CONFIGDEF(id)
|
||||
#define CONFIGDEF_FLOAT(id,entryname,default) CONFIGDEF(id)
|
||||
#define CONFIGDEF_STRING(id,entryname,default) CONFIGDEF(id)
|
||||
|
||||
VID_WIDTH,
|
||||
VID_HEIGHT,
|
||||
CONFIGDEFS
|
||||
CONFIGIDX_NUM
|
||||
|
||||
PLAYERNAME,
|
||||
#undef CONFIGDEF
|
||||
#undef CONFIGDEF_KEYBINDING
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
#undef CONFIGDEF_INT
|
||||
#undef CONFIGDEF_FLOAT
|
||||
#undef CONFIGDEF_STRING
|
||||
} ConfigIndex;
|
||||
|
||||
GAMEPAD_ENABLED,
|
||||
GAMEPAD_DEVICE,
|
||||
GAMEPAD_AXIS_UD,
|
||||
GAMEPAD_AXIS_LR,
|
||||
GAMEPAD_AXIS_UD_SENS,
|
||||
GAMEPAD_AXIS_LR_SENS,
|
||||
GAMEPAD_AXIS_DEADZONE,
|
||||
GAMEPAD_AXIS_FREE,
|
||||
#define CONFIGIDX_FIRST 0
|
||||
#define CONFIGIDX_LAST (CONFIGIDX_NUM - 1)
|
||||
|
||||
// gamepad controls
|
||||
// The UDLR ones should work without adjusting - but you can assign custom buttons to them if you really need to
|
||||
GP_UP,
|
||||
GP_DOWN,
|
||||
GP_LEFT,
|
||||
GP_RIGHT,
|
||||
GP_FOCUS,
|
||||
GP_SHOT,
|
||||
GP_BOMB,
|
||||
GP_SKIP,
|
||||
GP_PAUSE,
|
||||
typedef enum KeyIndex {
|
||||
#define CONFIGDEF_KEYBINDING(id,entryname,default) id,
|
||||
|
||||
VSYNC,
|
||||
} ConfigKey;
|
||||
KEYDEFS
|
||||
KEYIDX_NUM
|
||||
|
||||
typedef enum ConfigKeyType {
|
||||
CFGT_INT,
|
||||
CFGT_STRING,
|
||||
CFGT_KEYBINDING,
|
||||
CFGT_FLOAT
|
||||
} ConfigKeyType;
|
||||
#undef CONFIGDEF_KEYBINDING
|
||||
} KeyIndex;
|
||||
|
||||
#define KEYIDX_FIRST 0
|
||||
#define KEYIDX_LAST (KEYIDX_NUM - 1)
|
||||
#define CFGIDX_TO_KEYIDX(idx) (idx - CONFIG_KEY_FIRST + KEYIDX_FIRST)
|
||||
#define KEYIDX_TO_CFGIDX(idx) (idx + CONFIG_KEY_FIRST - KEYIDX_FIRST)
|
||||
#define CONFIG_KEY_FIRST CONFIG_KEY_UP
|
||||
#define CONFIG_KEY_LAST (CONFIG_KEY_FIRST + KEYIDX_LAST - KEYIDX_FIRST)
|
||||
|
||||
typedef enum GamepadKeyIndex {
|
||||
#define CONFIGDEF_GPKEYBINDING(id,entryname,default) GAMEPAD_##id,
|
||||
|
||||
GPKEYDEFS
|
||||
GAMEPAD_KEYIDX_NUM
|
||||
|
||||
#undef CONFIGDEF_GPKEYBINDING
|
||||
} GamepadKeyIndex;
|
||||
|
||||
#define GAMEPAD_KEYIDX_FIRST 0
|
||||
#define GAMEPAD_KEYIDX_LAST (GAMEPAD_KEYIDX_NUM - 1)
|
||||
#define CFGIDX_TO_GPKEYIDX(idx) (idx - CONFIG_GAMEPAD_KEY_FIRST + GAMEPAD_KEYIDX_FIRST)
|
||||
#define GPKEYIDX_TO_CFGIDX(idx) (idx + CONFIG_GAMEPAD_KEY_FIRST - GAMEPAD_KEYIDX_FIRST)
|
||||
#define CONFIG_GAMEPAD_KEY_FIRST CONFIG_GAMEPAD_KEY_UP
|
||||
#define CONFIG_GAMEPAD_KEY_LAST (CONFIG_GAMEPAD_KEY_FIRST + GAMEPAD_KEYIDX_LAST - GAMEPAD_KEYIDX_FIRST)
|
||||
|
||||
typedef enum ConfigEntryType {
|
||||
CONFIG_TYPE_INT,
|
||||
CONFIG_TYPE_STRING,
|
||||
CONFIG_TYPE_KEYBINDING,
|
||||
CONFIG_TYPE_FLOAT
|
||||
} ConfigEntryType;
|
||||
|
||||
typedef struct ConfigEntry {
|
||||
ConfigKeyType type;
|
||||
ConfigKey key;
|
||||
ConfigEntryType type;
|
||||
char *name;
|
||||
union {
|
||||
int i;
|
||||
double f;
|
||||
char *s;
|
||||
} val;
|
||||
} ConfigEntry;
|
||||
|
||||
extern ConfigEntry configdefs[];
|
||||
Config tconfig;
|
||||
|
||||
#define CONFIG_KEY_FIRST KEY_UP
|
||||
#define CONFIG_KEY_LAST KEY_HAHAIWIN
|
||||
|
||||
#define CONFIG_GPKEY_FIRST GP_UP
|
||||
#define CONFIG_GPKEY_LAST GP_PAUSE
|
||||
|
||||
#define CONFIG_LOAD_BUFSIZE 256
|
||||
|
||||
int config_scan2key(int scan);
|
||||
int config_button2gpkey(int btn);
|
||||
int config_gpkey2key(int btn);
|
||||
int config_button2key(int btn);
|
||||
KeyIndex config_key_from_scancode(int scan);
|
||||
GamepadKeyIndex config_gamepad_key_from_gamepad_button(int btn);
|
||||
KeyIndex config_key_from_gamepad_key(GamepadKeyIndex gpkey);
|
||||
GamepadKeyIndex config_gamepad_key_from_key(KeyIndex key);
|
||||
KeyIndex config_key_from_gamepad_button(int btn);
|
||||
|
||||
void config_preset(void);
|
||||
void config_reset(void);
|
||||
void config_init(void);
|
||||
void config_uninit(void);
|
||||
void config_load(char *filename);
|
||||
void config_save(char *filename);
|
||||
ConfigEntry* config_findentry(char *name);
|
||||
ConfigEntry* config_findentry_byid(int id);
|
||||
|
||||
int config_intval(char*);
|
||||
int config_intval_p(ConfigEntry*);
|
||||
char* config_strval(char*);
|
||||
char* config_strval_p(ConfigEntry*);
|
||||
float config_fltval(char*);
|
||||
float config_fltval_p(ConfigEntry*);
|
||||
#ifndef DEBUG
|
||||
#define CONFIG_RAWACCESS
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RAWACCESS
|
||||
#define CONFIGDEFS_EXPORT
|
||||
extern ConfigEntry configdefs[];
|
||||
#define config_get(idx) (configdefs + (idx))
|
||||
#else
|
||||
#define CONFIGDEFS_EXPORT static
|
||||
ConfigEntry* config_get(ConfigIndex idx);
|
||||
#endif
|
||||
|
||||
#define config_get_int(idx) (config_get(idx)->val.i)
|
||||
#define config_get_float(idx) (config_get(idx)->val.f)
|
||||
#define config_get_str(idx) (config_get(idx)->val.s)
|
||||
|
||||
#define config_set_int(idx,val) (config_get_int(idx) = val)
|
||||
#define config_set_float(idx,val) (config_get_float(idx) = val)
|
||||
#define config_set_str(idx,val) stralloc(&config_get_str(idx), val)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -96,7 +96,7 @@ void credits_towerwall_draw(Vector pos) {
|
|||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, get_tex("stage6/towerwall")->gltex);
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
Shader *s = get_shader("tower_wall");
|
||||
glUseProgram(s->prog);
|
||||
glUniform1i(uniloc(s, "lendiv"), 2800.0 + 300.0 * sin(global.frames / 77.7));
|
||||
|
|
22
src/events.c
22
src/events.c
|
@ -46,12 +46,12 @@ void handle_events(EventHandler handler, EventFlags flags, void *arg) {
|
|||
else if(scan == SDL_SCANCODE_BACKSPACE)
|
||||
handler(E_CharErased, 0, arg);
|
||||
} else {
|
||||
if(scan == tconfig.intval[KEY_SCREENSHOT]) {
|
||||
if(scan == config_get_int(CONFIG_KEY_SCREENSHOT)) {
|
||||
take_screenshot();
|
||||
break;
|
||||
}
|
||||
|
||||
if((scan == SDL_SCANCODE_RETURN && (mod & KMOD_ALT)) || scan == tconfig.intval[KEY_FULLSCREEN]) {
|
||||
if((scan == SDL_SCANCODE_RETURN && (mod & KMOD_ALT)) || scan == config_get_int(CONFIG_KEY_FULLSCREEN)) {
|
||||
video_toggle_fullscreen();
|
||||
break;
|
||||
}
|
||||
|
@ -62,26 +62,26 @@ void handle_events(EventHandler handler, EventFlags flags, void *arg) {
|
|||
}
|
||||
|
||||
if(menu) {
|
||||
if(scan == tconfig.intval[KEY_DOWN] || scan == SDL_SCANCODE_DOWN) {
|
||||
if(scan == config_get_int(CONFIG_KEY_DOWN) || scan == SDL_SCANCODE_DOWN) {
|
||||
handler(E_CursorDown, 0, arg);
|
||||
} else if(scan == tconfig.intval[KEY_UP] || scan == SDL_SCANCODE_UP) {
|
||||
} else if(scan == config_get_int(CONFIG_KEY_UP) || scan == SDL_SCANCODE_UP) {
|
||||
handler(E_CursorUp, 0, arg);
|
||||
} else if(scan == tconfig.intval[KEY_RIGHT] || scan == SDL_SCANCODE_RIGHT) {
|
||||
} else if(scan == config_get_int(CONFIG_KEY_RIGHT) || scan == SDL_SCANCODE_RIGHT) {
|
||||
handler(E_CursorRight, 0, arg);
|
||||
} else if(scan == tconfig.intval[KEY_LEFT] || scan == SDL_SCANCODE_LEFT) {
|
||||
} else if(scan == config_get_int(CONFIG_KEY_LEFT) || scan == SDL_SCANCODE_LEFT) {
|
||||
handler(E_CursorLeft, 0, arg);
|
||||
} else if(scan == tconfig.intval[KEY_SHOT] || scan == SDL_SCANCODE_RETURN) {
|
||||
} else if(scan == config_get_int(CONFIG_KEY_SHOT) || scan == SDL_SCANCODE_RETURN) {
|
||||
handler(E_MenuAccept, 0, arg);
|
||||
} else if(scan == SDL_SCANCODE_ESCAPE || scan == tconfig.intval[KEY_BOMB]) {
|
||||
} else if(scan == config_get_int(CONFIG_KEY_BOMB) || scan == SDL_SCANCODE_ESCAPE) {
|
||||
handler(E_MenuAbort, 0, arg);
|
||||
}
|
||||
}
|
||||
|
||||
if(game && !event.key.repeat) {
|
||||
if(scan == SDL_SCANCODE_ESCAPE) {
|
||||
if(scan == config_get_int(CONFIG_KEY_PAUSE) || scan == SDL_SCANCODE_ESCAPE) {
|
||||
handler(E_Pause, 0, arg);
|
||||
} else {
|
||||
int key = config_scan2key(scan);
|
||||
int key = config_key_from_scancode(scan);
|
||||
if(key >= 0)
|
||||
handler(E_PlrKeyDown, key, arg);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ void handle_events(EventHandler handler, EventFlags flags, void *arg) {
|
|||
}
|
||||
|
||||
if(game && !event.key.repeat) {
|
||||
int key = config_scan2key(scan);
|
||||
int key = config_key_from_scancode(scan);
|
||||
if(key >= 0)
|
||||
handler(E_PlrKeyUp, key, arg);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ static struct {
|
|||
void gamepad_init(void) {
|
||||
memset(&gamepad, 0, sizeof(gamepad));
|
||||
|
||||
if(!config_intval("gamepad_enabled"))
|
||||
if(!config_get_int(CONFIG_GAMEPAD_ENABLED))
|
||||
return;
|
||||
|
||||
if(gamepad.initialized)
|
||||
|
@ -37,7 +37,7 @@ void gamepad_init(void) {
|
|||
for(i = 0; i < cnt; ++i)
|
||||
printf("%i: %s\n", i, SDL_JoystickNameForIndex(i));
|
||||
|
||||
int dev = config_intval("gamepad_device");
|
||||
int dev = config_get_int(CONFIG_GAMEPAD_DEVICE);
|
||||
if(dev < 0 || dev >= cnt) {
|
||||
warnx("gamepad_init(): device %i is not available\n", dev);
|
||||
gamepad_shutdown();
|
||||
|
@ -83,11 +83,11 @@ int gamepad_axis2gamekey(int id, int val) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_LR]) {
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_LR)) {
|
||||
return val == AXISVAL_LEFT ? KEY_LEFT : KEY_RIGHT;
|
||||
}
|
||||
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_UD]) {
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_UD)) {
|
||||
return val == AXISVAL_UP ? KEY_UP : KEY_DOWN;
|
||||
}
|
||||
|
||||
|
@ -95,31 +95,31 @@ int gamepad_axis2gamekey(int id, int val) {
|
|||
}
|
||||
|
||||
int gamepad_axis2menuevt(int id, int val) {
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_LR])
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_LR))
|
||||
return val == AXISVAL_LEFT ? E_CursorLeft : E_CursorRight;
|
||||
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_UD])
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_UD))
|
||||
return val == AXISVAL_UP ? E_CursorUp : E_CursorDown;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int gamepad_axis2gameevt(int id) {
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_LR])
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_LR))
|
||||
return E_PlrAxisLR;
|
||||
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_UD])
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_UD))
|
||||
return E_PlrAxisUD;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
float gamepad_axis_sens(int id) {
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_LR])
|
||||
return tconfig.fltval[GAMEPAD_AXIS_LR_SENS];
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_LR))
|
||||
return config_get_float(CONFIG_GAMEPAD_AXIS_LR_SENS);
|
||||
|
||||
if(id == tconfig.intval[GAMEPAD_AXIS_UD])
|
||||
return tconfig.fltval[GAMEPAD_AXIS_UD_SENS];
|
||||
if(id == config_get_int(CONFIG_GAMEPAD_AXIS_UD))
|
||||
return config_get_float(CONFIG_GAMEPAD_AXIS_UD_SENS);
|
||||
|
||||
return 1.0;
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ float gamepad_axis_sens(int id) {
|
|||
void gamepad_axis(int id, int raw, EventHandler handler, EventFlags flags, void *arg) {
|
||||
int *a = gamepad.axis;
|
||||
int val = AXISVAL(raw);
|
||||
int free = tconfig.intval[GAMEPAD_AXIS_FREE];
|
||||
int free = config_get_int(CONFIG_GAMEPAD_AXIS_FREE);
|
||||
|
||||
int menu = flags & EF_Menu;
|
||||
int game = flags & EF_Game;
|
||||
|
@ -186,8 +186,8 @@ void gamepad_button(int button, int state, EventHandler handler, EventFlags flag
|
|||
int game = flags & EF_Game;
|
||||
int gpad = flags & EF_Gamepad;
|
||||
|
||||
int gpkey = config_button2gpkey(button);
|
||||
int key = config_gpkey2key(gpkey);
|
||||
int gpkey = config_gamepad_key_from_gamepad_button(button);
|
||||
int key = config_key_from_gamepad_key(gpkey);
|
||||
|
||||
//printf("button: %i %i\n", button, state);
|
||||
//printf("gpkey: %i\n", gpkey);
|
||||
|
@ -195,11 +195,11 @@ void gamepad_button(int button, int state, EventHandler handler, EventFlags flag
|
|||
|
||||
if(state == SDL_PRESSED) {
|
||||
if(game) {
|
||||
if(gpkey == GP_PAUSE) {
|
||||
printf("should pause\n");
|
||||
if(gpkey == GAMEPAD_KEY_PAUSE) {
|
||||
handler(E_Pause, 0, arg);
|
||||
} else if(key >= 0)
|
||||
} else if(key >= 0) {
|
||||
handler(E_PlrKeyDown, key, arg);
|
||||
}
|
||||
}
|
||||
|
||||
if(menu) switch(key) {
|
||||
|
@ -227,7 +227,7 @@ void gamepad_event(SDL_Event *event, EventHandler handler, EventFlags flags, voi
|
|||
return;
|
||||
|
||||
int val;
|
||||
int sens = clamp(tconfig.fltval[GAMEPAD_AXIS_DEADZONE], 0, 1) * GAMEPAD_AXIS_RANGE;
|
||||
int sens = clamp(config_get_float(CONFIG_GAMEPAD_AXIS_DEADZONE), 0, 1) * GAMEPAD_AXIS_RANGE;
|
||||
|
||||
switch(event->type) {
|
||||
case SDL_JOYAXISMOTION:
|
||||
|
@ -250,20 +250,19 @@ char* gamepad_devicename(int id) {
|
|||
return (char*)SDL_JoystickNameForIndex(id);
|
||||
}
|
||||
|
||||
int gamepad_buttonpressed(int btn) {
|
||||
bool gamepad_buttonpressed(int btn) {
|
||||
return SDL_JoystickGetButton(gamepad.device, btn);
|
||||
}
|
||||
|
||||
int gamepad_gamekeypressed(int key) {
|
||||
bool gamepad_gamekeypressed(KeyIndex key) {
|
||||
if(!gamepad.initialized)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
// this sucks
|
||||
int i; for(i = CONFIG_GPKEY_FIRST; i <= CONFIG_GPKEY_LAST; ++i)
|
||||
if(key == config_gpkey2key(i) && gamepad_buttonpressed(tconfig.intval[i]))
|
||||
return 1;
|
||||
int gpkey = config_gamepad_key_from_key(key);
|
||||
int cfgidx = GPKEYIDX_TO_CFGIDX(gpkey);
|
||||
int button = config_get_int(cfgidx);
|
||||
|
||||
return 0;
|
||||
return gamepad_buttonpressed(button);
|
||||
}
|
||||
|
||||
void gamepad_init_bare(void) {
|
||||
|
|
|
@ -10,7 +10,9 @@
|
|||
#define GAMEPAD_H
|
||||
|
||||
#include <SDL.h>
|
||||
#include <stdbool.h>
|
||||
#include "events.h"
|
||||
#include "config.h"
|
||||
|
||||
void gamepad_init(void);
|
||||
void gamepad_shutdown(void);
|
||||
|
@ -20,8 +22,8 @@ float gamepad_axis_sens(int);
|
|||
char* gamepad_devicename(int);
|
||||
void gamepad_event(SDL_Event*, EventHandler, EventFlags, void*);
|
||||
|
||||
int gamepad_buttonpressed(int btn);
|
||||
int gamepad_gamekeypressed(int key);
|
||||
bool gamepad_buttonpressed(int btn);
|
||||
bool gamepad_gamekeypressed(KeyIndex key);
|
||||
|
||||
// shitty workaround for the options menu. Used to list devices while the gamepad subsystem is off.
|
||||
// only initializes the SDL subsystem so you can use gamepad_devicecount/gamepad_devicename.
|
||||
|
|
|
@ -265,6 +265,6 @@ void stralloc(char **dest, char *src) {
|
|||
|
||||
// Inputdevice-agnostic method of checking whether a game control is pressed.
|
||||
// ALWAYS use this instead of SDL_GetKeyState if you need it.
|
||||
bool gamekeypressed(int key) {
|
||||
return SDL_GetKeyboardState(NULL)[tconfig.intval[key]] || gamepad_gamekeypressed(key);
|
||||
bool gamekeypressed(KeyIndex key) {
|
||||
return SDL_GetKeyboardState(NULL)[config_get_int(KEYIDX_TO_CFGIDX(key))] || gamepad_gamekeypressed(key);
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ double psin(double);
|
|||
bool strendswith(char *s, char *e);
|
||||
char* difficulty_name(Difficulty diff);
|
||||
void stralloc(char **dest, char *src);
|
||||
bool gamekeypressed(int key);
|
||||
bool gamekeypressed(KeyIndex key);
|
||||
int getenvint(const char *v);
|
||||
|
||||
#define SIGN(x) ((x > 0) - (x < 0))
|
||||
|
|
|
@ -143,7 +143,7 @@ void draw_lasers(void) {
|
|||
Laser *laser;
|
||||
|
||||
for(laser = global.lasers; laser; laser = laser->next) {
|
||||
if(laser->shader && !tconfig.intval[NO_SHADER] && tgl_ext[TGLEXT_draw_instanced])
|
||||
if(laser->shader && !config_get_int(CONFIG_NO_SHADER) && tgl_ext[TGLEXT_draw_instanced])
|
||||
draw_laser_curve_instanced(laser);
|
||||
else
|
||||
draw_laser_curve(laser);
|
||||
|
|
10
src/main.c
10
src/main.c
|
@ -38,11 +38,13 @@ void taisei_shutdown(void) {
|
|||
config_save(CONFIG_FILE);
|
||||
printf("\nshutdown:\n");
|
||||
|
||||
if (!tconfig.intval[NO_AUDIO]) shutdown_sfx();
|
||||
if (!tconfig.intval[NO_MUSIC]) shutdown_bgm();
|
||||
if(!config_get_int(CONFIG_NO_AUDIO)) shutdown_sfx();
|
||||
if(!config_get_int(CONFIG_NO_MUSIC)) shutdown_bgm();
|
||||
|
||||
free_resources();
|
||||
video_shutdown();
|
||||
gamepad_shutdown();
|
||||
config_uninit();
|
||||
|
||||
SDL_Quit();
|
||||
printf("-- Good Bye.\n");
|
||||
|
@ -161,8 +163,8 @@ int main(int argc, char** argv) {
|
|||
MenuData menu;
|
||||
create_main_menu(&menu);
|
||||
printf("-- menu\n");
|
||||
set_sfx_volume(tconfig.fltval[SFX_VOLUME]);
|
||||
set_bgm_volume(tconfig.fltval[BGM_VOLUME]);
|
||||
set_sfx_volume(config_get_float(CONFIG_SFX_VOLUME));
|
||||
set_bgm_volume(config_get_float(CONFIG_BGM_VOLUME));
|
||||
start_bgm("bgm_menu");
|
||||
main_menu_loop(&menu);
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ troll2:
|
|||
}
|
||||
|
||||
if(global.replay_stage) {
|
||||
switch(tconfig.intval[SAVE_RPY]) {
|
||||
switch(config_get_int(CONFIG_SAVE_RPY)) {
|
||||
case 0: break;
|
||||
|
||||
case 1: {
|
||||
|
|
|
@ -34,7 +34,7 @@ void create_ingame_menu(MenuData *m) {
|
|||
void draw_ingame_menu_bg(float f) {
|
||||
float rad = f*IMENU_BLUR;
|
||||
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
Shader *shader = get_shader("ingame_menu");
|
||||
glUseProgram(shader->prog);
|
||||
|
|
|
@ -78,7 +78,7 @@ OptionBinding* bind_gpbinding(int cfgentry) {
|
|||
}
|
||||
|
||||
// BT_StrValue: with a half-assed "textbox"
|
||||
OptionBinding* bind_stroption(int cfgentry) {
|
||||
OptionBinding* bind_stroption(ConfigIndex cfgentry) {
|
||||
OptionBinding *bind = bind_new();
|
||||
bind->type = BT_StrValue;
|
||||
bind->configentry = cfgentry;
|
||||
|
@ -86,7 +86,7 @@ OptionBinding* bind_stroption(int cfgentry) {
|
|||
bind->valcount = 1;
|
||||
bind->values = malloc(sizeof(char*));
|
||||
*bind->values = malloc(OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
strlcpy(*bind->values, tconfig.strval[cfgentry], OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
strlcpy(*bind->values, config_get_str(cfgentry), OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
|
||||
return bind;
|
||||
}
|
||||
|
@ -210,19 +210,19 @@ bool bind_isactive(OptionBinding *b) {
|
|||
// --- Shared binding callbacks --- //
|
||||
|
||||
int bind_common_onoffget(void *b) {
|
||||
return !tconfig.intval[((OptionBinding*)b)->configentry];
|
||||
return !config_get_int(((OptionBinding*)b)->configentry);
|
||||
}
|
||||
|
||||
int bind_common_onoffset(void *b, int v) {
|
||||
return !(tconfig.intval[((OptionBinding*)b)->configentry] = !v);
|
||||
return !config_set_int(((OptionBinding*)b)->configentry, !v);
|
||||
}
|
||||
|
||||
int bind_common_onoffget_inverted(void *b) {
|
||||
return tconfig.intval[((OptionBinding*)b)->configentry];
|
||||
return config_get_int(((OptionBinding*)b)->configentry);
|
||||
}
|
||||
|
||||
int bind_common_onoffset_inverted(void *b, int v) {
|
||||
return tconfig.intval[((OptionBinding*)b)->configentry] = v;
|
||||
return config_set_int(((OptionBinding*)b)->configentry, v);
|
||||
}
|
||||
|
||||
#define bind_common_intget bind_common_onoffget_inverted
|
||||
|
@ -247,7 +247,7 @@ int bind_noaudio_set(void *b, int v) {
|
|||
if(!init_sfx(NULL, NULL)) return 1;
|
||||
|
||||
load_resources();
|
||||
set_sfx_volume(tconfig.fltval[SFX_VOLUME]);
|
||||
set_sfx_volume(config_get_float(CONFIG_SFX_VOLUME));
|
||||
}
|
||||
|
||||
return i;
|
||||
|
@ -265,7 +265,7 @@ int bind_nomusic_set(void *b, int v) {
|
|||
if(!init_bgm(NULL, NULL)) return 1;
|
||||
|
||||
load_resources();
|
||||
set_bgm_volume(tconfig.fltval[BGM_VOLUME]);
|
||||
set_bgm_volume(config_get_float(CONFIG_BGM_VOLUME));
|
||||
start_bgm("bgm_menu");
|
||||
}
|
||||
|
||||
|
@ -288,11 +288,11 @@ int bind_vsync_set(void *b, int v) {
|
|||
}
|
||||
|
||||
bool bind_stagebg_fpslimit_dependence(void) {
|
||||
return tconfig.intval[NO_STAGEBG] == 2;
|
||||
return config_get_int(CONFIG_NO_STAGEBG) == 2;
|
||||
}
|
||||
|
||||
int bind_saverpy_get(void *b) {
|
||||
int v = tconfig.intval[((OptionBinding*)b)->configentry];
|
||||
int v = config_get_int(((OptionBinding*)b)->configentry);
|
||||
|
||||
if(v > 1)
|
||||
return v;
|
||||
|
@ -301,8 +301,8 @@ int bind_saverpy_get(void *b) {
|
|||
|
||||
int bind_saverpy_set(void *b, int v) {
|
||||
if(v > 1)
|
||||
return tconfig.intval[((OptionBinding*)b)->configentry] = v;
|
||||
return !(tconfig.intval[((OptionBinding*)b)->configentry] = !v);
|
||||
return config_set_int(((OptionBinding*)b)->configentry, v);
|
||||
return !config_set_int(((OptionBinding*)b)->configentry, !v);
|
||||
}
|
||||
|
||||
// --- Creating, destroying, filling the menu --- //
|
||||
|
@ -320,10 +320,10 @@ void destroy_options_menu(MenuData *m) {
|
|||
if(bind->selected != -1) {
|
||||
VideoMode *m = video.modes + bind->selected;
|
||||
|
||||
video_setmode(m->width, m->height, tconfig.intval[FULLSCREEN]);
|
||||
video_setmode(m->width, m->height, config_get_int(CONFIG_FULLSCREEN));
|
||||
|
||||
tconfig.intval[VID_WIDTH] = video.intended.width;
|
||||
tconfig.intval[VID_HEIGHT] = video.intended.height;
|
||||
config_set_int(CONFIG_VID_WIDTH, video.intended.width);
|
||||
config_set_int(CONFIG_VID_HEIGHT, video.intended.height);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -358,30 +358,27 @@ void options_sub_video(MenuData *parent, void *arg) {
|
|||
);
|
||||
|
||||
add_menu_entry(m, "Fullscreen", do_nothing,
|
||||
b = bind_option(FULLSCREEN, bind_common_onoffget, bind_fullscreen_set)
|
||||
b = bind_option(CONFIG_FULLSCREEN, bind_common_onoffget, bind_fullscreen_set)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_entry(m, "Vertical synchronization", do_nothing,
|
||||
b = bind_option(VSYNC, bind_common_onoffget, bind_vsync_set)
|
||||
b = bind_option(CONFIG_VSYNC, bind_common_onoffget, bind_vsync_set)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Shaders", do_nothing,
|
||||
b = bind_option(NO_SHADER, bind_common_onoffget_inverted,
|
||||
bind_noshader_set)
|
||||
b = bind_option(CONFIG_NO_SHADER, bind_common_onoffget_inverted, bind_noshader_set)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_entry(m, "Stage background", do_nothing,
|
||||
b = bind_option(NO_STAGEBG, bind_common_intget,
|
||||
bind_common_intset)
|
||||
b = bind_option(CONFIG_NO_STAGEBG, bind_common_intget, bind_common_intset)
|
||||
); bind_addvalue(b, "on");
|
||||
bind_addvalue(b, "off");
|
||||
bind_addvalue(b, "auto");
|
||||
|
||||
add_menu_entry(m, "Minimum FPS", do_nothing,
|
||||
b = bind_option(NO_STAGEBG_FPSLIMIT, bind_common_intget,
|
||||
bind_common_intset)
|
||||
b = bind_option(CONFIG_NO_STAGEBG_FPSLIMIT, bind_common_intget, bind_common_intset)
|
||||
); bind_setvaluerange(b, 20, 60);
|
||||
bind_setdependence(b, bind_stagebg_fpslimit_dependence);
|
||||
|
||||
|
@ -401,7 +398,7 @@ void bind_setvaluerange_fancy(OptionBinding *b, int ma) {
|
|||
}
|
||||
|
||||
bool gamepad_sens_depencence(void) {
|
||||
return tconfig.intval[GAMEPAD_AXIS_FREE];
|
||||
return config_get_int(CONFIG_GAMEPAD_AXIS_FREE);
|
||||
}
|
||||
|
||||
void options_sub_gamepad_controls(MenuData *parent, void *arg) {
|
||||
|
@ -411,43 +408,43 @@ void options_sub_gamepad_controls(MenuData *parent, void *arg) {
|
|||
create_options_sub(m, "Gamepad Controls");
|
||||
|
||||
add_menu_entry(m, "Fire / Accept", do_nothing,
|
||||
bind_gpbinding(GP_SHOT)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_SHOT)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Focus / Abort", do_nothing,
|
||||
bind_gpbinding(GP_FOCUS)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_FOCUS)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Bomb", do_nothing,
|
||||
bind_gpbinding(GP_BOMB)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_BOMB)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Pause", do_nothing,
|
||||
bind_gpbinding(GP_PAUSE)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_PAUSE)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Skip dialog", do_nothing,
|
||||
bind_gpbinding(GP_SKIP)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_SKIP)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Move up", do_nothing,
|
||||
bind_gpbinding(GP_UP)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_UP)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move down", do_nothing,
|
||||
bind_gpbinding(GP_DOWN)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_DOWN)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move left", do_nothing,
|
||||
bind_gpbinding(GP_LEFT)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_LEFT)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move right", do_nothing,
|
||||
bind_gpbinding(GP_RIGHT)
|
||||
bind_gpbinding(CONFIG_GAMEPAD_KEY_RIGHT)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
@ -466,11 +463,11 @@ void options_sub_gamepad(MenuData *parent, void *arg) {
|
|||
create_options_sub(m, "Gamepad Options");
|
||||
|
||||
add_menu_entry(m, "Enable Gamepad/Joystick support", do_nothing,
|
||||
b = bind_option(GAMEPAD_ENABLED, bind_common_onoffget, bind_common_onoffset)
|
||||
b = bind_option(CONFIG_GAMEPAD_ENABLED, bind_common_onoffget, bind_common_onoffset)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_entry(m, "Device", do_nothing,
|
||||
b = bind_option(GAMEPAD_DEVICE, bind_common_intget, bind_common_intset)
|
||||
b = bind_option(CONFIG_GAMEPAD_DEVICE, bind_common_intget, bind_common_intset)
|
||||
); b->displaysingle = true;
|
||||
|
||||
add_menu_separator(m);
|
||||
|
@ -493,28 +490,28 @@ void options_sub_gamepad(MenuData *parent, void *arg) {
|
|||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "The UD axis (Vertical)", do_nothing,
|
||||
b = bind_option(GAMEPAD_AXIS_UD, bind_common_intget, bind_common_intset)
|
||||
b = bind_option(CONFIG_GAMEPAD_AXIS_UD, bind_common_intget, bind_common_intset)
|
||||
); bind_setvaluerange_fancy(b, GAMEPAD_AXES-1);
|
||||
|
||||
add_menu_entry(m, "The LR axis (Horizontal)", do_nothing,
|
||||
b = bind_option(GAMEPAD_AXIS_LR, bind_common_intget, bind_common_intset)
|
||||
b = bind_option(CONFIG_GAMEPAD_AXIS_LR, bind_common_intget, bind_common_intset)
|
||||
); bind_setvaluerange_fancy(b, GAMEPAD_AXES-1);
|
||||
|
||||
add_menu_entry(m, "Axis mode", do_nothing,
|
||||
b = bind_option(GAMEPAD_AXIS_FREE, bind_common_onoffget, bind_common_onoffset)
|
||||
b = bind_option(CONFIG_GAMEPAD_AXIS_FREE, bind_common_onoffget, bind_common_onoffset)
|
||||
); bind_addvalue(b, "free");
|
||||
bind_addvalue(b, "restricted");
|
||||
|
||||
add_menu_entry(m, "UD axis sensitivity", do_nothing,
|
||||
b = bind_scale(GAMEPAD_AXIS_UD_SENS, -2, 2, 0.05)
|
||||
b = bind_scale(CONFIG_GAMEPAD_AXIS_UD_SENS, -2, 2, 0.05)
|
||||
); bind_setdependence(b, gamepad_sens_depencence);
|
||||
|
||||
add_menu_entry(m, "LR axis sensitivity", do_nothing,
|
||||
b = bind_scale(GAMEPAD_AXIS_LR_SENS, -2, 2, 0.05)
|
||||
b = bind_scale(CONFIG_GAMEPAD_AXIS_LR_SENS, -2, 2, 0.05)
|
||||
); bind_setdependence(b, gamepad_sens_depencence);
|
||||
|
||||
add_menu_entry(m, "Dead zone", do_nothing,
|
||||
b = bind_scale(GAMEPAD_AXIS_DEADZONE, 0, 1, 0.01)
|
||||
b = bind_scale(CONFIG_GAMEPAD_AXIS_DEADZONE, 0, 1, 0.01)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
@ -532,58 +529,58 @@ void options_sub_controls(MenuData *parent, void *arg) {
|
|||
create_options_sub(m, "Controls");
|
||||
|
||||
add_menu_entry(m, "Move up", do_nothing,
|
||||
bind_keybinding(KEY_UP)
|
||||
bind_keybinding(CONFIG_KEY_UP)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move down", do_nothing,
|
||||
bind_keybinding(KEY_DOWN)
|
||||
bind_keybinding(CONFIG_KEY_DOWN)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move left", do_nothing,
|
||||
bind_keybinding(KEY_LEFT)
|
||||
bind_keybinding(CONFIG_KEY_LEFT)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Move right", do_nothing,
|
||||
bind_keybinding(KEY_RIGHT)
|
||||
bind_keybinding(CONFIG_KEY_RIGHT)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Fire", do_nothing,
|
||||
bind_keybinding(KEY_SHOT)
|
||||
bind_keybinding(CONFIG_KEY_SHOT)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Focus", do_nothing,
|
||||
bind_keybinding(KEY_FOCUS)
|
||||
bind_keybinding(CONFIG_KEY_FOCUS)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Bomb", do_nothing,
|
||||
bind_keybinding(KEY_BOMB)
|
||||
bind_keybinding(CONFIG_KEY_BOMB)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Toggle fullscreen", do_nothing,
|
||||
bind_keybinding(KEY_FULLSCREEN)
|
||||
bind_keybinding(CONFIG_KEY_FULLSCREEN)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Take a screenshot", do_nothing,
|
||||
bind_keybinding(KEY_SCREENSHOT)
|
||||
bind_keybinding(CONFIG_KEY_SCREENSHOT)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Skip dialog", do_nothing,
|
||||
bind_keybinding(KEY_SKIP)
|
||||
bind_keybinding(CONFIG_KEY_SKIP)
|
||||
);
|
||||
|
||||
#ifdef DEBUG
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Toggle God mode", do_nothing,
|
||||
bind_keybinding(KEY_IDDQD)
|
||||
bind_keybinding(CONFIG_KEY_IDDQD)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Skip stage", do_nothing,
|
||||
bind_keybinding(KEY_HAHAIWIN)
|
||||
bind_keybinding(CONFIG_KEY_HAHAIWIN)
|
||||
);
|
||||
#endif
|
||||
|
||||
|
@ -602,13 +599,13 @@ void create_options_menu(MenuData *m) {
|
|||
m->context = "Options";
|
||||
|
||||
add_menu_entry(m, "Player name", do_nothing,
|
||||
b = bind_stroption(PLAYERNAME)
|
||||
b = bind_stroption(CONFIG_PLAYERNAME)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Save replays", do_nothing,
|
||||
b = bind_option(SAVE_RPY, bind_saverpy_get,
|
||||
b = bind_option(CONFIG_SAVE_RPY, bind_saverpy_get,
|
||||
bind_saverpy_set)
|
||||
); bind_addvalue(b, "on");
|
||||
bind_addvalue(b, "off");
|
||||
|
@ -617,21 +614,21 @@ void create_options_menu(MenuData *m) {
|
|||
add_menu_separator(m);
|
||||
|
||||
add_menu_entry(m, "Sound effects", do_nothing,
|
||||
b = bind_option(NO_AUDIO, bind_common_onoffget_inverted,
|
||||
b = bind_option(CONFIG_NO_AUDIO, bind_common_onoffget_inverted,
|
||||
bind_noaudio_set)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_entry(m, "SFX volume level", do_nothing,
|
||||
bind_scale_call(SFX_VOLUME, 0, 1, 0.1, set_sfx_volume)
|
||||
bind_scale_call(CONFIG_SFX_VOLUME, 0, 1, 0.1, set_sfx_volume)
|
||||
);
|
||||
|
||||
add_menu_entry(m, "Background music", do_nothing,
|
||||
b = bind_option(NO_MUSIC, bind_common_onoffget_inverted,
|
||||
b = bind_option(CONFIG_NO_MUSIC, bind_common_onoffget_inverted,
|
||||
bind_nomusic_set)
|
||||
); bind_onoff(b);
|
||||
|
||||
add_menu_entry(m, "Music volume level", do_nothing,
|
||||
bind_scale_call(BGM_VOLUME, 0, 1, 0.1, set_bgm_volume)
|
||||
bind_scale_call(CONFIG_BGM_VOLUME, 0, 1, 0.1, set_bgm_volume)
|
||||
);
|
||||
|
||||
add_menu_separator(m);
|
||||
|
@ -724,7 +721,7 @@ void draw_options_menu(MenuData *menu) {
|
|||
glColor4f(0.5, 1, 0.5, 1);
|
||||
draw_text(AL_Right, origin, 20*i, "Press a key to assign, ESC to cancel", _fonts.standard);
|
||||
} else {
|
||||
const char *txt = SDL_GetScancodeName(tconfig.intval[bind->configentry]);
|
||||
const char *txt = SDL_GetScancodeName(config_get_int(bind->configentry));
|
||||
|
||||
if(!txt || !*txt) {
|
||||
txt = "Unknown";
|
||||
|
@ -745,9 +742,9 @@ void draw_options_menu(MenuData *menu) {
|
|||
if(bind->blockinput) {
|
||||
glColor4f(0.5, 1, 0.5, 1);
|
||||
draw_text(AL_Right, origin, 20*i, "Press a button to assign, ESC to cancel", _fonts.standard);
|
||||
} else if(tconfig.intval[bind->configentry] >= 0) {
|
||||
} else if(config_get_int(bind->configentry) >= 0) {
|
||||
char tmp[32];
|
||||
snprintf(tmp, 32, "Button %i", tconfig.intval[bind->configentry] + 1);
|
||||
snprintf(tmp, 32, "Button %i", config_get_int(bind->configentry) + 1);
|
||||
draw_text(AL_Right, origin, 20*i, tmp, _fonts.standard);
|
||||
} else {
|
||||
draw_text(AL_Right, origin, 20*i, "Unbound", _fonts.standard);
|
||||
|
@ -761,7 +758,7 @@ void draw_options_menu(MenuData *menu) {
|
|||
if(strlen(*bind->values))
|
||||
draw_text(AL_Right, origin, 20*i, *bind->values, _fonts.standard);
|
||||
} else
|
||||
draw_text(AL_Right, origin, 20*i, tconfig.strval[bind->configentry], _fonts.standard);
|
||||
draw_text(AL_Right, origin, 20*i, config_get_str(bind->configentry), _fonts.standard);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -789,7 +786,7 @@ void draw_options_menu(MenuData *menu) {
|
|||
int h = 5;
|
||||
int cw = 5;
|
||||
|
||||
float val = tconfig.fltval[bind->configentry];
|
||||
float val = config_get_float(bind->configentry);
|
||||
|
||||
float ma = bind->scale_max;
|
||||
float mi = bind->scale_min;
|
||||
|
@ -843,12 +840,12 @@ void bind_input_event(EventType type, int state, void *arg) {
|
|||
|
||||
if(!esc) {
|
||||
for(int i = CONFIG_KEY_FIRST; i <= CONFIG_KEY_LAST; ++i) {
|
||||
if(tconfig.intval[i] == scan) {
|
||||
tconfig.intval[i] = tconfig.intval[b->configentry];
|
||||
if(config_get_int(i) == scan) {
|
||||
config_set_int(i, config_get_int(b->configentry));
|
||||
}
|
||||
}
|
||||
|
||||
tconfig.intval[b->configentry] = scan;
|
||||
config_set_int(b->configentry, scan);
|
||||
}
|
||||
|
||||
b->blockinput = false;
|
||||
|
@ -856,13 +853,13 @@ void bind_input_event(EventType type, int state, void *arg) {
|
|||
}
|
||||
|
||||
case E_GamepadKeyDown: {
|
||||
for(int i = CONFIG_GPKEY_FIRST; i <= CONFIG_GPKEY_LAST; ++i) {
|
||||
if(tconfig.intval[i] == scan) {
|
||||
tconfig.intval[i] = tconfig.intval[b->configentry];
|
||||
for(int i = CONFIG_GAMEPAD_KEY_FIRST; i <= CONFIG_GAMEPAD_KEY_LAST; ++i) {
|
||||
if(config_get_int(i) == scan) {
|
||||
config_set_int(i, config_get_int(b->configentry));
|
||||
}
|
||||
}
|
||||
|
||||
tconfig.intval[b->configentry] = scan;
|
||||
config_set_int(b->configentry, scan);
|
||||
b->blockinput = false;
|
||||
break;
|
||||
}
|
||||
|
@ -883,15 +880,15 @@ void bind_input_event(EventType type, int state, void *arg) {
|
|||
|
||||
case E_SubmitText: {
|
||||
if(dest != NULL && strlen(dest))
|
||||
stralloc(&(tconfig.strval[b->configentry]), dest);
|
||||
config_set_str(b->configentry, dest);
|
||||
else
|
||||
strlcpy(dest, tconfig.strval[b->configentry], OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
strlcpy(dest, config_get_str(b->configentry), OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
b->blockinput = false;
|
||||
break;
|
||||
}
|
||||
|
||||
case E_CancelText: {
|
||||
strlcpy(dest, tconfig.strval[b->configentry], OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
strlcpy(dest, config_get_str(b->configentry), OPTIONS_TEXT_INPUT_BUFSIZE);
|
||||
b->blockinput = false;
|
||||
break;
|
||||
}
|
||||
|
@ -934,9 +931,9 @@ static void options_input_event(EventType type, int state, void *arg) {
|
|||
if(bind->type == BT_IntValue || bind->type == BT_Resolution)
|
||||
bind_setprev(bind);
|
||||
else if((bind->type == BT_Scale) || (bind->type == BT_ScaleCallback)) {
|
||||
tconfig.fltval[bind->configentry] = clamp(tconfig.fltval[bind->configentry] - bind->scale_step, bind->scale_min, bind->scale_max);
|
||||
config_set_float(bind->configentry, clamp(config_get_float(bind->configentry) - bind->scale_step, bind->scale_min, bind->scale_max));
|
||||
if (bind->type == BT_ScaleCallback)
|
||||
bind->callback(tconfig.fltval[bind->configentry]);
|
||||
bind->callback(config_get_float(bind->configentry));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -947,9 +944,9 @@ static void options_input_event(EventType type, int state, void *arg) {
|
|||
if(bind->type == BT_IntValue || bind->type == BT_Resolution)
|
||||
bind_setnext(bind);
|
||||
else if((bind->type == BT_Scale) || (bind->type == BT_ScaleCallback)) {
|
||||
tconfig.fltval[bind->configentry] = clamp(tconfig.fltval[bind->configentry] + bind->scale_step, bind->scale_min, bind->scale_max);
|
||||
config_set_float(bind->configentry, clamp(config_get_float(bind->configentry) + bind->scale_step, bind->scale_min, bind->scale_max));
|
||||
if (bind->type == BT_ScaleCallback)
|
||||
bind->callback(tconfig.fltval[bind->configentry]);
|
||||
bind->callback(config_get_float(bind->configentry));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -964,7 +961,7 @@ static void options_input_event(EventType type, int state, void *arg) {
|
|||
break;
|
||||
|
||||
case BT_StrValue:
|
||||
bind->selected = strlen(tconfig.strval[bind->configentry]);
|
||||
bind->selected = strlen(config_get_str(bind->configentry));
|
||||
bind->blockinput = true;
|
||||
break;
|
||||
|
||||
|
|
|
@ -204,22 +204,22 @@ int asymptotic(Projectile *p, int t) { // v = a[0]*(a[1] + 1); a[1] -> 0
|
|||
}
|
||||
|
||||
void _ProjDraw(Projectile *proj, int t) {
|
||||
if(proj->clr != NULL && !tconfig.intval[NO_SHADER]) {
|
||||
if(proj->clr != NULL && !config_get_int(CONFIG_NO_SHADER)) {
|
||||
Shader *shader = get_shader("bullet_color");
|
||||
glUseProgram(shader->prog);
|
||||
|
||||
glUniform4fv(uniloc(shader, "color"), 1, (GLfloat *)proj->clr);
|
||||
}
|
||||
|
||||
if(proj->clr != NULL && tconfig.intval[NO_SHADER])
|
||||
if(proj->clr != NULL && config_get_int(CONFIG_NO_SHADER))
|
||||
glColor3f(0,0,0);
|
||||
|
||||
draw_texture_p(0,0, proj->tex);
|
||||
|
||||
if(proj->clr != NULL && tconfig.intval[NO_SHADER])
|
||||
if(proj->clr != NULL && config_get_int(CONFIG_NO_SHADER))
|
||||
glColor3f(1,1,1);
|
||||
|
||||
if(!tconfig.intval[NO_SHADER])
|
||||
if(!config_get_int(CONFIG_NO_SHADER))
|
||||
glUseProgram(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,10 +22,7 @@ static uint8_t replay_magic_header[] = REPLAY_MAGIC_HEADER;
|
|||
|
||||
void replay_init(Replay *rpy) {
|
||||
memset(rpy, 0, sizeof(Replay));
|
||||
|
||||
rpy->playername = malloc(strlen(tconfig.strval[PLAYERNAME]) + 1);
|
||||
strcpy(rpy->playername, tconfig.strval[PLAYERNAME]);
|
||||
|
||||
stralloc(&rpy->playername, config_get_str(CONFIG_PLAYERNAME));
|
||||
printf("replay_init(): replay initialized for writting\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ int warn_alut_error(const char *when) {
|
|||
|
||||
void unload_alut_if_needed() {
|
||||
// ALUT will be unloaded only if there are no audio AND no music enabled
|
||||
if(!tconfig.intval[NO_AUDIO] || !tconfig.intval[NO_MUSIC] || !alut_loaded) return;
|
||||
if(!config_get_int(CONFIG_NO_AUDIO) || !config_get_int(CONFIG_NO_MUSIC) || !alut_loaded) return;
|
||||
|
||||
warn_alut_error("preparing to shutdown");
|
||||
alutExit();
|
||||
|
@ -38,15 +38,15 @@ void unload_alut_if_needed() {
|
|||
|
||||
int init_alut_if_needed(int *argc, char *argv[]) {
|
||||
// ALUT will not be loaded if there are no audio AND no music enabled
|
||||
if((tconfig.intval[NO_AUDIO] && tconfig.intval[NO_MUSIC]) || alut_loaded) return 1;
|
||||
if((config_get_int(CONFIG_NO_AUDIO) && config_get_int(CONFIG_NO_MUSIC)) || alut_loaded) return 1;
|
||||
|
||||
if(!alutInit(argc, argv))
|
||||
{
|
||||
warn_alut_error("initializing");
|
||||
alutExit(); // Try to shutdown ALUT if it was partly initialized
|
||||
warn_alut_error("shutting down");
|
||||
tconfig.intval[NO_AUDIO] = 1;
|
||||
tconfig.intval[NO_MUSIC] = 1;
|
||||
config_set_int(CONFIG_NO_AUDIO, 1);
|
||||
config_set_int(CONFIG_NO_MUSIC, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -58,13 +58,13 @@ int init_alut_if_needed(int *argc, char *argv[]) {
|
|||
|
||||
int init_sfx(int *argc, char *argv[])
|
||||
{
|
||||
if (tconfig.intval[NO_AUDIO]) return 1;
|
||||
if (config_get_int(CONFIG_NO_AUDIO)) return 1;
|
||||
if (!init_alut_if_needed(argc, argv)) return 0;
|
||||
|
||||
alGenSources(SNDSRC_COUNT, resources.sndsrc);
|
||||
if(warn_alut_error("creating sfx sources"))
|
||||
{
|
||||
tconfig.intval[NO_AUDIO] = 1;
|
||||
config_set_int(CONFIG_NO_AUDIO, 1);
|
||||
unload_alut_if_needed();
|
||||
return 0;
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ void shutdown_sfx(void)
|
|||
delete_sounds();
|
||||
resources.state &= ~RS_SfxLoaded;
|
||||
}
|
||||
tconfig.intval[NO_AUDIO] = 1;
|
||||
config_set_int(CONFIG_NO_AUDIO, 1);
|
||||
unload_alut_if_needed();
|
||||
}
|
||||
|
||||
|
@ -159,7 +159,7 @@ Sound *get_snd(Sound *source, char *name) {
|
|||
|
||||
void play_sound_p(char *name, int unconditional)
|
||||
{
|
||||
if(tconfig.intval[NO_AUDIO] || global.frameskip) return;
|
||||
if(config_get_int(CONFIG_NO_AUDIO) || global.frameskip) return;
|
||||
|
||||
Sound *snd = get_snd(resources.sounds, name);
|
||||
if (snd == NULL) return;
|
||||
|
@ -193,7 +193,7 @@ void play_sound_p(char *name, int unconditional)
|
|||
|
||||
void set_sfx_volume(float gain)
|
||||
{
|
||||
if(tconfig.intval[NO_AUDIO]) return;
|
||||
if(config_get_int(CONFIG_NO_AUDIO)) return;
|
||||
printf("SFX volume: %f\n", gain);
|
||||
int i;
|
||||
for(i = 0; i < SNDSRC_COUNT; i++) {
|
||||
|
|
|
@ -23,13 +23,13 @@ char *saved_bgm;
|
|||
|
||||
int init_bgm(int *argc, char *argv[])
|
||||
{
|
||||
if (tconfig.intval[NO_MUSIC]) return 1;
|
||||
if (config_get_int(CONFIG_NO_MUSIC)) return 1;
|
||||
if (!init_alut_if_needed(argc, argv)) return 0;
|
||||
|
||||
alGenSources(1, &resources.bgmsrc);
|
||||
if(warn_alut_error("creating music sources"))
|
||||
{
|
||||
tconfig.intval[NO_MUSIC] = 1;
|
||||
config_set_int(CONFIG_NO_MUSIC, 1);
|
||||
unload_alut_if_needed();
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ void shutdown_bgm(void)
|
|||
delete_music();
|
||||
resources.state &= ~RS_BgmLoaded;
|
||||
}
|
||||
tconfig.intval[NO_MUSIC] = 1;
|
||||
config_set_int(CONFIG_NO_MUSIC, 1);
|
||||
unload_alut_if_needed();
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ Sound *load_bgm(char *filename, const char *type) {
|
|||
}
|
||||
|
||||
void start_bgm(char *name) {
|
||||
if(tconfig.intval[NO_MUSIC]) return;
|
||||
if(config_get_int(CONFIG_NO_MUSIC)) return;
|
||||
|
||||
if(!name || strcmp(name, "") == 0)
|
||||
{
|
||||
|
@ -179,7 +179,7 @@ void continue_bgm(void)
|
|||
}
|
||||
|
||||
void stop_bgm(void) {
|
||||
if (tconfig.intval[NO_MUSIC] || !current_bgm.name) return;
|
||||
if (config_get_int(CONFIG_NO_MUSIC) || !current_bgm.name) return;
|
||||
|
||||
ALint play;
|
||||
alGetSourcei(resources.bgmsrc,AL_SOURCE_STATE,&play);
|
||||
|
@ -211,7 +211,7 @@ void restore_bgm(void)
|
|||
|
||||
void set_bgm_volume(float gain)
|
||||
{
|
||||
if(tconfig.intval[NO_MUSIC]) return;
|
||||
if(config_get_int(CONFIG_NO_MUSIC)) return;
|
||||
printf("BGM volume: %f\n", gain);
|
||||
alSourcef(resources.bgmsrc,AL_GAIN, gain);
|
||||
warn_alut_error("changing gain of music source");
|
||||
|
|
|
@ -77,7 +77,7 @@ void load_resources(void) {
|
|||
resources.state |= RS_GfxLoaded;
|
||||
}
|
||||
|
||||
if(!tconfig.intval[NO_AUDIO] && !(resources.state & RS_SfxLoaded)) {
|
||||
if(!config_get_int(CONFIG_NO_AUDIO) && !(resources.state & RS_SfxLoaded)) {
|
||||
printf("- sounds:\n");
|
||||
strcpy(path, get_prefix());
|
||||
strcat(path, "sfx");
|
||||
|
@ -86,7 +86,7 @@ void load_resources(void) {
|
|||
resources.state |= RS_SfxLoaded;
|
||||
}
|
||||
|
||||
if(!tconfig.intval[NO_MUSIC] && !(resources.state & RS_BgmLoaded)) {
|
||||
if(!config_get_int(CONFIG_NO_MUSIC) && !(resources.state & RS_BgmLoaded)) {
|
||||
printf("- music:\n");
|
||||
strcpy(path, get_prefix());
|
||||
strcat(path, "bgm");
|
||||
|
@ -96,7 +96,7 @@ void load_resources(void) {
|
|||
resources.state |= RS_BgmLoaded;
|
||||
}
|
||||
|
||||
if(!tconfig.intval[NO_SHADER] && !(resources.state & RS_ShaderLoaded)) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER) && !(resources.state & RS_ShaderLoaded)) {
|
||||
printf("- shader:\n");
|
||||
strcpy(path, get_prefix());
|
||||
strcat(path, "shader");
|
||||
|
|
|
@ -274,7 +274,7 @@ int uniloc(Shader *sha, char *name) {
|
|||
Shader *get_shader(const char *name) {
|
||||
Shader *s, *res = NULL;
|
||||
|
||||
if(tconfig.intval[NO_SHADER])
|
||||
if(config_get_int(CONFIG_NO_SHADER))
|
||||
return NULL;
|
||||
|
||||
for(s = resources.shaders; s; s = s->next) {
|
||||
|
|
14
src/stage.c
14
src/stage.c
|
@ -241,7 +241,7 @@ void draw_hud(void) {
|
|||
|
||||
void stage_draw(StageInfo *info, StageRule bgdraw, ShaderRule *shaderrules, int time) {
|
||||
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, resources.fbg[0].fbo);
|
||||
glViewport(0,0,SCREEN_W,SCREEN_H);
|
||||
}
|
||||
|
@ -250,14 +250,14 @@ void stage_draw(StageInfo *info, StageRule bgdraw, ShaderRule *shaderrules, int
|
|||
glTranslatef(-(VIEWPORT_X+VIEWPORT_W/2.0), -(VIEWPORT_Y+VIEWPORT_H/2.0),0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
if(tconfig.intval[NO_STAGEBG] == 2 && global.fps.stagebg_fps < tconfig.intval[NO_STAGEBG_FPSLIMIT]
|
||||
if(config_get_int(CONFIG_NO_STAGEBG) == 2 && global.fps.stagebg_fps < config_get_int(CONFIG_NO_STAGEBG_FPSLIMIT)
|
||||
&& !global.nostagebg) {
|
||||
|
||||
printf("stage_draw(): !- Stage background has been switched off due to low frame rate. You can change that in the options.\n");
|
||||
global.nostagebg = true;
|
||||
}
|
||||
|
||||
if(tconfig.intval[NO_STAGEBG] == 1)
|
||||
if(config_get_int(CONFIG_NO_STAGEBG) == 1)
|
||||
global.nostagebg = true;
|
||||
|
||||
if(!global.nostagebg)
|
||||
|
@ -271,7 +271,7 @@ void stage_draw(StageInfo *info, StageRule bgdraw, ShaderRule *shaderrules, int
|
|||
glPushMatrix();
|
||||
glTranslatef(VIEWPORT_X,VIEWPORT_Y,0);
|
||||
|
||||
if(!tconfig.intval[NO_SHADER])
|
||||
if(!config_get_int(CONFIG_NO_SHADER))
|
||||
apply_bg_shaders(shaderrules);
|
||||
|
||||
if(global.boss) {
|
||||
|
@ -312,7 +312,7 @@ void stage_draw(StageInfo *info, StageRule bgdraw, ShaderRule *shaderrules, int
|
|||
|
||||
draw_stage_title(info);
|
||||
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
video_set_viewport();
|
||||
glPushMatrix();
|
||||
|
@ -489,7 +489,7 @@ void stage_loop(StageInfo* info, StageRule start, StageRule end, StageRule draw,
|
|||
stage_start();
|
||||
|
||||
if(global.replaymode == REPLAY_RECORD) {
|
||||
if(tconfig.intval[SAVE_RPY]) {
|
||||
if(config_get_int(CONFIG_SAVE_RPY)) {
|
||||
global.replay_stage = replay_create_stage(&global.replay, info, seed, global.diff, global.plr.points, &global.plr);
|
||||
|
||||
// make sure our player state is consistent with what goes into the replay
|
||||
|
@ -584,7 +584,7 @@ void draw_title(int t, StageInfo *info, Alignment al, int x, int y, const char *
|
|||
f = 1/35.0*i;
|
||||
}
|
||||
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
Shader *sha = get_shader("stagetitle");
|
||||
glUseProgram(sha->prog);
|
||||
glUniform1i(uniloc(sha, "trans"), 1);
|
||||
|
|
|
@ -15,7 +15,7 @@ static Stage3D bgcontext;
|
|||
|
||||
void stage2_bg_leaves_draw(Vector pos) {
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
if(!tconfig.intval[NO_SHADER])
|
||||
if(!config_get_int(CONFIG_NO_SHADER))
|
||||
glUseProgram(get_shader("alpha_depth")->prog);
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
|
@ -37,7 +37,7 @@ void stage2_bg_leaves_draw(Vector pos) {
|
|||
|
||||
glPopMatrix();
|
||||
|
||||
if(!tconfig.intval[NO_SHADER])
|
||||
if(!config_get_int(CONFIG_NO_SHADER))
|
||||
glUseProgram(0);
|
||||
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
|
|
@ -38,7 +38,7 @@ void stage5_stairs_draw(Vector pos) {
|
|||
glTranslatef(pos[0], pos[1], pos[2]);
|
||||
glScalef(300,300,300);
|
||||
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
Shader *sha = get_shader("tower_light");
|
||||
glUseProgram(sha->prog);
|
||||
glUniform3f(uniloc(sha, "lightvec"), 0, 0, 0);
|
||||
|
|
|
@ -37,7 +37,7 @@ void stage6_towerwall_draw(Vector pos) {
|
|||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, get_tex("stage6/towerwall")->gltex);
|
||||
if(!tconfig.intval[NO_SHADER]) {
|
||||
if(!config_get_int(CONFIG_NO_SHADER)) {
|
||||
Shader *s = get_shader("tower_wall");
|
||||
glUseProgram(s->prog);
|
||||
glUniform1i(uniloc(s, "lendiv"), 3000.0);
|
||||
|
@ -166,7 +166,7 @@ void stage6_start(void) {
|
|||
// bgcontext.cx[2] = 295;
|
||||
// bgcontext.crot[0] = 90;
|
||||
// bgcontext.crot[2] = 381.415100;
|
||||
//
|
||||
//
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ void video_set_viewport(void) {
|
|||
}
|
||||
|
||||
void video_update_vsync(void) {
|
||||
if(global.frameskip || !tconfig.intval[VSYNC]) {
|
||||
if(global.frameskip || !config_get_int(CONFIG_VSYNC)) {
|
||||
SDL_GL_SetSwapInterval(0);
|
||||
} else {
|
||||
if(SDL_GL_SetSwapInterval(-1) < 0) {
|
||||
|
@ -166,7 +166,7 @@ void video_init(void) {
|
|||
|
||||
if(!fullscreen_available) {
|
||||
warnx("video_init(): no available fullscreen modes");
|
||||
tconfig.intval[FULLSCREEN] = false;
|
||||
config_set_int(CONFIG_FULLSCREEN, false);
|
||||
}
|
||||
|
||||
// Then, add some common 4:3 modes for the windowed mode if they are not there yet.
|
||||
|
@ -177,7 +177,7 @@ void video_init(void) {
|
|||
// sort it, mainly for the options menu
|
||||
qsort(video.modes, video.mcount, sizeof(VideoMode), video_compare_modes);
|
||||
|
||||
video_setmode(tconfig.intval[VID_WIDTH], tconfig.intval[VID_HEIGHT], tconfig.intval[FULLSCREEN]);
|
||||
video_setmode(config_get_int(CONFIG_VID_WIDTH), config_get_int(CONFIG_VID_HEIGHT), config_get_int(CONFIG_FULLSCREEN));
|
||||
}
|
||||
|
||||
void video_shutdown(void) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue