]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/player_layer.c
2ef4124d12655dfe9c77312fabc1e80963511a86
[nothing.git] / src / game / level / level_editor / player_layer.c
1 #include <stdio.h>
2
3 #include <SDL.h>
4
5 #include "game/camera.h"
6 #include "system/stacktrace.h"
7 #include "player_layer.h"
8 #include "system/nth_alloc.h"
9 #include "system/log.h"
10
11 PlayerLayer *create_player_layer_from_line_stream(LineStream *line_stream)
12 {
13     trace_assert(line_stream);
14
15     Lt *lt = create_lt();
16
17     PlayerLayer *player_layer = PUSH_LT(lt, nth_calloc(1, sizeof(PlayerLayer)), free);
18     player_layer->lt = lt;
19
20     char colorstr[7];
21
22     const char *line = line_stream_next(line_stream);
23     if (line == NULL) {
24         log_fail("Could not read Player Layer\n");
25         RETURN_LT(lt, NULL);
26     }
27
28     if (sscanf(line,
29                "%f%f%6s",
30                &player_layer->position.x,
31                &player_layer->position.y,
32                colorstr) == EOF) {
33         log_fail("Could not read Player Layer\n");
34         RETURN_LT(lt, NULL);
35     }
36     player_layer->color_picker.color = hexstr(colorstr);
37
38     return player_layer;
39 }
40
41 void destroy_player_layer(PlayerLayer *player_layer)
42 {
43     trace_assert(player_layer);
44     destroy_lt(player_layer->lt);
45 }
46
47 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
48 {
49     LayerPtr layer = {
50         .type = LAYER_PLAYER,
51         .ptr = player_layer
52     };
53     return layer;
54 }
55
56 int player_layer_render(const PlayerLayer *player_layer,
57                         Camera *camera,
58                         float fa)
59 {
60     trace_assert(player_layer);
61     trace_assert(camera);
62
63     if (camera_fill_rect(
64             camera,
65             rect_from_vecs(
66                 player_layer->position,
67                 vec(25.0f, 25.0f)),
68             color_scale(
69                 player_layer->color_picker.color,
70                 rgba(1.0f, 1.0f, 1.0f, fa))) < 0) {
71         return -1;
72     }
73
74     return 0;
75 }
76
77
78 int player_layer_event(PlayerLayer *player_layer,
79                        const SDL_Event *event,
80                        const Camera *camera)
81 {
82     trace_assert(player_layer);
83     trace_assert(event);
84     trace_assert(camera);
85
86     switch (event->type) {
87     case SDL_MOUSEBUTTONDOWN:
88     case SDL_MOUSEBUTTONUP: {
89         bool selected = false;
90         if (color_picker_mouse_button(
91                 &player_layer->color_picker,
92                 &event->button,
93                 &selected) < 0) {
94             return -1;
95         }
96
97         if (!selected &&
98             event->type == SDL_MOUSEBUTTONUP &&
99             event->button.button == SDL_BUTTON_LEFT) {
100             player_layer->position =
101                 camera_map_screen(camera,
102                                   event->button.x,
103                                   event->button.y);
104         }
105     } break;
106     }
107
108     return 0;
109 }