]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/player_layer.c
Merge pull request #873 from tsoding/858
[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     line = line_stream_next(line_stream);
39     if (line == NULL) {
40         log_fail("Could not read Player Layer\n");
41         RETURN_LT(lt, NULL);
42     }
43
44     size_t n;
45     if (sscanf(line, "%lu", &n) == EOF) {
46         log_fail("Could not read Player Layer\n");
47         RETURN_LT(lt, NULL);
48     }
49
50     player_layer->source_code = PUSH_LT(
51         lt, line_stream_collect_n_lines(line_stream, n), free);
52     if (player_layer->source_code == NULL) {
53         log_fail("Could not read Player Layer\n");
54         RETURN_LT(lt, NULL);
55     }
56
57     return player_layer;
58 }
59
60 void destroy_player_layer(PlayerLayer *player_layer)
61 {
62     trace_assert(player_layer);
63     destroy_lt(player_layer->lt);
64 }
65
66 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
67 {
68     LayerPtr layer = {
69         .type = LAYER_PLAYER,
70         .ptr = player_layer
71     };
72     return layer;
73 }
74
75 int player_layer_render(const PlayerLayer *player_layer,
76                         Camera *camera,
77                         float fa)
78 {
79     trace_assert(player_layer);
80     trace_assert(camera);
81
82     if (camera_fill_rect(
83             camera,
84             rect_from_vecs(
85                 player_layer->position,
86                 vec(25.0f, 25.0f)),
87             color_scale(
88                 player_layer->color_picker.color,
89                 rgba(1.0f, 1.0f, 1.0f, fa))) < 0) {
90         return -1;
91     }
92
93     return 0;
94 }
95
96 // TODO(#859): PlayerLayer does not allow to change to position of the Player
97
98 int player_layer_event(PlayerLayer *player_layer,
99                        const SDL_Event *event,
100                        const Camera *camera)
101 {
102     trace_assert(player_layer);
103     trace_assert(event);
104     trace_assert(camera);
105
106     switch (event->type) {
107     case SDL_MOUSEBUTTONDOWN:
108     case SDL_MOUSEBUTTONUP: {
109         bool selected = false;
110         if (color_picker_mouse_button(
111                 &player_layer->color_picker,
112                 &event->button,
113                 &selected) < 0) {
114             return -1;
115         }
116
117         if (!selected &&
118             event->type == SDL_MOUSEBUTTONUP &&
119             event->button.button == SDL_BUTTON_LEFT) {
120             player_layer->position =
121                 camera_map_screen(camera,
122                                   event->button.x,
123                                   event->button.y);
124         }
125     } break;
126     }
127
128     return 0;
129 }