]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level.c
Remove Lt from PointLayer
[nothing.git] / src / game / level.c
index 7932c622bb910a554ce39d879ab19877456de3f2..e61d4e31815f6adf5fb6bd036d3f7cf2adc8ad3d 100644 (file)
@@ -1,10 +1,7 @@
 #include <SDL.h>
 #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"
 #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/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(color_picker_rgba(&level_editor->background_layer)),
-        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) {
@@ -85,8 +78,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
         lt,
         create_player_from_player_layer(
             &level_editor->player_layer,
-            level->rigid_bodies,
-            broadcast),
+            level->rigid_bodies),
         destroy_player);
     if (level->player == NULL) {
         RETURN_LT(lt, NULL);
@@ -94,7 +86,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
 
     level->platforms = PUSH_LT(
         lt,
-        create_platforms_from_rect_layer(level_editor->platforms_layer),
+        create_platforms_from_rect_layer(&level_editor->platforms_layer),
         destroy_platforms);
     if (level->platforms == NULL) {
         RETURN_LT(lt, NULL);
@@ -102,7 +94,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
 
     level->goals = PUSH_LT(
         lt,
-        create_goals_from_point_layer(level_editor->goals_layer),
+        create_goals_from_point_layer(&level_editor->goals_layer),
         destroy_goals);
     if (level->goals == NULL) {
         RETURN_LT(lt, NULL);
@@ -110,7 +102,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
 
     level->lava = PUSH_LT(
         lt,
-        create_lava_from_rect_layer(level_editor->lava_layer),
+        create_lava_from_rect_layer(&level_editor->lava_layer),
         destroy_lava);
     if (level->lava == NULL) {
         RETURN_LT(lt, NULL);
@@ -118,7 +110,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
 
     level->back_platforms = PUSH_LT(
         lt,
-        create_platforms_from_rect_layer(level_editor->back_platforms_layer),
+        create_platforms_from_rect_layer(&level_editor->back_platforms_layer),
         destroy_platforms);
     if (level->back_platforms == NULL) {
         RETURN_LT(lt, NULL);
@@ -126,7 +118,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor,
 
     level->boxes = PUSH_LT(
         lt,
-        create_boxes_from_rect_layer(level_editor->boxes_layer, level->rigid_bodies),
+        create_boxes_from_rect_layer(&level_editor->boxes_layer, level->rigid_bodies),
         destroy_boxes);
     if (level->boxes == 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,17 +260,60 @@ 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) < -JOYSTICK_THRESHOLD) {
         player_move_left(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);
 }