Consistent indentation: indent with tabs, align with spaces (#104)

I would've preferred to just go with 4-spaces for indent and no tabs,
but lao is a bit conservative about it. :^)

Still, this is a ton better than mixing different styles all over the
place, especially within the same file.
This commit is contained in:
Andrei Alexeyev 2018-01-12 20:26:07 +02:00 committed by GitHub
parent f4cd177b1a
commit 513d613387
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
117 changed files with 5415 additions and 5334 deletions

View file

@ -16,19 +16,19 @@
#define DEFAULT_SFX_VOLUME 100
typedef struct CurrentBGM {
char *name;
char *title;
int isboss;
int started_at;
Music *music;
char *name;
char *title;
int isboss;
int started_at;
Music *music;
} CurrentBGM;
extern CurrentBGM current_bgm;
typedef enum {
SNDGROUP_ALL,
SNDGROUP_MAIN,
SNDGROUP_UI,
SNDGROUP_ALL,
SNDGROUP_MAIN,
SNDGROUP_UI,
} AudioBackendSoundGroup;
void audio_backend_init(void);

View file

@ -107,10 +107,12 @@ void audio_backend_init(void) {
Mix_QuerySpec(&frequency, &format, &channels);
if(frequency != AUDIO_FREQ || format != AUDIO_FORMAT) {
log_warn( "Mixer spec doesn't match our request, "
"requested (freq=%i, fmt=%u), got (freq=%i, fmt=%u). "
"Sound may be distorted.",
AUDIO_FREQ, AUDIO_FORMAT, frequency, format);
log_warn(
"Mixer spec doesn't match our request, "
"requested (freq=%i, fmt=%u), got (freq=%i, fmt=%u). "
"Sound may be distorted.",
AUDIO_FREQ, AUDIO_FORMAT, frequency, format
);
}
log_info("Audio subsystem initialized (SDL2_Mixer)");
@ -300,9 +302,9 @@ bool audio_backend_music_set_position(double pos) {
static int translate_group(AudioBackendSoundGroup group, int defmixgroup) {
switch(group) {
case SNDGROUP_MAIN: return MAIN_CHANNEL_GROUP;
case SNDGROUP_UI: return UI_CHANNEL_GROUP;
default: return defmixgroup;
case SNDGROUP_MAIN: return MAIN_CHANNEL_GROUP;
case SNDGROUP_UI: return UI_CHANNEL_GROUP;
default: return defmixgroup;
}
}

View file

@ -24,7 +24,7 @@ typedef struct {
typedef struct MixerInternalMusic {
Mix_Music *intro;
Mix_Music *loop;
double loop_point;
double loop_point;
} MixerInternalMusic;
char* audio_mixer_sound_path(const char *prefix, const char *name, bool isbgm);

View file

@ -447,8 +447,8 @@ static void boss_give_spell_bonus(Boss *boss, Attack *a, Player *plr) {
bool fail = a->failtime, extra = a->type == AT_ExtraSpell;
const char *title = extra ?
(fail ? "Extra Spell failed..." : "Extra Spell cleared!"):
(fail ? "Spell failed..." : "Spell cleared!");
(fail ? "Extra Spell failed..." : "Extra Spell cleared!"):
(fail ? "Spell failed..." : "Spell cleared!");
int time_left = max(0, a->starttime + a->timeout - global.frames);
@ -502,11 +502,11 @@ static int attack_end_delay(Boss *boss) {
int delay = 0;
switch(boss->current->type) {
case AT_Spellcard: delay = ATTACK_END_DELAY_SPELL; break;
case AT_SurvivalSpell: delay = ATTACK_END_DELAY_SURV; break;
case AT_ExtraSpell: delay = ATTACK_END_DELAY_EXTRA; break;
case AT_Move: delay = ATTACK_END_DELAY_MOVE; break;
default: delay = ATTACK_END_DELAY; break;
case AT_Spellcard: delay = ATTACK_END_DELAY_SPELL; break;
case AT_SurvivalSpell: delay = ATTACK_END_DELAY_SURV; break;
case AT_ExtraSpell: delay = ATTACK_END_DELAY_EXTRA; break;
case AT_Move: delay = ATTACK_END_DELAY_MOVE; break;
default: delay = ATTACK_END_DELAY; break;
}
if(delay) {

View file

@ -47,7 +47,6 @@ int cli_args(int argc, char **argv, CLIAction *a) {
{{"play", no_argument, 0, 'p'}, "Play a specific stage", 0},
{{"sid", required_argument, 0, 'i'}, "Select stage by %s", "ID"},
{{"diff", required_argument, 0, 'd'}, "Select a difficulty (Easy/Normal/Hard/Lunatic)", "DIFF"},
/* {{"sname", required_argument, 0, 'n'}, "Select stage by %s", "NAME"},*/
{{"shotmode", required_argument, 0, 's'}, "Select a shotmode (marisaA/youmuA/marisaB/youmuB)", "SMODE"},
{{"dumpstages", no_argument, 0, 'u'}, "Print a list of all stages in the game", 0},
{{"vfs-tree", required_argument, 0, 't'}, "Print the virtual filesystem tree starting from %s", "PATH"},

View file

@ -16,183 +16,183 @@ static const float conv = 1.0f / CLR_ONEVALUE;
#ifndef COLOR_INLINE
Color rgba(float r, float g, float b, float a) {
assert(!r || isnormal(r));
assert(!g || isnormal(g));
assert(!b || isnormal(b));
assert(!a || isnormal(a));
assert(!r || isnormal(r));
assert(!g || isnormal(g));
assert(!b || isnormal(b));
assert(!a || isnormal(a));
return RGBA(r, g, b, a);
return RGBA(r, g, b, a);
}
Color rgb(float r, float g, float b) {
assert(!r || isnormal(r));
assert(!g || isnormal(g));
assert(!b || isnormal(b));
assert(!r || isnormal(r));
assert(!g || isnormal(g));
assert(!b || isnormal(b));
return RGB(r, g, b);
return RGB(r, g, b);
}
#endif
void parse_color(Color clr, float *r, float *g, float *b, float *a) {
*r = (ColorComponent)((clr >> CLR_R) & CLR_CMASK) * conv;
*g = (ColorComponent)((clr >> CLR_G) & CLR_CMASK) * conv;
*b = (ColorComponent)((clr >> CLR_B) & CLR_CMASK) * conv;
*a = (ColorComponent)((clr >> CLR_A) & CLR_CMASK) * conv;
*r = (ColorComponent)((clr >> CLR_R) & CLR_CMASK) * conv;
*g = (ColorComponent)((clr >> CLR_G) & CLR_CMASK) * conv;
*b = (ColorComponent)((clr >> CLR_B) & CLR_CMASK) * conv;
*a = (ColorComponent)((clr >> CLR_A) & CLR_CMASK) * conv;
}
void parse_color_call(Color clr, tsglColor4f_ptr func) {
float r, g, b, a;
parse_color(clr, &r, &g, &b, &a);
func(r, g, b, a);
float r, g, b, a;
parse_color(clr, &r, &g, &b, &a);
func(r, g, b, a);
}
void parse_color_array(Color clr, float array[4]) {
parse_color(clr, array, array+1, array+2, array+3);
parse_color(clr, array, array+1, array+2, array+3);
}
Color derive_color(Color src, Color mask, Color mod) {
return (src & ~mask) | (mod & mask);
return (src & ~mask) | (mod & mask);
}
float color_component(Color clr, unsigned int ofs) {
return (ColorComponent)((clr >> ofs) & CLR_CMASK) * conv;
return (ColorComponent)((clr >> ofs) & CLR_CMASK) * conv;
}
Color multiply_colors(Color c1, Color c2) {
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]*c2a[0], c1a[1]*c2a[1], c1a[2]*c2a[2], c1a[3]*c2a[3]);
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]*c2a[0], c1a[1]*c2a[1], c1a[2]*c2a[2], c1a[3]*c2a[3]);
}
Color add_colors(Color c1, Color c2) {
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]+c2a[0], c1a[1]+c2a[1], c1a[2]+c2a[2], c1a[3]+c2a[3]);
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]+c2a[0], c1a[1]+c2a[1], c1a[2]+c2a[2], c1a[3]+c2a[3]);
}
Color subtract_colors(Color c1, Color c2) {
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]-c2a[0], c1a[1]-c2a[1], c1a[2]-c2a[2], c1a[3]-c2a[3]);
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]-c2a[0], c1a[1]-c2a[1], c1a[2]-c2a[2], c1a[3]-c2a[3]);
}
Color divide_colors(Color c1, Color c2) {
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]/c2a[0], c1a[1]/c2a[1], c1a[2]/c2a[2], c1a[3]/c2a[3]);
float c1a[4], c2a[4];
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(c1a[0]/c2a[0], c1a[1]/c2a[1], c1a[2]/c2a[2], c1a[3]/c2a[3]);
}
Color mix_colors(Color c1, Color c2, double a) {
float c1a[4], c2a[4];
double f1 = a;
double f2 = 1 - f1;
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(f1*c1a[0]+f2*c2a[0], f1*c1a[1]+f2*c2a[1], f1*c1a[2]+f2*c2a[2], f1*c1a[3]+f2*c2a[3]);
float c1a[4], c2a[4];
double f1 = a;
double f2 = 1 - f1;
parse_color_array(c1, c1a);
parse_color_array(c2, c2a);
return rgba(f1*c1a[0]+f2*c2a[0], f1*c1a[1]+f2*c2a[1], f1*c1a[2]+f2*c2a[2], f1*c1a[3]+f2*c2a[3]);
}
Color approach_color(Color src, Color dst, double delta) {
float c1a[4], c2a[4];
parse_color_array(src, c1a);
parse_color_array(dst, c2a);
return rgba(
c1a[0] + (c2a[0] - c1a[0]) * delta,
c1a[1] + (c2a[1] - c1a[1]) * delta,
c1a[2] + (c2a[2] - c1a[2]) * delta,
c1a[3] + (c2a[3] - c1a[3]) * delta
);
float c1a[4], c2a[4];
parse_color_array(src, c1a);
parse_color_array(dst, c2a);
return rgba(
c1a[0] + (c2a[0] - c1a[0]) * delta,
c1a[1] + (c2a[1] - c1a[1]) * delta,
c1a[2] + (c2a[2] - c1a[2]) * delta,
c1a[3] + (c2a[3] - c1a[3]) * delta
);
}
static float hue_to_rgb(float v1, float v2, float vH) {
if(vH < 0) {
vH += 1;
}
if(vH < 0) {
vH += 1;
}
if(vH > 1) {
vH -= 1;
}
if(vH > 1) {
vH -= 1;
}
if((6 * vH) < 1) {
return (v1 + (v2 - v1) * 6 * vH);
}
if((6 * vH) < 1) {
return (v1 + (v2 - v1) * 6 * vH);
}
if((2 * vH) < 1) {
return v2;
}
if((2 * vH) < 1) {
return v2;
}
if((3 * vH) < 2) {
return (v1 + (v2 - v1) * ((2.0f / 3) - vH) * 6);
}
if((3 * vH) < 2) {
return (v1 + (v2 - v1) * ((2.0f / 3) - vH) * 6);
}
return v1;
return v1;
}
Color hsla(float h, float s, float l, float a) {
float r, g, b;
float r, g, b;
if(s == 0) {
r = g = b = l;
} else {
float v1, v2;
h = fmod(h, 1.0);
if(s == 0) {
r = g = b = l;
} else {
float v1, v2;
h = fmod(h, 1.0);
if(l < 0.5) {
v2 = l * (1.0 + s);
} else {
v2 = l + s - s * l;
}
if(l < 0.5) {
v2 = l * (1.0 + s);
} else {
v2 = l + s - s * l;
}
v1 = 2.0 * l - v2;
v1 = 2.0 * l - v2;
r = hue_to_rgb(v1, v2, h + (1.0/3.0));
g = hue_to_rgb(v1, v2, h);
b = hue_to_rgb(v1, v2, h - (1.0/3.0));
}
r = hue_to_rgb(v1, v2, h + (1.0/3.0));
g = hue_to_rgb(v1, v2, h);
b = hue_to_rgb(v1, v2, h - (1.0/3.0));
}
return rgba(r, g, b, a);
return rgba(r, g, b, a);
}
Color hsl(float h, float s, float l) {
return hsla(h, s, l, 1.0);
return hsla(h, s, l, 1.0);
}
char* color_str(Color c) {
float r, g, b, a;
parse_color(c, &r, &g, &b, &a);
return strfmt("rgba(%f, %f, %f, %f) 0x%016"PRIxMAX, r, g, b, a, (uintmax_t)c);
float r, g, b, a;
parse_color(c, &r, &g, &b, &a);
return strfmt("rgba(%f, %f, %f, %f) 0x%016"PRIxMAX, r, g, b, a, (uintmax_t)c);
}
// #define COLOR_TEST
int color_test(void) {
#ifdef COLOR_TEST
float clra[4];
Color clr1, clr2, clr3;
float clra[4];
Color clr1, clr2, clr3;
clr1 = rgba(0.1, 0.2, 0.3, 0.4);
parse_color_array(clr1, clra);
clr2 = rgba(clra[0], clra[1], clra[2], clra[3]);
clr1 = rgba(0.1, 0.2, 0.3, 0.4);
parse_color_array(clr1, clra);
clr2 = rgba(clra[0], clra[1], clra[2], clra[3]);
clr3 = derive_color(clr1, CLRMASK_A, rgba(0, 0, 0, -1.0));
printf("1: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr1,
color_component(clr1, CLR_R), color_component(clr1, CLR_G), color_component(clr1, CLR_B), color_component(clr1, CLR_A));
printf("2: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr2,
color_component(clr2, CLR_R), color_component(clr2, CLR_G), color_component(clr2, CLR_B), color_component(clr2, CLR_A));
printf("3: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr3,
color_component(clr3, CLR_R), color_component(clr3, CLR_G), color_component(clr3, CLR_B), color_component(clr3, CLR_A));
clr3 = derive_color(clr1, CLRMASK_A, rgba(0, 0, 0, -1.0));
printf("1: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr1,
color_component(clr1, CLR_R), color_component(clr1, CLR_G), color_component(clr1, CLR_B), color_component(clr1, CLR_A));
printf("2: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr2,
color_component(clr2, CLR_R), color_component(clr2, CLR_G), color_component(clr2, CLR_B), color_component(clr2, CLR_A));
printf("3: %016"PRIxMAX" (%f %f %f %f)\n", (uintmax_t)clr3,
color_component(clr3, CLR_R), color_component(clr3, CLR_G), color_component(clr3, CLR_B), color_component(clr3, CLR_A));
assert(clr1 == clr2);
assert(color_component(clr3, CLR_R) == color_component(clr3, CLR_R));
assert(color_component(clr3, CLR_G) == color_component(clr3, CLR_G));
assert(color_component(clr3, CLR_B) == color_component(clr3, CLR_B));
assert(color_component(clr3, CLR_A) == -1.0);
return 1;
assert(clr1 == clr2);
assert(color_component(clr3, CLR_R) == color_component(clr3, CLR_R));
assert(color_component(clr3, CLR_G) == color_component(clr3, CLR_G));
assert(color_component(clr3, CLR_B) == color_component(clr3, CLR_B));
assert(color_component(clr3, CLR_A) == -1.0);
return 1;
#else
return 0;
return 0;
#endif
}

View file

@ -30,9 +30,9 @@ typedef uint64_t Color;
typedef int16_t ColorComponent;
#ifndef COLOR_INLINE
#ifdef NDEBUG
#define COLOR_INLINE
#endif
#ifdef NDEBUG
#define COLOR_INLINE
#endif
#endif
#ifdef COLOR_INLINE
@ -67,15 +67,15 @@ char* color_str(Color c);
#endif
#define RGBA(r,g,b,a) \
((((Color)(ColorComponent)(CLR_ONEVALUE * (r)) & CLR_CMASK) << CLR_R) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (g)) & CLR_CMASK) << CLR_G) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (b)) & CLR_CMASK) << CLR_B) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (a)) & CLR_CMASK) << CLR_A))
((((Color)(ColorComponent)(CLR_ONEVALUE * (r)) & CLR_CMASK) << CLR_R) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (g)) & CLR_CMASK) << CLR_G) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (b)) & CLR_CMASK) << CLR_B) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (a)) & CLR_CMASK) << CLR_A))
#define RGB(r,g,b) \
((((Color)(ColorComponent)(CLR_ONEVALUE * (r)) & CLR_CMASK) << CLR_R) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (g)) & CLR_CMASK) << CLR_G) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (b)) & CLR_CMASK) << CLR_B) + \
(CLR_ONEVALUE << CLR_A))
((((Color)(ColorComponent)(CLR_ONEVALUE * (r)) & CLR_CMASK) << CLR_R) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (g)) & CLR_CMASK) << CLR_G) + \
(((Color)(ColorComponent)(CLR_ONEVALUE * (b)) & CLR_CMASK) << CLR_B) + \
(CLR_ONEVALUE << CLR_A))
int color_test(void);

View file

@ -10,16 +10,16 @@
#include "taisei.h"
#ifndef __GNUC__ // clang defines this too
#define __attribute__(...)
#define __extension__
#define PRAGMA(p)
#define __attribute__(...)
#define __extension__
#define PRAGMA(p)
#else
#define PRAGMA(p) _Pragma(#p)
#define USE_GNU_EXTENSIONS
#define PRAGMA(p) _Pragma(#p)
#define USE_GNU_EXTENSIONS
#endif
#ifdef __USE_MINGW_ANSI_STDIO
#define FORMAT_ATTR __MINGW_PRINTF_FORMAT
#define FORMAT_ATTR __MINGW_PRINTF_FORMAT
#else
#define FORMAT_ATTR printf
#define FORMAT_ATTR printf
#endif

View file

@ -27,82 +27,82 @@
// #define CONFIGDEF_STRING(id,entryname,default)
/*
* DO NOT REORDER KEYBINDINGS.
* 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.
* 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.
* KEYDEFS can be safely moved around within CONFIGDEFS, however.
* Stuff in GPKEYDEFS is safe to reorder.
*/
#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) \
CONFIGDEF_KEYBINDING(KEY_NOBACKGROUND, "key_nobackground", SDL_SCANCODE_LALT) \
CONFIGDEF_KEYBINDING(KEY_POWERUP, "key_powerup", SDL_SCANCODE_2) \
CONFIGDEF_KEYBINDING(KEY_POWERDOWN, "key_powerdown", SDL_SCANCODE_1) \
CONFIGDEF_KEYBINDING(KEY_FPSLIMIT_OFF, "key_fpslimit_off", SDL_SCANCODE_RSHIFT) \
CONFIGDEF_KEYBINDING(KEY_STOP, "key_stop", SDL_SCANCODE_F1) \
CONFIGDEF_KEYBINDING(KEY_RESTART, "key_restart", SDL_SCANCODE_F2) \
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) \
CONFIGDEF_KEYBINDING(KEY_NOBACKGROUND, "key_nobackground", SDL_SCANCODE_LALT) \
CONFIGDEF_KEYBINDING(KEY_POWERUP, "key_powerup", SDL_SCANCODE_2) \
CONFIGDEF_KEYBINDING(KEY_POWERDOWN, "key_powerdown", SDL_SCANCODE_1) \
CONFIGDEF_KEYBINDING(KEY_FPSLIMIT_OFF, "key_fpslimit_off", SDL_SCANCODE_RSHIFT) \
CONFIGDEF_KEYBINDING(KEY_STOP, "key_stop", SDL_SCANCODE_F1) \
CONFIGDEF_KEYBINDING(KEY_RESTART, "key_restart", SDL_SCANCODE_F2) \
#define GPKEYDEFS \
CONFIGDEF_GPKEYBINDING(KEY_UP, "gamepad_key_up", GAMEPAD_BUTTON_DPAD_UP) \
CONFIGDEF_GPKEYBINDING(KEY_DOWN, "gamepad_key_down", GAMEPAD_BUTTON_DPAD_DOWN) \
CONFIGDEF_GPKEYBINDING(KEY_LEFT, "gamepad_key_left", GAMEPAD_BUTTON_DPAD_LEFT) \
CONFIGDEF_GPKEYBINDING(KEY_RIGHT, "gamepad_key_right", GAMEPAD_BUTTON_DPAD_RIGHT) \
CONFIGDEF_GPKEYBINDING(KEY_FOCUS, "gamepad_key_focus", GAMEPAD_BUTTON_X) \
CONFIGDEF_GPKEYBINDING(KEY_SHOT, "gamepad_key_shot", GAMEPAD_BUTTON_A) \
CONFIGDEF_GPKEYBINDING(KEY_BOMB, "gamepad_key_bomb", GAMEPAD_BUTTON_Y) \
CONFIGDEF_GPKEYBINDING(KEY_SKIP, "gamepad_key_skip", GAMEPAD_BUTTON_B) \
CONFIGDEF_GPKEYBINDING(KEY_UP, "gamepad_key_up", GAMEPAD_BUTTON_DPAD_UP) \
CONFIGDEF_GPKEYBINDING(KEY_DOWN, "gamepad_key_down", GAMEPAD_BUTTON_DPAD_DOWN) \
CONFIGDEF_GPKEYBINDING(KEY_LEFT, "gamepad_key_left", GAMEPAD_BUTTON_DPAD_LEFT) \
CONFIGDEF_GPKEYBINDING(KEY_RIGHT, "gamepad_key_right", GAMEPAD_BUTTON_DPAD_RIGHT) \
CONFIGDEF_GPKEYBINDING(KEY_FOCUS, "gamepad_key_focus", GAMEPAD_BUTTON_X) \
CONFIGDEF_GPKEYBINDING(KEY_SHOT, "gamepad_key_shot", GAMEPAD_BUTTON_A) \
CONFIGDEF_GPKEYBINDING(KEY_BOMB, "gamepad_key_bomb", GAMEPAD_BUTTON_Y) \
CONFIGDEF_GPKEYBINDING(KEY_SKIP, "gamepad_key_skip", GAMEPAD_BUTTON_B) \
#define CONFIGDEFS \
/* @version must be on top. don't change its default value here, it does nothing. */ \
CONFIGDEF_INT (VERSION, "@version", 0) \
CONFIGDEF_INT (VERSION, "@version", 0) \
\
CONFIGDEF_STRING (PLAYERNAME, "playername", "Player") \
CONFIGDEF_INT (FULLSCREEN, "fullscreen", 0) \
CONFIGDEF_INT (FULLSCREEN_DESKTOP, "fullscreen_desktop_mode", 1) \
CONFIGDEF_INT (VID_WIDTH, "vid_width", RESX) \
CONFIGDEF_INT (VID_HEIGHT, "vid_height", RESY) \
CONFIGDEF_INT (VID_RESIZABLE, "vid_resizable", 0) \
CONFIGDEF_INT (VID_LATE_SWAP, "vid_late_swap", 0) \
CONFIGDEF_INT (VID_FRAMESKIP, "vid_frameskip", 1) \
CONFIGDEF_INT (VSYNC, "vsync", 0) \
CONFIGDEF_INT (MIXER_CHUNKSIZE, "mixer_chunksize", 1024) \
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 (SAVE_RPY, "save_rpy", 2) \
CONFIGDEF_INT (SPELLSTAGE_AUTORESTART, "spellpractice_restart_on_fail", 0) \
CONFIGDEF_FLOAT (TEXT_QUALITY, "text_quality", 1.0) \
CONFIGDEF_FLOAT (FG_QUALITY, "fg_quality", 1.0) \
CONFIGDEF_FLOAT (BG_QUALITY, "bg_quality", 1.0) \
CONFIGDEF_INT (SHOT_INVERTED, "shot_inverted", 0) \
CONFIGDEF_INT (FOCUS_LOSS_PAUSE, "focus_loss_pause", 1) \
CONFIGDEF_INT (PARTICLES, "particles", 1) \
CONFIGDEF_STRING (PLAYERNAME, "playername", "Player") \
CONFIGDEF_INT (FULLSCREEN, "fullscreen", 0) \
CONFIGDEF_INT (FULLSCREEN_DESKTOP, "fullscreen_desktop_mode", 1) \
CONFIGDEF_INT (VID_WIDTH, "vid_width", RESX) \
CONFIGDEF_INT (VID_HEIGHT, "vid_height", RESY) \
CONFIGDEF_INT (VID_RESIZABLE, "vid_resizable", 0) \
CONFIGDEF_INT (VID_LATE_SWAP, "vid_late_swap", 0) \
CONFIGDEF_INT (VID_FRAMESKIP, "vid_frameskip", 1) \
CONFIGDEF_INT (VSYNC, "vsync", 0) \
CONFIGDEF_INT (MIXER_CHUNKSIZE, "mixer_chunksize", 1024) \
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 (SAVE_RPY, "save_rpy", 2) \
CONFIGDEF_INT (SPELLSTAGE_AUTORESTART, "spellpractice_restart_on_fail", 0) \
CONFIGDEF_FLOAT (TEXT_QUALITY, "text_quality", 1.0) \
CONFIGDEF_FLOAT (FG_QUALITY, "fg_quality", 1.0) \
CONFIGDEF_FLOAT (BG_QUALITY, "bg_quality", 1.0) \
CONFIGDEF_INT (SHOT_INVERTED, "shot_inverted", 0) \
CONFIGDEF_INT (FOCUS_LOSS_PAUSE, "focus_loss_pause", 1) \
CONFIGDEF_INT (PARTICLES, "particles", 1) \
KEYDEFS \
CONFIGDEF_INT (GAMEPAD_ENABLED, "gamepad_enabled", 0) \
CONFIGDEF_STRING (GAMEPAD_DEVICE, "gamepad_device", "default") \
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.1) \
CONFIGDEF_INT (GAMEPAD_ENABLED, "gamepad_enabled", 0) \
CONFIGDEF_STRING (GAMEPAD_DEVICE, "gamepad_device", "default") \
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.1) \
GPKEYDEFS \

View file

@ -198,7 +198,6 @@ void credits_towerwall_draw(Vector pos) {
glPushMatrix();
glTranslatef(pos[0], pos[1], pos[2]);
// glRotatef(90, 1,0,0);
glScalef(30,30,30);
draw_model("towerwall");
glPopMatrix();

View file

@ -12,40 +12,40 @@
#include "resource/resource.h"
const char* difficulty_name(Difficulty diff) {
switch(diff) {
case D_Easy: return "Easy";
case D_Normal: return "Normal";
case D_Hard: return "Hard";
case D_Lunatic: return "Lunatic";
case D_Extra: return "Extra";
default: return "Unknown";
}
switch(diff) {
case D_Easy: return "Easy";
case D_Normal: return "Normal";
case D_Hard: return "Hard";
case D_Lunatic: return "Lunatic";
case D_Extra: return "Extra";
default: return "Unknown";
}
}
const char* difficulty_tex(Difficulty diff) {
switch(diff) {
case D_Easy: return "difficulty/easy";
case D_Normal: return "difficulty/normal";
case D_Hard: return "difficulty/hard";
case D_Lunatic: return "difficulty/lunatic";
case D_Extra: return "difficulty/lunatic";
default: return "difficulty/unknown"; // This texture is not supposed to exist.
}
switch(diff) {
case D_Easy: return "difficulty/easy";
case D_Normal: return "difficulty/normal";
case D_Hard: return "difficulty/hard";
case D_Lunatic: return "difficulty/lunatic";
case D_Extra: return "difficulty/lunatic";
default: return "difficulty/unknown"; // This texture is not supposed to exist.
}
}
Color difficulty_color(Difficulty diff) {
switch(diff) {
case D_Easy: return rgb(0.5, 1.0, 0.5);
case D_Normal: return rgb(0.5, 0.5, 1.0);
case D_Hard: return rgb(1.0, 0.5, 0.5);
case D_Lunatic: return rgb(1.0, 0.5, 1.0);
case D_Extra: return rgb(0.5, 1.0, 1.0);
default: return rgb(0.5, 0.5, 0.5);
}
switch(diff) {
case D_Easy: return rgb(0.5, 1.0, 0.5);
case D_Normal: return rgb(0.5, 0.5, 1.0);
case D_Hard: return rgb(1.0, 0.5, 0.5);
case D_Lunatic: return rgb(1.0, 0.5, 1.0);
case D_Extra: return rgb(0.5, 1.0, 1.0);
default: return rgb(0.5, 0.5, 0.5);
}
}
void difficulty_preload(void) {
for(Difficulty diff = D_Easy; diff < NUM_SELECTABLE_DIFFICULTIES + D_Easy; ++diff) {
preload_resource(RES_TEXTURE, difficulty_tex(diff), RESF_PERMANENT);
}
for(Difficulty diff = D_Easy; diff < NUM_SELECTABLE_DIFFICULTIES + D_Easy; ++diff) {
preload_resource(RES_TEXTURE, difficulty_tex(diff), RESF_PERMANENT);
}
}

View file

@ -12,12 +12,12 @@
#include "color.h"
typedef enum {
D_Any = 0,
D_Easy,
D_Normal,
D_Hard,
D_Lunatic,
D_Extra // reserved for later
D_Any = 0,
D_Easy,
D_Normal,
D_Hard,
D_Lunatic,
D_Extra // reserved for later
} Difficulty;
#define NUM_SELECTABLE_DIFFICULTIES D_Lunatic

View file

@ -17,13 +17,13 @@ enum {
};
enum {
// do not reorder these or change the values
ENDING_BAD_1,
ENDING_BAD_2,
ENDING_GOOD_1,
ENDING_GOOD_2,
// do not reorder these or change the values
ENDING_BAD_1,
ENDING_BAD_2,
ENDING_GOOD_1,
ENDING_GOOD_2,
NUM_ENDINGS,
NUM_ENDINGS,
};
typedef struct EndingEntry EndingEntry;

View file

@ -55,8 +55,11 @@ struct Enemy {
#define create_enemy2c(p,h,d,l,a1,a2) create_enemy_p(&global.enemies,p,h,d,l,a1,a2,0,0)
#define create_enemy1c(p,h,d,l,a1) create_enemy_p(&global.enemies,p,h,d,l,a1,0,0,0)
Enemy *create_enemy_p(Enemy **enemies, complex pos, int hp, EnemyVisualRule draw_rule, EnemyLogicRule logic_rule,
complex a1, complex a2, complex a3, complex a4);
Enemy *create_enemy_p(
Enemy **enemies, complex pos, int hp, EnemyVisualRule draw_rule, EnemyLogicRule logic_rule,
complex a1, complex a2, complex a3, complex a4
);
#ifdef ENEMY_DEBUG
Enemy* _enemy_attach_dbginfo(Enemy *p, DebugInfo *dbg);
#define create_enemy_p(...) _enemy_attach_dbginfo(create_enemy_p(__VA_ARGS__), _DEBUG_INFO_PTR_)

View file

@ -23,7 +23,7 @@ static void events_register_default_handlers(void);
static void events_unregister_default_handlers(void);
/*
* Public API
* Public API
*/
void events_init(void) {
@ -89,8 +89,8 @@ static bool events_invoke_handlers(SDL_Event *event, ListContainer *h_list, Even
// list items take precedence
//
// assumptions:
// h_list is sorted by priority
// h_array is in arbitrary order and terminated with a NULL-proc entry
// h_list is sorted by priority
// h_array is in arbitrary order and terminated with a NULL-proc entry
bool result = false;
@ -257,7 +257,7 @@ void events_pause_keyrepeat(void) {
}
/*
* Default handlers
* Default handlers
*/
static bool events_handler_quit(SDL_Event *event, void *arg);
@ -269,12 +269,12 @@ static bool events_handler_key_up(SDL_Event *event, void *arg);
static EventHandler default_handlers[] = {
{ .proc = events_handler_quit, .priority = EPRIO_SYSTEM, .event_type = SDL_QUIT },
{ .proc = events_handler_keyrepeat_workaround, .priority = EPRIO_CAPTURE, .event_type = 0 },
{ .proc = events_handler_clipboard, .priority = EPRIO_CAPTURE, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_hotkeys, .priority = EPRIO_HOTKEYS, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_key_down, .priority = EPRIO_TRANSLATION, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_key_up, .priority = EPRIO_TRANSLATION, .event_type = SDL_KEYUP },
{ .proc = events_handler_quit, .priority = EPRIO_SYSTEM, .event_type = SDL_QUIT },
{ .proc = events_handler_keyrepeat_workaround, .priority = EPRIO_CAPTURE, .event_type = 0 },
{ .proc = events_handler_clipboard, .priority = EPRIO_CAPTURE, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_hotkeys, .priority = EPRIO_HOTKEYS, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_key_down, .priority = EPRIO_TRANSLATION, .event_type = SDL_KEYDOWN },
{ .proc = events_handler_key_up, .priority = EPRIO_TRANSLATION, .event_type = SDL_KEYUP },
{NULL}
};
@ -340,7 +340,7 @@ static bool events_handler_key_down(SDL_Event *event, void *arg) {
bool repeat = event->key.repeat;
/*
* Emit menu events
* Emit menu events
*/
struct eventmap_s { int scancode; TaiseiEvent event; } menu_event_map[] = {
@ -374,7 +374,7 @@ static bool events_handler_key_down(SDL_Event *event, void *arg) {
}
/*
* Emit game events
* Emit game events
*/
if(!repeat) {
@ -396,7 +396,7 @@ static bool events_handler_key_up(SDL_Event *event, void *arg) {
SDL_Scancode scan = event->key.keysym.scancode;
/*
* Emit game events
* Emit game events
*/
int key = config_key_from_scancode(scan);

View file

@ -48,11 +48,11 @@ typedef enum {
// from highest to lowest
// feel free to add new prios as needed, just don't randomly reorder stuff
EPRIO_SYSTEM, // for events not associated with user input
EPRIO_TRANSLATION, // for translating raw input events into higher level Taisei events
EPRIO_CAPTURE, // for capturing raw user input before it's further processed
EPRIO_HOTKEYS, // for global keybindings
EPRIO_NORMAL, // for everything else
EPRIO_SYSTEM, // for events not associated with user input
EPRIO_TRANSLATION, // for translating raw input events into higher level Taisei events
EPRIO_CAPTURE, // for capturing raw user input before it's further processed
EPRIO_HOTKEYS, // for global keybindings
EPRIO_NORMAL, // for everything else
NUM_EPRIOS
} EventPriority;

View file

@ -69,9 +69,9 @@ static void reinit_fbo(FBO *fbo, float scale, int type) {
}
static void swap_fbos(FBO **fbo1, FBO **fbo2) {
FBO *temp = *fbo1;
*fbo1 = *fbo2;
*fbo2 = temp;
FBO *temp = *fbo1;
*fbo1 = *fbo2;
*fbo2 = temp;
}
void init_fbo_pair(FBOPair *pair, float scale, int type) {

View file

@ -309,19 +309,19 @@ static int gamepad_axis2gamekey(GamepadAxis id, int val) {
static GamepadAxis gamepad_gamekey2axis(KeyIndex key) {
switch(key) {
case KEY_UP: case KEY_DOWN: return config_get_int(CONFIG_GAMEPAD_AXIS_UD);
case KEY_LEFT: case KEY_RIGHT: return config_get_int(CONFIG_GAMEPAD_AXIS_LR);
default: return GAMEPAD_AXIS_INVALID;
case KEY_UP: case KEY_DOWN: return config_get_int(CONFIG_GAMEPAD_AXIS_UD);
case KEY_LEFT: case KEY_RIGHT: return config_get_int(CONFIG_GAMEPAD_AXIS_LR);
default: return GAMEPAD_AXIS_INVALID;
}
}
static int gamepad_gamekey2axisval(KeyIndex key) {
switch(key) {
case KEY_UP: return AXISVAL_UP;
case KEY_DOWN: return AXISVAL_DOWN;
case KEY_LEFT: return AXISVAL_LEFT;
case KEY_RIGHT: return AXISVAL_RIGHT;
default: return AXISVAL_NULL;
case KEY_UP: return AXISVAL_UP;
case KEY_DOWN: return AXISVAL_DOWN;
case KEY_LEFT: return AXISVAL_LEFT;
case KEY_RIGHT: return AXISVAL_RIGHT;
default: return AXISVAL_NULL;
}
}
@ -425,7 +425,7 @@ static void gamepad_axis(GamepadAxis id, int raw) {
}
}
if(val) { // simulate press
if(val) { // simulate press
if(!a[id]) {
a[id] = val;
int key = gamepad_axis2gamekey(id, val);
@ -447,7 +447,7 @@ static void gamepad_axis(GamepadAxis id, int raw) {
gamepad_button(btn, SDL_PRESSED);
}
}
} else if(a[id]) { // simulate release
} else if(a[id]) { // simulate release
if(restricted) {
int key = gamepad_axis2gamekey(id, a[id]);
@ -467,9 +467,9 @@ static void gamepad_axis(GamepadAxis id, int raw) {
}
static void gamepad_button(GamepadButton button, int state) {
int gpkey = config_gamepad_key_from_gamepad_button(button);
int key = config_key_from_gamepad_key(gpkey);
void *indev = (void*)(intptr_t)INDEV_GAMEPAD;
int gpkey = config_gamepad_key_from_gamepad_button(button);
int key = config_key_from_gamepad_key(gpkey);
void *indev = (void*)(intptr_t)INDEV_GAMEPAD;
if(state == SDL_PRESSED) {
events_emit(TE_GAMEPAD_BUTTON_DOWN, button, indev, NULL);

View file

@ -15,63 +15,63 @@
#include "config.h"
enum {
AXISVAL_LEFT = -1,
AXISVAL_RIGHT = 1,
AXISVAL_LEFT = -1,
AXISVAL_RIGHT = 1,
AXISVAL_UP = -1,
AXISVAL_DOWN = 1,
AXISVAL_UP = -1,
AXISVAL_DOWN = 1,
AXISVAL_NULL = 0
AXISVAL_NULL = 0
};
typedef enum {
PLRAXIS_LR, // aka X
PLRAXIS_UD, // aka Y
PLRAXIS_LR, // aka X
PLRAXIS_UD, // aka Y
} GamepadPlrAxis;
typedef enum GamepadEmulatedButton {
GAMEPAD_EMULATED_BUTTON_INVALID = -1,
GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT,
GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT,
GAMEPAD_EMULATED_BUTTON_MAX,
GAMEPAD_EMULATED_BUTTON_INVALID = -1,
GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT,
GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT,
GAMEPAD_EMULATED_BUTTON_MAX,
} GamepadEmulatedButton;
typedef enum GamepadButton {
// must match SDL_GameControllerButton
GAMEPAD_BUTTON_INVALID = -1,
GAMEPAD_BUTTON_A,
GAMEPAD_BUTTON_B,
GAMEPAD_BUTTON_X,
GAMEPAD_BUTTON_Y,
GAMEPAD_BUTTON_BACK,
GAMEPAD_BUTTON_GUIDE,
GAMEPAD_BUTTON_START,
GAMEPAD_BUTTON_STICK_LEFT,
GAMEPAD_BUTTON_STICK_RIGHT,
GAMEPAD_BUTTON_SHOULDER_LEFT,
GAMEPAD_BUTTON_SHOULDER_RIGHT,
GAMEPAD_BUTTON_DPAD_UP,
GAMEPAD_BUTTON_DPAD_DOWN,
GAMEPAD_BUTTON_DPAD_LEFT,
GAMEPAD_BUTTON_DPAD_RIGHT,
GAMEPAD_BUTTON_MAX,
// must match SDL_GameControllerButton
GAMEPAD_BUTTON_INVALID = -1,
GAMEPAD_BUTTON_A,
GAMEPAD_BUTTON_B,
GAMEPAD_BUTTON_X,
GAMEPAD_BUTTON_Y,
GAMEPAD_BUTTON_BACK,
GAMEPAD_BUTTON_GUIDE,
GAMEPAD_BUTTON_START,
GAMEPAD_BUTTON_STICK_LEFT,
GAMEPAD_BUTTON_STICK_RIGHT,
GAMEPAD_BUTTON_SHOULDER_LEFT,
GAMEPAD_BUTTON_SHOULDER_RIGHT,
GAMEPAD_BUTTON_DPAD_UP,
GAMEPAD_BUTTON_DPAD_DOWN,
GAMEPAD_BUTTON_DPAD_LEFT,
GAMEPAD_BUTTON_DPAD_RIGHT,
GAMEPAD_BUTTON_MAX,
GAMEPAD_BUTTON_EMULATED = 0x8000,
GAMEPAD_BUTTON_EMULATED = 0x8000,
GAMEPAD_BUTTON_TRIGGER_LEFT = GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_TRIGGER_RIGHT = GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_TRIGGER_LEFT = GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_TRIGGER_RIGHT = GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT | GAMEPAD_BUTTON_EMULATED,
} GamepadButton;
typedef enum GamepadAxis {
// must match SDL_GameControllerAxis
GAMEPAD_AXIS_INVALID = -1,
GAMEPAD_AXIS_LEFT_X,
GAMEPAD_AXIS_LEFT_Y,
GAMEPAD_AXIS_RIGHT_X,
GAMEPAD_AXIS_RIGHT_Y,
GAMEPAD_AXIS_TRIGGER_LEFT,
GAMEPAD_AXIS_TRIGGER_RIGHT,
GAMEPAD_AXIS_MAX
// must match SDL_GameControllerAxis
GAMEPAD_AXIS_INVALID = -1,
GAMEPAD_AXIS_LEFT_X,
GAMEPAD_AXIS_LEFT_Y,
GAMEPAD_AXIS_RIGHT_X,
GAMEPAD_AXIS_RIGHT_Y,
GAMEPAD_AXIS_TRIGGER_LEFT,
GAMEPAD_AXIS_TRIGGER_RIGHT,
GAMEPAD_AXIS_MAX
} GamepadAxis;
void gamepad_init(void);

View file

@ -20,39 +20,39 @@
// #define HT_USE_MUTEX
typedef struct HashtableElement {
LIST_INTERFACE(struct HashtableElement);
void *data;
void *key;
hash_t hash;
LIST_INTERFACE(struct HashtableElement);
void *data;
void *key;
hash_t hash;
} HashtableElement;
struct Hashtable {
HashtableElement **table;
size_t table_size;
HTCmpFunc cmp_func;
HTHashFunc hash_func;
HTCopyFunc copy_func;
HTFreeFunc free_func;
HashtableElement **table;
size_t table_size;
HTCmpFunc cmp_func;
HTHashFunc hash_func;
HTCopyFunc copy_func;
HTFreeFunc free_func;
#ifdef HT_USE_MUTEX
SDL_mutex *mutex;
SDL_mutex *mutex;
#else
SDL_atomic_t cur_operation;
SDL_atomic_t num_operations;
SDL_atomic_t cur_operation;
SDL_atomic_t num_operations;
#endif
size_t num_elements;
bool dynamic_size;
size_t num_elements;
bool dynamic_size;
};
enum {
HT_OP_NONE,
HT_OP_READ,
HT_OP_WRITE,
HT_OP_NONE,
HT_OP_READ,
HT_OP_WRITE,
};
typedef struct HashtableIterator {
Hashtable *hashtable;
size_t bucketnum;
HashtableElement *elem;
Hashtable *hashtable;
size_t bucketnum;
HashtableElement *elem;
} HashtableIterator;
/*
@ -60,326 +60,326 @@ typedef struct HashtableIterator {
*/
static size_t constraint_size(size_t size) {
if(size < HT_MIN_SIZE)
return HT_MIN_SIZE;
if(size < HT_MIN_SIZE)
return HT_MIN_SIZE;
if(size > HT_MAX_SIZE)
return HT_MAX_SIZE;
if(size > HT_MAX_SIZE)
return HT_MAX_SIZE;
return size;
return size;
}
Hashtable* hashtable_new(size_t size, HTCmpFunc cmp_func, HTHashFunc hash_func, HTCopyFunc copy_func, HTFreeFunc free_func) {
Hashtable *ht = malloc(sizeof(Hashtable));
Hashtable *ht = malloc(sizeof(Hashtable));
if(size == HT_DYNAMIC_SIZE) {
size = constraint_size(0);
ht->dynamic_size = true;
} else {
size = constraint_size(size);
ht->dynamic_size = false;
}
if(size == HT_DYNAMIC_SIZE) {
size = constraint_size(0);
ht->dynamic_size = true;
} else {
size = constraint_size(size);
ht->dynamic_size = false;
}
if(!cmp_func) {
cmp_func = hashtable_cmpfunc_ptr;
}
if(!cmp_func) {
cmp_func = hashtable_cmpfunc_ptr;
}
if(!copy_func) {
copy_func = hashtable_copyfunc_ptr;
}
if(!copy_func) {
copy_func = hashtable_copyfunc_ptr;
}
ht->table = calloc(size, sizeof(HashtableElement*));
ht->table_size = size;
ht->num_elements = 0;
ht->cmp_func = cmp_func;
ht->hash_func = hash_func;
ht->copy_func = copy_func;
ht->free_func = free_func;
ht->table = calloc(size, sizeof(HashtableElement*));
ht->table_size = size;
ht->num_elements = 0;
ht->cmp_func = cmp_func;
ht->hash_func = hash_func;
ht->copy_func = copy_func;
ht->free_func = free_func;
#ifdef HT_USE_MUTEX
ht->mutex = SDL_CreateMutex();
ht->mutex = SDL_CreateMutex();
#else
SDL_AtomicSet(&ht->cur_operation, HT_OP_NONE);
SDL_AtomicSet(&ht->num_operations, 0);
SDL_AtomicSet(&ht->cur_operation, HT_OP_NONE);
SDL_AtomicSet(&ht->num_operations, 0);
#endif
assert(ht->hash_func != NULL);
assert(ht->hash_func != NULL);
return ht;
return ht;
}
#ifdef HT_USE_MUTEX
static void hashtable_enter_state(Hashtable *ht, int state, bool mutex) {
SDL_LockMutex(ht->mutex);
SDL_LockMutex(ht->mutex);
}
static void hashtable_idle_state(Hashtable *ht) {
SDL_UnlockMutex(ht->mutex);
SDL_UnlockMutex(ht->mutex);
}
#else
static bool hashtable_try_enter_state(Hashtable *ht, int state, bool mutex) {
SDL_atomic_t *ptr = &ht->cur_operation;
SDL_atomic_t *ptr = &ht->cur_operation;
if(!mutex) {
SDL_AtomicCAS(ptr, state, HT_OP_NONE);
}
if(!mutex) {
SDL_AtomicCAS(ptr, state, HT_OP_NONE);
}
return SDL_AtomicCAS(ptr, HT_OP_NONE, state);
return SDL_AtomicCAS(ptr, HT_OP_NONE, state);
}
static void hashtable_enter_state(Hashtable *ht, int state, bool mutex) {
while(!hashtable_try_enter_state(ht, state, mutex) || (mutex && SDL_AtomicGet(&ht->num_operations)));
SDL_AtomicIncRef(&ht->num_operations);
while(!hashtable_try_enter_state(ht, state, mutex) || (mutex && SDL_AtomicGet(&ht->num_operations)));
SDL_AtomicIncRef(&ht->num_operations);
}
static void hashtable_idle_state(Hashtable *ht) {
if(SDL_AtomicDecRef(&ht->num_operations)) {
SDL_AtomicSet(&ht->cur_operation, HT_OP_NONE);
}
if(SDL_AtomicDecRef(&ht->num_operations)) {
SDL_AtomicSet(&ht->cur_operation, HT_OP_NONE);
}
}
#endif
void hashtable_lock(Hashtable *ht) {
assert(ht != NULL);
hashtable_enter_state(ht, HT_OP_READ, false);
assert(ht != NULL);
hashtable_enter_state(ht, HT_OP_READ, false);
}
<