]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/player_layer.c
Merge pull request #998 from tsoding/824
[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 // TODO(#1001): PlayerLayer does not support UndoHistory
12
13 PlayerLayer create_player_layer(Vec position, Color color)
14 {
15     return (PlayerLayer) {
16         .position = position,
17         .color_picker = create_color_picker_from_rgba(color),
18     };
19 }
20
21 PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
22 {
23     trace_assert(line_stream);
24
25     const char *line = line_stream_next(line_stream);
26     trace_assert(line);
27
28     char colorstr[7] = "000000";
29     Point position = vec(0.0f, 0.0f);
30
31     const int bound =
32         sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
33
34 #define BOUND_EXPECTED 3
35     if (bound != BOUND_EXPECTED) {
36         log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
37                  bound, BOUND_EXPECTED);
38     }
39 #undef BOUND_EXPECTED
40
41     return create_player_layer(position, hexstr(colorstr));
42 }
43
44 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
45 {
46     LayerPtr layer = {
47         .type = LAYER_PLAYER,
48         .ptr = player_layer
49     };
50     return layer;
51 }
52
53 int player_layer_render(const PlayerLayer *player_layer,
54                         Camera *camera,
55                         int active)
56 {
57     trace_assert(player_layer);
58     trace_assert(camera);
59
60     if (camera_fill_rect(
61             camera,
62             rect_from_vecs(
63                 player_layer->position,
64                 vec(25.0f, 25.0f)),
65             color_scale(
66                 color_picker_rgba(&player_layer->color_picker),
67                 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
68         return -1;
69     }
70
71     if (active && color_picker_render(&player_layer->color_picker, camera)) {
72         return -1;
73     }
74
75     return 0;
76 }
77
78
79 int player_layer_event(PlayerLayer *player_layer,
80                        const SDL_Event *event,
81                        const Camera *camera,
82                        UndoHistory *undo_history)
83 {
84     trace_assert(player_layer);
85     trace_assert(event);
86     trace_assert(camera);
87     trace_assert(undo_history);
88
89     int selected = 0;
90     if (color_picker_event(
91             &player_layer->color_picker,
92             event,
93             &selected) < 0) {
94         return -1;
95     }
96
97     if (!selected &&
98         event->type == SDL_MOUSEBUTTONDOWN &&
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
106     return 0;
107 }
108
109 int player_layer_dump_stream(const PlayerLayer *player_layer,
110                              FILE *filedump)
111 {
112     trace_assert(player_layer);
113     trace_assert(filedump);
114
115     fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
116     color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
117     fprintf(filedump, "\n");
118
119     return 0;
120 }