#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)
int player_layer_render(const PlayerLayer *player_layer,
Camera *camera,
- float fa)
+ int active)
{
trace_assert(player_layer);
trace_assert(camera);
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;
}
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;
}