]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/player_layer.c
(#824) Introduce UndoHistory
[nothing.git] / src / game / level / level_editor / player_layer.c
index 2ef4124d12655dfe9c77312fabc1e80963511a86..37955e1d857d40ea8fc647ccfb8f4dc1ded9ba5a 100644 (file)
@@ -8,40 +8,35 @@
 #include "system/nth_alloc.h"
 #include "system/log.h"
 
-PlayerLayer *create_player_layer_from_line_stream(LineStream *line_stream)
+PlayerLayer create_player_layer(Vec position, Color color)
+{
+    return (PlayerLayer) {
+        .position = position,
+        .color_picker = create_color_picker_from_rgba(color),
+    };
+}
+
+PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
 {
     trace_assert(line_stream);
 
-    Lt *lt = create_lt();
+    const char *line = line_stream_next(line_stream);
+    trace_assert(line);
 
-    PlayerLayer *player_layer = PUSH_LT(lt, nth_calloc(1, sizeof(PlayerLayer)), free);
-    player_layer->lt = lt;
+    char colorstr[7] = "000000";
+    Point position = vec(0.0f, 0.0f);
 
-    char colorstr[7];
+    const int bound =
+        sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
 
-    const char *line = line_stream_next(line_stream);
-    if (line == NULL) {
-        log_fail("Could not read Player Layer\n");
-        RETURN_LT(lt, NULL);
+#define BOUND_EXPECTED 3
+    if (bound != BOUND_EXPECTED) {
+        log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
+                 bound, BOUND_EXPECTED);
     }
+#undef BOUND_EXPECTED
 
-    if (sscanf(line,
-               "%f%f%6s",
-               &player_layer->position.x,
-               &player_layer->position.y,
-               colorstr) == EOF) {
-        log_fail("Could not read Player Layer\n");
-        RETURN_LT(lt, NULL);
-    }
-    player_layer->color_picker.color = hexstr(colorstr);
-
-    return player_layer;
-}
-
-void destroy_player_layer(PlayerLayer *player_layer)
-{
-    trace_assert(player_layer);
-    destroy_lt(player_layer->lt);
+    return create_player_layer(position, hexstr(colorstr));
 }
 
 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
@@ -55,7 +50,7 @@ LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
 
 int player_layer_render(const PlayerLayer *player_layer,
                         Camera *camera,
-                        float fa)
+                        int active)
 {
     trace_assert(player_layer);
     trace_assert(camera);
@@ -66,8 +61,12 @@ int player_layer_render(const PlayerLayer *player_layer,
                 player_layer->position,
                 vec(25.0f, 25.0f)),
             color_scale(
-                player_layer->color_picker.color,
-                rgba(1.0f, 1.0f, 1.0f, fa))) < 0) {
+                color_picker_rgba(&player_layer->color_picker),
+                rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
+        return -1;
+    }
+
+    if (active && color_picker_render(&player_layer->color_picker, camera)) {
         return -1;
     }
 
@@ -83,27 +82,36 @@ int player_layer_event(PlayerLayer *player_layer,
     trace_assert(event);
     trace_assert(camera);
 
-    switch (event->type) {
-    case SDL_MOUSEBUTTONDOWN:
-    case SDL_MOUSEBUTTONUP: {
-        bool selected = false;
-        if (color_picker_mouse_button(
-                &player_layer->color_picker,
-                &event->button,
-                &selected) < 0) {
-            return -1;
-        }
-
-        if (!selected &&
-            event->type == SDL_MOUSEBUTTONUP &&
-            event->button.button == SDL_BUTTON_LEFT) {
-            player_layer->position =
-                camera_map_screen(camera,
-                                  event->button.x,
-                                  event->button.y);
-        }
-    } break;
+
+    int selected = 0;
+    if (color_picker_event(
+            &player_layer->color_picker,
+            event,
+            &selected) < 0) {
+        return -1;
     }
 
+    if (!selected &&
+        event->type == SDL_MOUSEBUTTONDOWN &&
+        event->button.button == SDL_BUTTON_LEFT) {
+        player_layer->position =
+            camera_map_screen(camera,
+                              event->button.x,
+                              event->button.y);
+    }
+
+    return 0;
+}
+
+int player_layer_dump_stream(const PlayerLayer *player_layer,
+                             FILE *filedump)
+{
+    trace_assert(player_layer);
+    trace_assert(filedump);
+
+    fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
+    color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
+    fprintf(filedump, "\n");
+
     return 0;
 }