X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel.c;h=eeb5b65478b93c2a4145b50a22b23eddec18bd23;hb=c1021a9d6a49eae97ad17755414279530ca9e21c;hp=2ef906dc5b23e409d989a8cf98a1fee8841da146;hpb=1dc79a17203f01f7a3e3127af13d92dc85e14e69;p=nothing.git diff --git a/src/game/level.c b/src/game/level.c index 2ef906dc..eeb5b654 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -1,10 +1,7 @@ #include #include "system/stacktrace.h" -#include "broadcast.h" #include "color.h" -#include "ebisp/builtins.h" -#include "ebisp/interpreter.h" #include "game/camera.h" #include "game/level.h" #include "game/level/background.h" @@ -16,28 +13,32 @@ #include "game/level/player.h" #include "game/level/regions.h" #include "game/level/rigid_bodies.h" -#include "game/level_metadata.h" -#include "game/level/level_editor/proto_rect.h" #include "game/level/level_editor/rect_layer.h" #include "game/level/level_editor/point_layer.h" #include "game/level/level_editor/player_layer.h" #include "game/level/level_editor/label_layer.h" -#include "system/line_stream.h" +#include "game/level/level_editor/background_layer.h" #include "system/log.h" #include "system/lt.h" #include "system/nth_alloc.h" #include "system/str.h" #include "game/level/level_editor.h" -#include "game/level/script.h" +#include "ui/console.h" #define LEVEL_GRAVITY 1500.0f +#define JOYSTICK_THRESHOLD 1000 + +typedef enum { + LEVEL_STATE_IDLE = 0, + LEVEL_STATE_PAUSE +} LevelState; struct Level { Lt *lt; - LevelMetadata *metadata; - Background *background; + LevelState state; + Background background; RigidBodies *rigid_bodies; Player *player; Platforms *platforms; @@ -47,15 +48,11 @@ struct Level Boxes *boxes; Labels *labels; Regions *regions; - Broadcast *broadcast; - Script *supa_script; }; -Level *create_level_from_level_editor(const LevelEditor *level_editor, - Broadcast *broadcast) +Level *create_level_from_level_editor(const LevelEditor *level_editor) { trace_assert(level_editor); - trace_assert(broadcast); Lt *lt = create_lt(); @@ -68,13 +65,9 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor, } level->lt = lt; - level->background = PUSH_LT( - lt, - create_background(level_editor->background_layer.color), - destroy_background); - if (level->background == NULL) { - RETURN_LT(lt, NULL); - } + level->background = create_background( + color_picker_rgba( + &level_editor->background_layer.color_picker)); level->rigid_bodies = PUSH_LT(lt, create_rigid_bodies(1024), destroy_rigid_bodies); if (level->rigid_bodies == NULL) { @@ -84,9 +77,8 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor, level->player = PUSH_LT( lt, create_player_from_player_layer( - level_editor->player_layer, - level->rigid_bodies, - broadcast), + &level_editor->player_layer, + level->rigid_bodies), destroy_player); if (level->player == NULL) { RETURN_LT(lt, NULL); @@ -142,25 +134,15 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor, level->regions = PUSH_LT( lt, - create_regions_from_rect_layer(level_editor->regions_layer), + create_regions_from_rect_layer( + level_editor->regions_layer, + level->labels, + level->goals), destroy_regions); if (level->regions == NULL) { RETURN_LT(lt, NULL); } - level->broadcast = broadcast; - - level->supa_script = PUSH_LT( - lt, - create_script_from_string( - broadcast, - level_editor->supa_script_source), - destroy_script); - if (level->supa_script == NULL) { - log_fail("Could not construct Supa Script for the level\n"); - RETURN_LT(lt, NULL); - } - return level; } @@ -170,12 +152,11 @@ void destroy_level(Level *level) RETURN_LT0(level->lt); } - -int level_render(const Level *level, Camera *camera) +int level_render(const Level *level, const Camera *camera) { trace_assert(level); - if (background_render(level->background, camera) < 0) { + if (background_render(&level->background, camera) < 0) { return -1; } @@ -219,6 +200,10 @@ int level_update(Level *level, float delta_time) trace_assert(level); trace_assert(delta_time > 0); + if (level->state == LEVEL_STATE_PAUSE) { + return 0; + } + boxes_float_in_lava(level->boxes, level->lava); rigid_bodies_apply_omniforce(level->rigid_bodies, vec(0.0f, LEVEL_GRAVITY)); @@ -227,10 +212,9 @@ int level_update(Level *level, float delta_time) rigid_bodies_collide(level->rigid_bodies, level->platforms); - player_hide_goals(level->player, level->goals); player_die_from_lava(level->player, level->lava); - regions_player_enter(level->regions, level->player, level->supa_script); - regions_player_leave(level->regions, level->player, level->supa_script); + regions_player_enter(level->regions, level->player); + regions_player_leave(level->regions, level->player); goals_update(level->goals, delta_time); lava_update(level->lava, delta_time); @@ -239,23 +223,36 @@ int level_update(Level *level, float delta_time) return 0; } -int level_event(Level *level, const SDL_Event *event) +static +int level_event_idle(Level *level, const SDL_Event *event, + Camera *camera, Sound_samples *sound_samples) { trace_assert(level); - trace_assert(event); switch (event->type) { case SDL_KEYDOWN: switch (event->key.keysym.sym) { + case SDLK_w: + case SDLK_UP: case SDLK_SPACE: { - player_jump(level->player, level->supa_script); + player_jump(level->player); + } break; + + case SDLK_p: { + level->state = LEVEL_STATE_PAUSE; + camera->blackwhite_mode = true; + sound_samples_toggle_pause(sound_samples); + } break; + + case SDLK_l: { + camera_toggle_debug_mode(camera); } break; } break; case SDL_JOYBUTTONDOWN: if (event->jbutton.button == 1) { - player_jump(level->player, level->supa_script); + player_jump(level->player); } break; } @@ -263,21 +260,64 @@ int level_event(Level *level, const SDL_Event *event) return 0; } +static +int level_event_pause(Level *level, const SDL_Event *event, + Camera *camera, Sound_samples *sound_samples) +{ + trace_assert(level); + + switch (event->type) { + case SDL_KEYDOWN: { + switch (event->key.keysym.sym) { + case SDLK_p: { + level->state = LEVEL_STATE_IDLE; + camera->blackwhite_mode = false; + sound_samples_toggle_pause(sound_samples); + } break; + } + } break; + } + + return 0; +} + +int level_event(Level *level, const SDL_Event *event, + Camera *camera, Sound_samples *sound_samples) +{ + trace_assert(level); + trace_assert(event); + + switch (level->state) { + case LEVEL_STATE_IDLE: { + return level_event_idle(level, event, camera, sound_samples); + } break; + + case LEVEL_STATE_PAUSE: { + return level_event_pause(level, event, camera, sound_samples); + } break; + } + + return 0; +} + int level_input(Level *level, const Uint8 *const keyboard_state, SDL_Joystick *the_stick_of_joy) { trace_assert(level); trace_assert(keyboard_state); - (void) the_stick_of_joy; - if (keyboard_state[SDL_SCANCODE_A]) { + if (level->state == LEVEL_STATE_PAUSE) { + return 0; + } + + if (keyboard_state[SDL_SCANCODE_A] || keyboard_state[SDL_SCANCODE_LEFT]) { player_move_left(level->player); - } else if (keyboard_state[SDL_SCANCODE_D]) { + } else if (keyboard_state[SDL_SCANCODE_D] || keyboard_state[SDL_SCANCODE_RIGHT]) { player_move_right(level->player); - } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) { + } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < -JOYSTICK_THRESHOLD) { player_move_left(level->player); - } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) { + } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > JOYSTICK_THRESHOLD) { player_move_right(level->player); } else { player_stop(level->player); @@ -288,6 +328,10 @@ int level_input(Level *level, int level_sound(Level *level, Sound_samples *sound_samples) { + if (level->state == LEVEL_STATE_PAUSE) { + return 0; + } + if (goals_sound(level->goals, sound_samples) < 0) { return -1; } @@ -299,13 +343,12 @@ int level_sound(Level *level, Sound_samples *sound_samples) return 0; } -void level_toggle_debug_mode(Level *level) -{ - background_toggle_debug_mode(level->background); -} - int level_enter_camera_event(Level *level, Camera *camera) { + if (level->state == LEVEL_STATE_PAUSE) { + return 0; + } + player_focus_camera(level->player, camera); camera_scale(camera, 1.0f); @@ -315,38 +358,13 @@ int level_enter_camera_event(Level *level, Camera *camera) return 0; } -struct EvalResult level_send(Level *level, Gc *gc, struct Scope *scope, struct Expr path) +void level_disable_pause_mode(Level *level, Camera *camera, + Sound_samples *sound_samples) { trace_assert(level); - trace_assert(gc); - trace_assert(scope); - - const char *target = NULL; - struct Expr rest = void_expr(); - struct EvalResult res = match_list(gc, "q*", path, &target, &rest); - if (res.is_error) { - return res; - } - - if (strcmp(target, "goal") == 0) { - return goals_send(level->goals, gc, scope, rest); - } else if (strcmp(target, "label") == 0) { - return labels_send(level->labels, gc, scope, rest); - } else if (strcmp(target, "box") == 0) { - return boxes_send(level->boxes, gc, scope, rest); - } else if (strcmp(target, "body-push") == 0) { - long int id = 0, x = 0, y = 0; - res = match_list(gc, "ddd", rest, &id, &x, &y); - if (res.is_error) { - return res; - } - - rigid_bodies_apply_force(level->rigid_bodies, (size_t) id, vec((float) x, (float) y)); - - return eval_success(NIL(gc)); - } else if (strcmp(target, "edit") == 0) { - return eval_success(NIL(gc)); - } - - return unknown_target(gc, "level", target); + trace_assert(camera); + trace_assert(sound_samples); + level->state = LEVEL_STATE_IDLE; + camera->blackwhite_mode = false; + sound_samples_toggle_pause(sound_samples); }