X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel%2Flevel_editor.c;h=f69d6adcff704b4352803f3b4c5393b5738364f6;hb=c1021a9d6a49eae97ad17755414279530ca9e21c;hp=2f2b0faa292e9279808e803c568c811f6086933d;hpb=047f6f799bb7b475e570523e3c81f8927819be8f;p=nothing.git diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index 2f2b0faa..f69d6adc 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -2,9 +2,7 @@ #include "game/camera.h" #include "game/sound_samples.h" -#include "game/level_metadata.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" @@ -14,15 +12,15 @@ #include "ui/edit_field.h" #include "system/stacktrace.h" #include "system/nth_alloc.h" -#include "system/lt.h" -#include "system/lt_adapters.h" #include "system/log.h" #include "system/str.h" #include "config.h" +#include "math/extrema.h" +#include "system/file.h" #include "level_editor.h" -#define LEVEL_LINE_MAX_LENGTH 512 +#define LEVEL_FOLDER_MAX_LENGTH 512 #define LEVEL_EDITOR_EDIT_FIELD_SIZE vec(5.0f, 5.0f) #define LEVEL_EDITOR_EDIT_FIELD_COLOR COLOR_BLACK @@ -34,96 +32,24 @@ static int level_editor_dump(LevelEditor *level_editor); // TODO(#994): too much duplicate code between create_level_editor and create_level_editor_from_file -LevelEditor *create_level_editor(Cursor *cursor) +LevelEditor *create_level_editor_from_memory(Memory *memory, Cursor *cursor) { - Lt *lt = create_lt(); - LevelEditor *level_editor = PUSH_LT( - lt, - nth_calloc(1, sizeof(LevelEditor)), - free); - if (level_editor == NULL) { - RETURN_LT(lt, NULL); - } - level_editor->lt = lt; + LevelEditor *level_editor = memory_alloc(memory, sizeof(LevelEditor)); + memset(level_editor, 0, sizeof(*level_editor)); - 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->metadata = PUSH_LT( - lt, - create_level_metadata("New Level"), - destroy_level_metadata); - if (level_editor->metadata == 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->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->label_layer = PUSH_LT( - lt, - create_label_layer("label"), - destroy_label_layer); - if (level_editor->label_layer == NULL) { - 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->platforms_layer = create_rect_layer_from_memory(memory, "platform", cursor); + level_editor->lava_layer = create_rect_layer_from_memory(memory, "lava", cursor); + level_editor->back_platforms_layer = create_rect_layer_from_memory(memory, "back_platform", cursor); + level_editor->boxes_layer = create_rect_layer_from_memory(memory, "box", cursor); + level_editor->regions_layer = create_rect_layer_from_memory(memory, "region", cursor); + level_editor->goals_layer = create_point_layer_from_memory(memory, "goal"); + level_editor->label_layer = create_label_layer_from_memory(memory, "label"); 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); @@ -135,6 +61,7 @@ LevelEditor *create_level_editor(Cursor *cursor) 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); + level_editor->notice = (FadingWigglyText) { .wiggly_text = { .text = "Level saved", @@ -145,163 +72,50 @@ LevelEditor *create_level_editor(Cursor *cursor) }; level_editor->camera_scale = 1.0f; + level_editor->undo_history = create_undo_history_from_memory(memory); return level_editor; } -LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor) +LevelEditor *create_level_editor_from_file_with_memory(Memory *memory, Cursor *cursor, const char *file_name) { + trace_assert(memory); + trace_assert(cursor); trace_assert(file_name); - Lt *lt = create_lt(); - LevelEditor *level_editor = PUSH_LT( - lt, - nth_calloc(1, sizeof(LevelEditor)), - free); - if (level_editor == NULL) { - RETURN_LT(lt, NULL); - } - 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->file_name = - PUSH_LT( - lt, - 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); - } - - level_editor->metadata = PUSH_LT( - lt, - create_level_metadata_from_line_stream(level_stream), - destroy_level_metadata); - if (level_editor->metadata == NULL) { - 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); - } + LevelEditor *level_editor = create_level_editor_from_memory(memory, cursor); + level_editor->file_name = strdup_to_memory(memory, file_name); - 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); - } + String input = read_whole_file(memory, file_name); + trace_assert(input.data); - 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); - } + String version = trim(chop_by_delim(&input, '\n')); - 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_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); - level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); - - level_editor->drag = false; - - level_editor->notice = (FadingWigglyText) { - .wiggly_text = { - .text = "Level saved", - .color = rgba(0.0f, 0.0f, 0.0f, 0.0f), - .scale = LEVEL_EDITOR_NOTICE_SCALE - }, - .duration = LEVEL_EDITOR_NOTICE_DURATION, - }; - - level_editor->camera_scale = 1.0f; + 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", + string_to_cstr(memory, version), + VERSION); + return NULL; + } + + level_editor->background_layer = chop_background_layer(&input); + level_editor->player_layer = chop_player_layer(memory, &input); + rect_layer_load(level_editor->platforms_layer, memory, &input); + point_layer_load(level_editor->goals_layer, memory, &input); + rect_layer_load(level_editor->lava_layer, memory, &input); + rect_layer_load(level_editor->back_platforms_layer, memory, &input); + rect_layer_load(level_editor->boxes_layer, memory, &input); + label_layer_load(level_editor->label_layer, memory, &input); + rect_layer_load(level_editor->regions_layer, memory, &input); + undo_history_clean(level_editor->undo_history); return level_editor; } -void destroy_level_editor(LevelEditor *level_editor) -{ - trace_assert(level_editor); - destroy_undo_history(level_editor->undo_history); - RETURN_LT0(level_editor->lt); -} - int level_editor_render(const LevelEditor *level_editor, const Camera *camera) { @@ -347,17 +161,15 @@ int level_editor_render(const LevelEditor *level_editor, (float) strlen(save_as_text) * FONT_CHAR_WIDTH * size.x; /* HTML */ - if (camera_render_text_screen( - camera, - save_as_text, - LEVEL_EDITOR_EDIT_FIELD_SIZE, - LEVEL_EDITOR_EDIT_FIELD_COLOR, - position) < 0) { - return -1; - } + camera_render_text_screen( + camera, + save_as_text, + LEVEL_EDITOR_EDIT_FIELD_SIZE, + LEVEL_EDITOR_EDIT_FIELD_COLOR, + 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; @@ -378,7 +190,8 @@ int level_editor_render(const LevelEditor *level_editor, static int level_editor_saveas_event(LevelEditor *level_editor, const SDL_Event *event, - const Camera *camera) + const Camera *camera, + Memory *memory) { trace_assert(level_editor); trace_assert(event); @@ -388,13 +201,13 @@ int level_editor_saveas_event(LevelEditor *level_editor, case SDL_KEYDOWN: { if (event->key.keysym.sym == SDLK_RETURN) { trace_assert(level_editor->file_name == NULL); - char file_name_buffer[640] ="./assets/levels//"; - strcat(file_name_buffer, edit_field_as_text(level_editor->edit_field_filename)); - strcat(file_name_buffer, ".txt"); - level_editor->file_name = PUSH_LT( - level_editor->lt, - string_duplicate(file_name_buffer, NULL), - free); + char path[LEVEL_FOLDER_MAX_LENGTH]; + snprintf( + path, + LEVEL_FOLDER_MAX_LENGTH, + "./assets/levels/%s.txt", + edit_field_as_text(&level_editor->edit_field_filename)); + level_editor->file_name = strdup_to_memory(memory, path); level_editor_dump(level_editor); SDL_StopTextInput(); level_editor->state = LEVEL_EDITOR_IDLE; @@ -403,7 +216,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 @@ -432,10 +245,10 @@ int level_editor_idle_event(LevelEditor *level_editor, case SDLK_z: { if (event->key.keysym.mod & KMOD_CTRL) { - if (undo_history_empty(&level_editor->undo_history)) { + if (undo_history_empty(level_editor->undo_history)) { level_editor->bell = 1; } - undo_history_pop(&level_editor->undo_history); + undo_history_pop(level_editor->undo_history); } } break; } @@ -502,7 +315,7 @@ int level_editor_idle_event(LevelEditor *level_editor, level_editor->layers[level_editor->layer_picker], event, camera, - &level_editor->undo_history) < 0) { + level_editor->undo_history) < 0) { return -1; } } else { @@ -515,7 +328,8 @@ int level_editor_idle_event(LevelEditor *level_editor, int level_editor_event(LevelEditor *level_editor, const SDL_Event *event, - Camera *camera) + Camera *camera, + Memory *memory) { trace_assert(level_editor); trace_assert(event); @@ -526,7 +340,7 @@ int level_editor_event(LevelEditor *level_editor, return level_editor_idle_event(level_editor, event, camera); case LEVEL_EDITOR_SAVEAS: - return level_editor_saveas_event(level_editor, event, camera); + return level_editor_saveas_event(level_editor, event, camera, memory); } return 0; @@ -557,12 +371,10 @@ static int level_editor_dump(LevelEditor *level_editor) { trace_assert(level_editor); - FILE *filedump = PUSH_LT( - level_editor->lt, - fopen(level_editor->file_name, "w"), - fclose_lt); + FILE *filedump = fopen(level_editor->file_name, "w"); + trace_assert(filedump); - if (fprintf(filedump, "%s\n", level_metadata_title(level_editor->metadata)) < 0) { + if (fprintf(filedump, "%s\n", VERSION) < 0) { return -1; } @@ -574,7 +386,7 @@ static int level_editor_dump(LevelEditor *level_editor) } } - fclose(RELEASE_LT(level_editor->lt, filedump)); + fclose(filedump); fading_wiggly_text_reset(&level_editor->notice); level_editor->save = 1;