#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)
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"));
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);
}
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;
}
#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;
LayerPicker layer_picker;
FadingWigglyText notice;
- LevelMetadata *metadata;
+ LevelMetadata metadata;
RectLayer *boxes_layer;
RectLayer *platforms_layer;
RectLayer *back_platforms_layer;
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)) {
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);
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;
}
#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_