From c9e86648f5bda1432d59a441907a88c1ed0f74d7 Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Tue, 28 Dec 2021 12:51:26 +0100 Subject: [PATCH] Refactoring the game render to allow map editor rendering. --- include/l3tde/game/map_editor.h | 3 ++- src/game.c | 33 +++++++++++++++++++++-------- src/game/map_editor.c | 2 +- src/game/map_editor/creation_form.c | 26 +++++++++++++++++------ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/include/l3tde/game/map_editor.h b/include/l3tde/game/map_editor.h index f531c33..92d77bf 100644 --- a/include/l3tde/game/map_editor.h +++ b/include/l3tde/game/map_editor.h @@ -4,6 +4,7 @@ #include #include +#include #define ctrl(x) ((x) & 0x1f) #define KEY_INTRO '\n' @@ -30,7 +31,7 @@ typedef struct { bool is_button_accept_selected; FIELD **fields; FORM *form_creation; - L3TDEMapPtr map; + L3TDEGamePtr game; L3TDEOverworldPtr overworld; } MapEditorStatus; diff --git a/src/game.c b/src/game.c index be2ccfa..e45d637 100644 --- a/src/game.c +++ b/src/game.c @@ -104,23 +104,22 @@ l3tde_game_move_to_pos_if_posible (L3TDEGamePtr game, } void -l3tde_game_render_game (L3TDEGamePtr game) { +l3tde_game_render_game_map (L3TDEGamePtr game) { + L3TDEMapPtr current_map = game->current_map; + size_t start_node_x, start_node_y; size_t max_node_x, max_node_y; size_t nodes_x_len, nodes_y_len; int max_x, max_y; - int current_pos_map_x, current_pos_map_y; - getmaxyx(stdscr, max_y, max_x); - - L3TDEMapPtr current_map = game->current_map; - - nodes_x_len = current_map->nodes_x_len; - nodes_y_len = current_map->nodes_y_len; + getmaxyx (stdscr, max_y, max_x); l3tde_game_render_game_get_start_nodes (game, max_x, max_y, &start_node_x, &start_node_y); + nodes_x_len = current_map->nodes_x_len; + nodes_y_len = current_map->nodes_y_len; + max_node_x = start_node_x + max_x; max_node_y = start_node_y + max_y; @@ -165,7 +164,23 @@ l3tde_game_render_game (L3TDEGamePtr game) { } } free (color_pairs); - color_pairs = NULL; +} + +void +l3tde_game_render_game (L3TDEGamePtr game) { + size_t start_node_x, start_node_y; + int max_x, max_y; + int current_pos_map_x, current_pos_map_y; + + erase (); + + getmaxyx (stdscr, max_y, max_x); + + l3tde_game_render_game_get_start_nodes (game, + max_x, max_y, &start_node_x, &start_node_y); + + l3tde_game_render_game_map (game); + current_pos_map_x = game->x_pos - start_node_x; current_pos_map_y = game->y_pos - start_node_y; attron (A_BOLD); diff --git a/src/game/map_editor.c b/src/game/map_editor.c index 9a6246f..554dd84 100644 --- a/src/game/map_editor.c +++ b/src/game/map_editor.c @@ -32,7 +32,7 @@ map_editor_loop () { status->current_form = SELECT_MAP; status->form_creation = NULL; status->fields = NULL; - status->map = NULL; + status->game = NULL; while (1) { map_editor_render (status); map_editor_handle_input (status); diff --git a/src/game/map_editor/creation_form.c b/src/game/map_editor/creation_form.c index 2171e17..8967025 100644 --- a/src/game/map_editor/creation_form.c +++ b/src/game/map_editor/creation_form.c @@ -1,8 +1,13 @@ #include +#include #include #include + #include + +#include + #include #define BACKSPACE 127 @@ -41,25 +46,30 @@ map_editor_creation_form_handle_input (MapEditorStatus *status) { case KEY_INTRO: if (status->is_button_accept_selected) { L3TDEOverworldPtr overworld = l3tde_overworld_create (); - char *x_str = field_buffer (status->fields[X_FIELD], 0); - char *y_str = field_buffer (status->fields[Y_FIELD], 0); + const char *title = field_buffer (status->fields[MAP_NAME_FIELD], 0); + const char *description = field_buffer (status->fields[MAP_DESCRIPTION_FIELD], 0); + const char *x_str = field_buffer (status->fields[X_FIELD], 0); + const char *y_str = field_buffer (status->fields[Y_FIELD], 0); if (!x_str || !y_str) { - goto cleanup_key_intro; + break; } errno = 0; size_t x = strtoll (x_str, NULL, 10); if (errno == EINVAL || errno == ERANGE) { mvprintw (11, 0, "X is not a number."); - goto cleanup_key_intro; + break; } errno = 0; size_t y = strtoll (y_str, NULL, 10); if (errno == EINVAL || errno == ERANGE) { mvprintw (11, 0, "Y is not a number."); - goto cleanup_key_intro; + break; } status->current_form = MAP_EDITOR; status->overworld = overworld; + L3TDEMapHeaderPtr header = l3tde_map_header_create (title, + strlen (title) + 1, description, + strlen (description) + 1); L3TDEMapNodePtr **nodes = malloc (sizeof *nodes * x); for (int i = 0; i < x; i++) { nodes[i] = malloc (sizeof **nodes * y); @@ -67,8 +77,10 @@ map_editor_creation_form_handle_input (MapEditorStatus *status) { nodes[i][j] = l3tde_map_node_create (overworld->terrains[0], 0); } } - -cleanup_key_intro: + L3TDEMapPtr map = l3tde_map_create (header, nodes, x, y, + NULL, 0); + L3TDEGamePtr game = l3tde_game_create (map, 0, 0); + status->game = game; break; } case KEY_TAB: