#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 "system/log.h"
#include "system/str.h"
#include "config.h"
+#include "math/extrema.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
// TODO(#994): too much duplicate code between create_level_editor and create_level_editor_from_file
-LevelEditor *create_level_editor(void)
+LevelEditor *create_level_editor(Cursor *cursor)
{
Lt *lt = create_lt();
LevelEditor *level_editor = PUSH_LT(
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->background_layer = create_background_layer(hexstr("fffda5"));
level_editor->player_layer =
level_editor->platforms_layer = PUSH_LT(
lt,
- create_rect_layer("platform"),
+ create_rect_layer("platform", cursor),
destroy_rect_layer);
if (level_editor->platforms_layer == NULL) {
RETURN_LT(lt, NULL);
level_editor->lava_layer = PUSH_LT(
lt,
- create_rect_layer("lava"),
+ 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"),
+ 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"),
+ create_rect_layer("box", cursor),
destroy_rect_layer);
if (level_editor->boxes_layer == NULL) {
RETURN_LT(lt, NULL);
level_editor->regions_layer = PUSH_LT(
lt,
- create_rect_layer("region"),
+ create_rect_layer("region", cursor),
destroy_rect_layer);
if (level_editor->regions_layer == NULL) {
RETURN_LT(lt, NULL);
return level_editor;
}
-LevelEditor *create_level_editor_from_file(const char *file_name)
+LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor)
{
trace_assert(file_name);
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) {
+ const char *line = line_stream_next(level_stream);
+ if (line == NULL) {
+ RETURN_LT(lt, NULL);
+ }
+
+ 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, VERSION) != 0) {
+ log_fail("Version `%s` is not supported. Expected version `%s`.\n",
+ version, VERSION);
RETURN_LT(lt, NULL);
}
level_editor->platforms_layer =
PUSH_LT(
lt,
- create_rect_layer_from_line_stream(level_stream, "platform"),
+ 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->lava_layer =
PUSH_LT(
lt,
- create_rect_layer_from_line_stream(level_stream, "lava"),
+ 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"),
+ 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"),
+ 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->regions_layer =
PUSH_LT(
lt,
- create_rect_layer_from_line_stream(level_stream, "region"),
+ create_rect_layer_from_line_stream(level_stream, "region", cursor),
destroy_rect_layer);
if (level_editor->regions_layer == NULL) {
RETURN_LT(lt, NULL);
(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,
}
const Rect screen_viewport = camera_view_port_screen(camera);
- const Vec2f text_size = fading_wiggly_text_size(
- &level_editor->notice,
- camera);
+ const Vec2f text_size = fading_wiggly_text_size(&level_editor->notice);
fading_wiggly_text_render(
&level_editor->notice, camera,
case SDL_KEYDOWN: {
if (event->key.keysym.sym == SDLK_RETURN) {
trace_assert(level_editor->file_name == NULL);
+ 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 = PUSH_LT(
level_editor->lt,
- string_duplicate(
- edit_field_as_text(
- level_editor->edit_field_filename),
- NULL),
+ string_duplicate(path, NULL),
free);
level_editor_dump(level_editor);
SDL_StopTextInput();
fopen(level_editor->file_name, "w"),
fclose_lt);
- if (fprintf(filedump, "%s\n", level_metadata_title(level_editor->metadata)) < 0) {
+ if (fprintf(filedump, "%s", VERSION) < 0) {
return -1;
}