]> git.lizzy.rs Git - nothing.git/commitdiff
Make LevelMetadata transparent
authorrexim <reximkut@gmail.com>
Sun, 8 Dec 2019 23:50:09 +0000 (06:50 +0700)
committerrexim <reximkut@gmail.com>
Sun, 8 Dec 2019 23:50:09 +0000 (06:50 +0700)
src/game/level/level_editor.c
src/game/level/level_editor.h
src/game/level_folder.c
src/game/level_metadata.c
src/game/level_metadata.h

index 796f4a14770e0e08437d62342b2e26e031ad9bff..dcf8229ecdc635e90ca7d4b2a4e812326ce3ed5f 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "level_editor.h"
 
+#define DEFAULT_LEVEL_TITLE "New Level"
+
 #define LEVEL_FOLDER_MAX_LENGTH 512
 #define LEVEL_LINE_MAX_LENGTH 512
 #define LEVEL_EDITOR_EDIT_FIELD_SIZE vec(5.0f, 5.0f)
@@ -57,13 +59,15 @@ LevelEditor *create_level_editor(Cursor *cursor)
         RETURN_LT(lt, NULL);
     }
 
-    level_editor->metadata = PUSH_LT(
-        lt,
-        create_level_metadata(VERSION, "New Level"),
-        destroy_level_metadata);
-    if (level_editor->metadata == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    memset(level_editor->metadata.version, 0, METADATA_VERSION_MAX_SIZE);
+    memcpy(level_editor->metadata.version,
+           VERSION,
+           min_size_t(sizeof(VERSION), METADATA_VERSION_MAX_SIZE - 1));
+
+    memset(level_editor->metadata.title, 0, METADATA_TITLE_MAX_SIZE);
+    memcpy(level_editor->metadata.title,
+           DEFAULT_LEVEL_TITLE,
+           min_size_t(sizeof(DEFAULT_LEVEL_TITLE), METADATA_TITLE_MAX_SIZE - 1));
 
     level_editor->background_layer = create_background_layer(hexstr("fffda5"));
 
@@ -191,11 +195,7 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor
         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) {
+    if (metadata_load_from_line_stream(&level_editor->metadata, level_stream) < 0) {
         RETURN_LT(lt, NULL);
     }
 
@@ -564,11 +564,11 @@ static int level_editor_dump(LevelEditor *level_editor)
         fopen(level_editor->file_name, "w"),
         fclose_lt);
 
-    if (fprintf(filedump, "%s\n", level_metadata_version(level_editor->metadata)) < 0) {
+    if (fprintf(filedump, "%s\n", level_editor->metadata.version) < 0) {
         return -1;
     }
 
-    if (fprintf(filedump, "%s\n", level_metadata_title(level_editor->metadata)) < 0) {
+    if (fprintf(filedump, "%s\n", level_editor->metadata.title) < 0) {
         return -1;
     }
 
index c8d753f7f91709b8e57116074d3bc55b3831bb20..e3d979932491e27a7f634c385439dd9d96a17f28 100644 (file)
@@ -5,10 +5,10 @@
 #include "game/level/level_editor/layer_picker.h"
 #include "game/level/level_editor/undo_history.h"
 #include "game/level/level_editor/action_picker.h"
+#include "game/level_metadata.h"
 #include "ui/wiggly_text.h"
 #include "ui/cursor.h"
 
-typedef struct LevelMetadata LevelMetadata;
 typedef struct LevelEditor LevelEditor;
 typedef struct RectLayer RectLayer;
 typedef struct PointLayer PointLayer;
@@ -31,7 +31,7 @@ struct LevelEditor
     LayerPicker layer_picker;
     FadingWigglyText notice;
 
-    LevelMetadata *metadata;
+    LevelMetadata metadata;
     RectLayer *boxes_layer;
     RectLayer *platforms_layer;
     RectLayer *back_platforms_layer;
index 80b1258893a8c200afd71d7990487cde6c86aa68..3255ab6e35eea2a266754d1c503d4e9cd31f325a 100644 (file)
@@ -45,6 +45,7 @@ LevelFolder *create_level_folder(const char *dirpath)
     char path[LEVEL_FOLDER_MAX_LENGTH];
     DIR *level_dir = PUSH_LT(lt, opendir(dirpath), closedir_lt);
 
+    LevelMetadata level_metadata;
     for (struct dirent *d = readdir(level_dir);
          d != NULL;
          d = readdir(level_dir)) {
@@ -58,20 +59,18 @@ LevelFolder *create_level_folder(const char *dirpath)
             RETURN_LT(lt, NULL);
         }
 
-        LevelMetadata *level_metadata = create_level_metadata_from_file(filepath);
-        if (level_metadata == NULL) {
+        if (metadata_load_from_file(&level_metadata, filepath) < 0) {
             RETURN_LT(lt, NULL);
         }
 
         const char *version = PUSH_LT(
             lt,
-            string_duplicate(level_metadata_version(level_metadata), NULL),
+            string_duplicate(level_metadata.version, NULL),
             free);
         const char *title = PUSH_LT(
             lt,
-            string_duplicate(level_metadata_title(level_metadata), NULL),
+            string_duplicate(level_metadata.title, NULL),
             free);
-        destroy_level_metadata(level_metadata);
 
         if(strcmp(version, VERSION) == 0) {
             dynarray_push(&level_folder->titles, &title);
index 1c446dc7059338d85e2de3acaa10f80696576b1c..25a997dae89b1495f8b8b0d0588408c0744630d8 100644 (file)
@@ -15,95 +15,43 @@ struct LevelMetadata
     const char *title;
 };
 
-LevelMetadata *create_level_metadata(const char *version, const char *title)
+int metadata_load_from_line_stream(LevelMetadata *metadata,
+                                   LineStream *line_stream)
 {
-    trace_assert(version);
-    trace_assert(title);
+    trace_assert(metadata);
+    trace_assert(line_stream);
+
+    memset(metadata->version, 0, METADATA_VERSION_MAX_SIZE);
+    memset(metadata->title, 0, METADATA_TITLE_MAX_SIZE);
 
-    Lt *lt = create_lt();
+    const char *line = line_stream_next(line_stream);
+    if (line == NULL) return -1;
 
-    LevelMetadata *level_metadata = PUSH_LT(
-        lt, nth_calloc(1, sizeof(LevelMetadata)), free);
-    if (level_metadata == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-    level_metadata->lt = lt;
+    memcpy(metadata->version,
+           line,
+           min_size_t(strlen(line), METADATA_VERSION_MAX_SIZE - 1));
+    trim_endline(metadata->version);
 
-    level_metadata->version = PUSH_LT(
-        lt,
-        trim_endline(string_duplicate(version, NULL)),
-        free);
-    if (level_metadata->version == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    line = line_stream_next(line_stream);
+    if (line == NULL) return -1;
 
-    level_metadata->title = PUSH_LT(
-        lt,
-        trim_endline(string_duplicate(title, NULL)),
-        free);
-    if (level_metadata->title == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    memcpy(metadata->title,
+           line,
+           min_size_t(strlen(line), METADATA_VERSION_MAX_SIZE - 1));
+    trim_endline(metadata->title);
 
-    return level_metadata;
+    return 0;
 }
 
-LevelMetadata *create_level_metadata_from_file(const char *filename)
+int metadata_load_from_file(LevelMetadata *metadata, const char *filename)
 {
+    trace_assert(metadata);
     trace_assert(filename);
 
     LineStream *line_stream = create_line_stream(filename, "r", 256);
-    if (line_stream == NULL) {
-        return NULL;
-    }
+    if (line_stream == NULL) return -1;
 
-    LevelMetadata *level_metadata = create_level_metadata_from_line_stream(line_stream);
+    int err = metadata_load_from_line_stream(metadata, line_stream);
     destroy_line_stream(line_stream);
-
-    return level_metadata;
-}
-
-LevelMetadata *create_level_metadata_from_line_stream(LineStream *line_stream)
-{
-    trace_assert(line_stream);
-
-    Lt *lt = create_lt();
-
-    const char *version_line = PUSH_LT(
-            lt,
-            string_duplicate(line_stream_next(line_stream), NULL),
-            free);
-    if (version_line == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-
-    const char *title_line = PUSH_LT(
-            lt,
-            string_duplicate(line_stream_next(line_stream), NULL),
-            free);
-    if (title_line == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-
-    LevelMetadata *result = create_level_metadata(version_line, title_line);
-    destroy_lt(lt);
-    return result;
-}
-
-void destroy_level_metadata(LevelMetadata *level_metadata)
-{
-    trace_assert(level_metadata);
-    RETURN_LT0(level_metadata->lt);
-}
-
-const char *level_metadata_version(const LevelMetadata *level_metadata)
-{
-    trace_assert(level_metadata);
-    return level_metadata->version;
-}
-
-const char *level_metadata_title(const LevelMetadata *level_metadata)
-{
-    trace_assert(level_metadata);
-    return level_metadata->title;
+    return err;
 }
index cf543f060003af9df86aa2a782c3915c4db9c578..89b08f8e6f15d1b8c4700635f79d43be53638643 100644 (file)
@@ -1,17 +1,19 @@
 #ifndef LEVEL_METADATA_H_
 #define LEVEL_METADATA_H_
 
-typedef struct LevelMetadata LevelMetadata;
 typedef struct LineStream LineStream;
 
 #define VERSION "1"
 
-LevelMetadata *create_level_metadata(const char *version, const char *title);
-LevelMetadata *create_level_metadata_from_file(const char *filename);
-LevelMetadata *create_level_metadata_from_line_stream(LineStream *line_stream);
-void destroy_level_metadata(LevelMetadata *level_metadata);
+#define METADATA_TITLE_MAX_SIZE 256
+#define METADATA_VERSION_MAX_SIZE 256
 
-const char *level_metadata_title(const LevelMetadata *level_metadata);
-const char *level_metadata_version(const LevelMetadata *level_metadata);
+typedef struct {
+    char version[METADATA_VERSION_MAX_SIZE];
+    char title[METADATA_TITLE_MAX_SIZE];
+} LevelMetadata;
+
+int metadata_load_from_file(LevelMetadata *metadata, const char *file);
+int metadata_load_from_line_stream(LevelMetadata *metadata, LineStream *line_stream);
 
 #endif  // LEVEL_METADATA_H_