X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel%2Flevel_editor.c;h=5ee2379355b963ba8f9b7b2b0d56ca31495a3223;hb=56e308932f300c06da3611a7687de6882da60d6f;hp=11af440e5e463a541e20980e8c13c23282f21593;hpb=bae44e2446026aea05b81fc39526c64b70935c2e;p=nothing.git diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index 11af440e..5ee23793 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -3,7 +3,6 @@ #include "game/camera.h" #include "game/sound_samples.h" #include "game/level/boxes.h" -#include "game/level/level_editor/action_picker.h" #include "game/level/level_editor/color_picker.h" #include "game/level/level_editor/rect_layer.h" #include "game/level/level_editor/point_layer.h" @@ -19,17 +18,18 @@ #include "system/str.h" #include "config.h" #include "math/extrema.h" +#include "system/file.h" #include "level_editor.h" #define LEVEL_FOLDER_MAX_LENGTH 512 -#define LEVEL_LINE_MAX_LENGTH 512 #define LEVEL_EDITOR_EDIT_FIELD_SIZE vec(5.0f, 5.0f) #define LEVEL_EDITOR_EDIT_FIELD_COLOR COLOR_BLACK #define LEVEL_EDITOR_NOTICE_SCALE vec(10.0f, 10.0f) #define LEVEL_EDITOR_NOTICE_DURATION 1.0f #define LEVEL_EDITOR_NOTICE_PADDING_TOP 100.0f +#define LEVEL_EDITOR_TMPMEM_CAPACITY (640 * KILO) static int level_editor_dump(LevelEditor *level_editor); @@ -47,60 +47,16 @@ LevelEditor *create_level_editor(Cursor *cursor) } level_editor->lt = lt; - level_editor->edit_field_filename = PUSH_LT( - lt, - create_edit_field( - LEVEL_EDITOR_EDIT_FIELD_SIZE, - LEVEL_EDITOR_EDIT_FIELD_COLOR), - destroy_edit_field); - if (level_editor->edit_field_filename == NULL) { - RETURN_LT(lt, NULL); - } + level_editor->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE; + level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR; level_editor->background_layer = create_background_layer(hexstr("fffda5")); - - level_editor->player_layer = - create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080")); - - level_editor->platforms_layer = PUSH_LT( - lt, - create_rect_layer("platform", cursor), - destroy_rect_layer); - if (level_editor->platforms_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->goals_layer = PUSH_LT( - lt, - create_point_layer("goal"), - destroy_point_layer); - if (level_editor->goals_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->lava_layer = PUSH_LT( - lt, - create_rect_layer("lava", cursor), - destroy_rect_layer); - if (level_editor->lava_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->back_platforms_layer = PUSH_LT( - lt, - create_rect_layer("back_platform", cursor), - destroy_rect_layer); - if (level_editor->back_platforms_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->boxes_layer = PUSH_LT( - lt, - create_rect_layer("box", cursor), - destroy_rect_layer); - if (level_editor->boxes_layer == NULL) { - RETURN_LT(lt, NULL); - } + level_editor->player_layer = create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080")); + level_editor->platforms_layer = create_rect_layer("platform", cursor); + level_editor->goals_layer = create_point_layer("goal"), + level_editor->lava_layer = create_rect_layer("lava", cursor); + level_editor->back_platforms_layer = create_rect_layer("back_platform", cursor); + level_editor->boxes_layer = create_rect_layer("box", cursor); level_editor->label_layer = PUSH_LT( lt, @@ -110,21 +66,15 @@ LevelEditor *create_level_editor(Cursor *cursor) RETURN_LT(lt, NULL); } - level_editor->regions_layer = PUSH_LT( - lt, - create_rect_layer("region", cursor), - destroy_rect_layer); - if (level_editor->regions_layer == NULL) { - RETURN_LT(lt, NULL); - } + level_editor->regions_layer = create_rect_layer("region", cursor), - level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(level_editor->boxes_layer); - level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(level_editor->platforms_layer); - level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(level_editor->back_platforms_layer); - level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); + level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer); + level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer); + level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer); + level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(&level_editor->goals_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); - level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(level_editor->lava_layer); - level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(level_editor->regions_layer); + level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer); + level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer); level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); @@ -139,6 +89,8 @@ LevelEditor *create_level_editor(Cursor *cursor) level_editor->camera_scale = 1.0f; + level_editor->undo_history = create_undo_history(); + return level_editor; } @@ -156,15 +108,8 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor } level_editor->lt = lt; - level_editor->edit_field_filename = PUSH_LT( - lt, - create_edit_field( - LEVEL_EDITOR_EDIT_FIELD_SIZE, - LEVEL_EDITOR_EDIT_FIELD_COLOR), - destroy_edit_field); - if (level_editor->edit_field_filename == NULL) { - RETURN_LT(lt, NULL); - } + level_editor->edit_field_filename.font_size = LEVEL_EDITOR_EDIT_FIELD_SIZE; + level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR; level_editor->file_name = PUSH_LT( @@ -172,118 +117,45 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor string_duplicate(file_name, NULL), free); - LineStream *level_stream = PUSH_LT( - lt, - create_line_stream( - file_name, - "r", - LEVEL_LINE_MAX_LENGTH), - destroy_line_stream); - if (level_stream == NULL) { - RETURN_LT(lt, NULL); - } + Memory tmpmem = { + .capacity = LEVEL_EDITOR_TMPMEM_CAPACITY, + .buffer = malloc(LEVEL_EDITOR_TMPMEM_CAPACITY), + }; + trace_assert(tmpmem.buffer); - const char *line = line_stream_next(level_stream); - if (line == NULL) { - RETURN_LT(lt, NULL); - } + String input = read_whole_file(&tmpmem, file_name); + trace_assert(input.data); - char version[METADATA_VERSION_MAX_SIZE] = {0}; - memcpy(version, line, - MIN(size_t, - strlen(line), - METADATA_VERSION_MAX_SIZE - 1)); - trim_endline(version); - - if (strcmp(version, "1") == 0) { - if (line_stream_next(level_stream) == NULL) - RETURN_LT(lt, NULL); - } else if (strcmp(version, "2") == 0) { + String version = trim(chop_by_delim(&input, '\n')); + + if (string_equal(version, STRING_LIT("1"))) { + chop_by_delim(&input, '\n'); + } else if (string_equal(version, STRING_LIT("2"))) { // Nothing } else { log_fail("Version `%s` is not supported. Expected version `%s`.\n", - version, VERSION); + string_to_cstr(&tmpmem, version), + VERSION); RETURN_LT(lt, NULL); } - if (background_layer_read_from_line_stream( - &level_editor->background_layer, - level_stream) < 0) { - RETURN_LT(lt, NULL); - } - - level_editor->player_layer = - create_player_layer_from_line_stream(level_stream); - - level_editor->platforms_layer = - PUSH_LT( - lt, - create_rect_layer_from_line_stream(level_stream, "platform", cursor), - destroy_rect_layer); - if (level_editor->platforms_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->goals_layer = PUSH_LT( - lt, - create_point_layer_from_line_stream(level_stream, "goal"), - destroy_point_layer); - if (level_editor->goals_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->lava_layer = - PUSH_LT( - lt, - create_rect_layer_from_line_stream(level_stream, "lava", cursor), - destroy_rect_layer); - if (level_editor->lava_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->back_platforms_layer = - PUSH_LT( - lt, - create_rect_layer_from_line_stream(level_stream, "back_platform", cursor), - destroy_rect_layer); - if (level_editor->back_platforms_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->boxes_layer = - PUSH_LT( - lt, - create_rect_layer_from_line_stream(level_stream, "box", cursor), - destroy_rect_layer); - if (level_editor->boxes_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->label_layer = - PUSH_LT( - lt, - create_label_layer_from_line_stream(level_stream, "label"), - destroy_label_layer); - if (level_editor->label_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->regions_layer = - PUSH_LT( - lt, - create_rect_layer_from_line_stream(level_stream, "region", cursor), - destroy_rect_layer); - if (level_editor->regions_layer == NULL) { - RETURN_LT(lt, NULL); - } - - level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(level_editor->boxes_layer); - level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(level_editor->platforms_layer); - level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(level_editor->back_platforms_layer); - level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); + level_editor->background_layer = chop_background_layer(&input); + level_editor->player_layer = chop_player_layer(&tmpmem, &input); + level_editor->platforms_layer = chop_rect_layer(&tmpmem, &input, "platform", cursor); + level_editor->goals_layer = chop_point_layer(&tmpmem, &input, "goal"); + level_editor->lava_layer = chop_rect_layer(&tmpmem, &input, "lava", cursor); + level_editor->back_platforms_layer = chop_rect_layer(&tmpmem, &input, "back_platform", cursor); + level_editor->boxes_layer = chop_rect_layer(&tmpmem, &input, "box", cursor); + level_editor->label_layer = chop_label_layer(&tmpmem, &input, "label"); + level_editor->regions_layer = chop_rect_layer(&tmpmem, &input, "region", cursor), + + level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer); + level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer); + level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer); + level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(&level_editor->goals_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); - level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(level_editor->lava_layer); - level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(level_editor->regions_layer); + level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer); + level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer); level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); @@ -300,6 +172,10 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor level_editor->camera_scale = 1.0f; + level_editor->undo_history = create_undo_history(); + + free(tmpmem.buffer); + return level_editor; } @@ -363,7 +239,7 @@ int level_editor_render(const LevelEditor *level_editor, position); if (edit_field_render_screen( - level_editor->edit_field_filename, + &level_editor->edit_field_filename, camera, vec(position.x + save_as_width, position.y)) < 0) { return -1; @@ -399,7 +275,7 @@ int level_editor_saveas_event(LevelEditor *level_editor, path, LEVEL_FOLDER_MAX_LENGTH, "./assets/levels/%s.txt", - edit_field_as_text(level_editor->edit_field_filename)); + edit_field_as_text(&level_editor->edit_field_filename)); level_editor->file_name = PUSH_LT( level_editor->lt, string_duplicate(path, NULL), @@ -412,7 +288,7 @@ int level_editor_saveas_event(LevelEditor *level_editor, } break; } - return edit_field_event(level_editor->edit_field_filename, event); + return edit_field_event(&level_editor->edit_field_filename, event); } static