diff --git a/game/src/event/evtman.c b/game/src/event/evtman.c index 7a7f329..9788929 100644 --- a/game/src/event/evtman.c +++ b/game/src/event/evtman.c @@ -26,6 +26,32 @@ evt_pred_flag (SDL_Event *event, void *data) return flags_get (flag); } +bool +evt_cpred_and (SDL_Event *event, void *data) +{ + CompositePredicate *cp = data; + return cp->a (event, cp->a_data) && cp->b (event, cp->b_data); +} + +bool +evt_cpred_or (SDL_Event *event, void *data) +{ + CompositePredicate *cp = data; + return cp->a (event, cp->a_data) || cp->b (event, cp->b_data); +} + +CompositePredicate * +evt_pred_compose (bool (*a) (SDL_Event *sdl_event, void *userdata), void *a_data, + bool (*b) (SDL_Event *sdl_event, void *userdata), void *b_data) +{ + CompositePredicate *out = g_new (CompositePredicate, 1); + out->a = a; + out->a_data = a_data; + out->b = b; + out->b_data = b_data; + return out; +} + bool evt_cb_rotate_camera (SDL_Event *event, void *userdata) { @@ -68,8 +94,6 @@ void evtman_init () { #define KEY(k) GINT_TO_POINTER(k) - - evtman_add_handler (2, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY(SDLK_F1), evt_cb_flag_switch, "wireframe_enabled"); /* The UI effectively eats most SDL events, as it needs it for it's own calculations. */ evtman_add_handler (1, SDL_EVENT_KEY_DOWN, evt_pred_flag, "ui_has_focus", uiman_cb_key_down, NULL); @@ -90,7 +114,12 @@ evtman_init () evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_D), evt_cb_flag_off, "moving_right"); evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_TAB), uiman_cb_switch_focus, NULL); evtman_add_handler (0, SDL_EVENT_MOUSE_MOTION, NULL, NULL, evt_cb_rotate_camera, NULL); - + + evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_SPACE), evt_cb_flag_on, "flying_up"); + evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_SPACE), evt_cb_flag_off, "flying_up"); + evtman_add_handler (0, SDL_EVENT_KEY_DOWN, evt_pred_key, KEY (SDLK_LSHIFT), evt_cb_flag_on, "flying_down"); + evtman_add_handler (0, SDL_EVENT_KEY_UP, evt_pred_key, KEY (SDLK_LSHIFT), evt_cb_flag_off, "flying_down"); + #undef KEY } diff --git a/game/src/event/evtman.h b/game/src/event/evtman.h index 6c7132f..377b0fc 100644 --- a/game/src/event/evtman.h +++ b/game/src/event/evtman.h @@ -9,6 +9,14 @@ #include "../flags.h" #include "../ui/uiman.h" +typedef struct CompositePredicate +{ + bool (*a) (SDL_Event *sdl_event, void *userdata); + void *a_data; + bool (*b) (SDL_Event *sdl_event, void *userdata); + void *b_data; +} CompositePredicate; + void evtman_init (); void evtman_add_handler (int priority, unsigned int filter, diff --git a/game/src/state.c b/game/src/state.c index 64628ca..cbfe54c 100644 --- a/game/src/state.c +++ b/game/src/state.c @@ -66,4 +66,20 @@ game_state_tick (int ticks) glm_vec3_sub (player_entity->position, change, new_pos); glm_vec3_copy (new_pos, player_entity->position); } + + if (flags_get ("flying_up") && flags_get ("flight_enabled")) + { + vec3 change, new_pos; + glm_vec3_scale (GLM_YUP, delta_time * 5, change); + glm_vec3_add (player_entity->position, change, new_pos); + glm_vec3_copy (new_pos, player_entity->position); + } + + if (flags_get ("flying_down") && flags_get ("flight_enabled")) + { + vec3 change, new_pos; + glm_vec3_scale (GLM_YUP, delta_time * 5, change); + glm_vec3_sub (player_entity->position, change, new_pos); + glm_vec3_copy (new_pos, player_entity->position); + } }