From 9dde2827ed6f4b29430ab38fb66d5ab10ea0724d Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Mon, 6 Dec 2021 18:22:37 +0100 Subject: [PATCH] Initial commit. --- include/l3tde/map.h | 26 +++++++++++ include/l3tde/map/header.h | 18 ++++++++ include/l3tde/map/interface.h | 5 +++ include/l3tde/map/node.h | 21 +++++++++ include/l3tde/map/terrain.h | 19 ++++++++ include/l3tde/map/warp.h | 24 ++++++++++ include/l3tde/util/string.h | 5 +++ meson.build | 28 ++++++++++++ src/main.c | 60 +++++++++++++++++++++++++ src/map.c | 83 +++++++++++++++++++++++++++++++++++ src/map/header.c | 30 +++++++++++++ src/map/node.c | 20 +++++++++ src/map/terrain.c | 29 ++++++++++++ src/map/warp.c | 34 ++++++++++++++ src/util/string.c | 16 +++++++ 15 files changed, 418 insertions(+) create mode 100644 include/l3tde/map.h create mode 100644 include/l3tde/map/header.h create mode 100644 include/l3tde/map/interface.h create mode 100644 include/l3tde/map/node.h create mode 100644 include/l3tde/map/terrain.h create mode 100644 include/l3tde/map/warp.h create mode 100644 include/l3tde/util/string.h create mode 100644 meson.build create mode 100644 src/main.c create mode 100644 src/map.c create mode 100644 src/map/header.c create mode 100644 src/map/node.c create mode 100644 src/map/terrain.c create mode 100644 src/map/warp.c create mode 100644 src/util/string.c diff --git a/include/l3tde/map.h b/include/l3tde/map.h new file mode 100644 index 0000000..385260d --- /dev/null +++ b/include/l3tde/map.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include + +// Types in interface.h to avoid recursive inclusion in warp.h +struct L3TDEMap { + // Must be rectangular. + size_t nodes_x_len; + size_t nodes_y_len; + size_t warps_len; + + L3TDEMapHeaderPtr header; + L3TDEMapNodePtr **nodes; + L3TDEMapWarpPtr *warps; +}; + +L3TDEMapPtr +l3tde_map_create (L3TDEMapHeaderPtr header, + L3TDEMapNodePtr **nodes, size_t nodes_x_len, size_t nodes_y_len, + L3TDEMapWarpPtr *warps, size_t warps_len); + +void +l3tde_map_destroy (L3TDEMap *self); diff --git a/include/l3tde/map/header.h b/include/l3tde/map/header.h new file mode 100644 index 0000000..9226ea1 --- /dev/null +++ b/include/l3tde/map/header.h @@ -0,0 +1,18 @@ +#pragma once +#include + +typedef struct { + size_t name_len; + size_t description_len; + + char *name; + char *description; +} L3TDEMapHeader; + +typedef L3TDEMapHeader *L3TDEMapHeaderPtr; + +L3TDEMapHeaderPtr +l3tde_map_header_create (const char *name, const size_t name_len, + const char *description, const size_t description_len); +void +l3tde_map_header_destroy (L3TDEMapHeaderPtr header); diff --git a/include/l3tde/map/interface.h b/include/l3tde/map/interface.h new file mode 100644 index 0000000..301389f --- /dev/null +++ b/include/l3tde/map/interface.h @@ -0,0 +1,5 @@ +#pragma once + +struct L3TDEMap; +typedef struct L3TDEMap L3TDEMap; +typedef L3TDEMap *L3TDEMapPtr; diff --git a/include/l3tde/map/node.h b/include/l3tde/map/node.h new file mode 100644 index 0000000..229524f --- /dev/null +++ b/include/l3tde/map/node.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +typedef enum { + L3TDE_MAP_NODE_NAVIGATION_WALKABLE = 1, + L3TDE_MAP_NODE_NAVIGATION_FLYABLE = 2, +} L3TDEMapNodeNavigation; + +typedef struct { + L3TDEMapTerrainPtr terrain; + L3TDEMapNodeNavigation navigation; +} L3TDEMapNode; +typedef L3TDEMapNode *L3TDEMapNodePtr; + +L3TDEMapNodePtr +l3tde_map_node_create (const L3TDEMapTerrainPtr terrain, + L3TDEMapNodeNavigation navigation); + +void +l3tde_map_node_destroy (L3TDEMapNodePtr self); diff --git a/include/l3tde/map/terrain.h b/include/l3tde/map/terrain.h new file mode 100644 index 0000000..0e1a1f0 --- /dev/null +++ b/include/l3tde/map/terrain.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +typedef struct { + size_t name_len; + char *name; + + char symbol; + short foreground, background; +} L3TDEMapTerrain; +typedef L3TDEMapTerrain *L3TDEMapTerrainPtr; + +L3TDEMapTerrainPtr +l3tde_map_terrain_create (const char *name, size_t name_len, + char symbol, short foreground, short background); + +void +l3tde_map_terrain_destroy (L3TDEMapTerrain *self); diff --git a/include/l3tde/map/warp.h b/include/l3tde/map/warp.h new file mode 100644 index 0000000..16f93d0 --- /dev/null +++ b/include/l3tde/map/warp.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include + +typedef struct { + L3TDEMapPtr parent; + size_t destination_map; + bool can_be_crossed; + size_t location_x, location_y; + size_t destination_warp_number; +} L3TDEMapWarp; +typedef L3TDEMapWarp *L3TDEMapWarpPtr; + +L3TDEMapWarpPtr +l3tde_map_warp_create (L3TDEMapPtr parent, + size_t destination_map, + bool can_be_crossed, + size_t location_x, size_t location_y, + size_t destination_warp_number); + +void +l3tde_map_warp_destroy (L3TDEMapWarpPtr warp); diff --git a/include/l3tde/util/string.h b/include/l3tde/util/string.h new file mode 100644 index 0000000..7f75835 --- /dev/null +++ b/include/l3tde/util/string.h @@ -0,0 +1,5 @@ +#pragma once +#include + +char * +copy_string (const char *input, size_t input_len); diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..d59cfe5 --- /dev/null +++ b/meson.build @@ -0,0 +1,28 @@ +project('l3tde', 'c') + +inc = include_directories('include') + +l3tdedeps = [ + dependency('ncurses'), +] + +sources = [ + 'src/main.c', + 'src/map.c', + 'src/map/warp.c', + 'src/map/node.c', + 'src/map/header.c', + 'src/map/terrain.c', + 'src/util/string.c', +] + +link_arguments = [ +] + +executable('l3tde', + sources, + dependencies : l3tdedeps, + include_directories : inc, + install : true, + link_args : link_arguments +) diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ef3f580 --- /dev/null +++ b/src/main.c @@ -0,0 +1,60 @@ +#include +#include +#include + +#include +#include +#include +#include + +int +main () { + L3TDEMapNodePtr **nodes; + L3TDEMapHeaderPtr header; + L3TDEMapTerrainPtr terrain; + L3TDEMapPtr map; + + const char *terrain_name = "grass"; + const char *header_name = "all_green"; + const char *header_description = "This is dummy map where all is green."; + + size_t nodes_len = 80; + size_t terrain_name_len = strlen (terrain_name); + size_t header_name_len = strlen (header_name); + size_t header_descrition_len = strlen (header_description); + + nodes = malloc (sizeof *nodes * nodes_len); + + header = l3tde_map_header_create ( + header_name, header_name_len, + header_description, header_descrition_len); + + terrain = l3tde_map_terrain_create ( + terrain_name, terrain_name_len, '.', 0, 0); + + for (int i = 0; i < nodes_len; i++) { + nodes[i] = malloc (sizeof **nodes * nodes_len); + L3TDEMapNodePtr *y_nodes = nodes[i]; + for (int j = 0; j < nodes_len; j++) { + y_nodes[j] = l3tde_map_node_create (terrain, + L3TDE_MAP_NODE_NAVIGATION_WALKABLE); + } + } + + map = l3tde_map_create (header, nodes, nodes_len, nodes_len, NULL, 0); + + initscr (); + raw ();; + keypad (stdscr, TRUE); + noecho (); + + refresh (); + endwin (); + + l3tde_map_destroy (map); + l3tde_map_terrain_destroy (terrain); + + map = NULL; + terrain = NULL; + return 0; +} diff --git a/src/map.c b/src/map.c new file mode 100644 index 0000000..819b4e3 --- /dev/null +++ b/src/map.c @@ -0,0 +1,83 @@ +#include +#include + +#include +#include +#include +#include + +static void +destroy_nodes (L3TDEMapNodePtr ***nodes, size_t x_len, size_t y_len); +static void +destroy_header (L3TDEMapHeaderPtr *header); +static void +destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len); + +L3TDEMapPtr +l3tde_map_create (L3TDEMapHeaderPtr header, + L3TDEMapNodePtr **nodes, size_t nodes_x_len, size_t nodes_y_len, + L3TDEMapWarpPtr *warps, size_t warps_len) { + L3TDEMapPtr self = malloc (sizeof *self); + + self->nodes_x_len = nodes_x_len; + self->nodes_y_len = nodes_y_len; + self->warps_len = warps_len; + + self->header = header; + self->nodes = nodes; + self->warps = warps; + + return self; +} + +void +l3tde_map_destroy (L3TDEMapPtr self) { + destroy_nodes (&self->nodes, + self->nodes_x_len, self->nodes_y_len); + destroy_header (&self->header); + destroy_warps (&self->warps, self->warps_len); + free (self); +} + +static void +destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len) { + if (*warps) { + for (size_t i = 0; i < warps_len; i++) { + if ((*warps)[i]) { + l3tde_map_warp_destroy ((*warps)[i]); + (*warps)[i] = NULL; + } + } + free (*warps); + warps = NULL; + } +} + +static void +destroy_header (L3TDEMapHeaderPtr *header) { + if (*header) { + l3tde_map_header_destroy (*header); + } + header = NULL; +} + +static void +destroy_nodes (L3TDEMapNodePtr ***nodes, + size_t x_len, size_t y_len) { + if (*nodes) { + for (size_t i = 0; i < x_len; i++) { + if ((*nodes)[i]) { + for (size_t j = 0; j < y_len; j++) { + if ((*nodes)[i][j]) { + l3tde_map_node_destroy ((*nodes)[i][j]); + (*nodes)[i][j] = NULL; + } + } + free ((*nodes)[i]); + (*nodes)[i] = NULL; + } + } + free ((*nodes)); + nodes = NULL; + } +} diff --git a/src/map/header.c b/src/map/header.c new file mode 100644 index 0000000..4510116 --- /dev/null +++ b/src/map/header.c @@ -0,0 +1,30 @@ +#include +#include + +#include +#include + +L3TDEMapHeaderPtr +l3tde_map_header_create (const char *name, const size_t name_len, + const char *description, const size_t description_len) { + L3TDEMapHeaderPtr self = malloc (sizeof *self); + + self->name = copy_string (name, name_len); + self->name_len = name_len; + + self->description = copy_string (description, description_len); + self->description_len = description_len; + + return self; +} + +void +l3tde_map_header_destroy (L3TDEMapHeaderPtr header) { + free (header->name); + free (header->description); + + header->name = NULL; + header->description = NULL; + + free (header); +} diff --git a/src/map/node.c b/src/map/node.c new file mode 100644 index 0000000..7ce1268 --- /dev/null +++ b/src/map/node.c @@ -0,0 +1,20 @@ +#include + +#include +#include + +L3TDEMapNodePtr +l3tde_map_node_create (const L3TDEMapTerrainPtr terrain, + L3TDEMapNodeNavigation navigation) { + L3TDEMapNodePtr self = malloc (sizeof *self); + + self->terrain = terrain; + self->navigation = navigation; + + return self; +} + +void +l3tde_map_node_destroy (L3TDEMapNodePtr self) { + free (self); +} diff --git a/src/map/terrain.c b/src/map/terrain.c new file mode 100644 index 0000000..1bc7d0a --- /dev/null +++ b/src/map/terrain.c @@ -0,0 +1,29 @@ +#include +#include + +#include +#include + +L3TDEMapTerrainPtr +l3tde_map_terrain_create (const char *name, size_t name_len, + char symbol, short foreground, short background) { + L3TDEMapTerrainPtr self = malloc (sizeof *self); + + self->name = copy_string (name, name_len); + self->name_len = name_len; + self->symbol = symbol; + self->foreground = foreground; + self->background = background; + + return self; +} + +void +l3tde_map_terrain_destroy (L3TDEMapTerrainPtr self) { + if (self->name) { + free (self->name); + self->name = NULL; + } + + free (self); +} diff --git a/src/map/warp.c b/src/map/warp.c new file mode 100644 index 0000000..1179d63 --- /dev/null +++ b/src/map/warp.c @@ -0,0 +1,34 @@ +#include +#include +#include + +#include +#include + +L3TDEMapWarpPtr +l3tde_map_warp_create (L3TDEMapPtr parent, + size_t destination_map, + bool can_be_crossed, + size_t location_x, size_t location_y, + size_t destination_warp_number) { + L3TDEMapWarpPtr self = malloc (sizeof *self); + self->parent = parent; + self->destination_map = destination_map; + self->can_be_crossed = can_be_crossed; + self->location_x = location_x; + self->location_y = location_y; + if (!(parent->nodes_x_len > self->location_x) + || !(parent->nodes_y_len > self->location_y) ) { + // TODO: Add more possible bug information. + // TODO: Log to a file? + fprintf (stderr, "The warp is out of the map."); + } + self->destination_warp_number = destination_warp_number; + + return self; +} + +void +l3tde_map_warp_destroy (L3TDEMapWarpPtr warp) { + free (warp); +} diff --git a/src/util/string.c b/src/util/string.c new file mode 100644 index 0000000..275e2c0 --- /dev/null +++ b/src/util/string.c @@ -0,0 +1,16 @@ +#include +#include + +#include + +char * +copy_string (const char *input, size_t input_len) { + char *return_value = malloc ((input_len + 1) * sizeof *return_value); + + for (int i = 0; i < input_len; i++) { + return_value[i] = input[i]; + } + return_value[input_len] = '\0'; + + return return_value; +}