Initial commit.

This commit is contained in:
sergiotarxz 2021-12-06 18:22:37 +01:00
parent 2438d7e257
commit 9dde2827ed
15 changed files with 418 additions and 0 deletions

26
include/l3tde/map.h Normal file
View File

@ -0,0 +1,26 @@
#pragma once
#include <l3tde/map/header.h>
#include <l3tde/map/node.h>
#include <l3tde/map/interface.h>
#include <l3tde/map/warp.h>
// 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);

View File

@ -0,0 +1,18 @@
#pragma once
#include <stddef.h>
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);

View File

@ -0,0 +1,5 @@
#pragma once
struct L3TDEMap;
typedef struct L3TDEMap L3TDEMap;
typedef L3TDEMap *L3TDEMapPtr;

21
include/l3tde/map/node.h Normal file
View File

@ -0,0 +1,21 @@
#pragma once
#include <l3tde/map/terrain.h>
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);

View File

@ -0,0 +1,19 @@
#pragma once
#include <stddef.h>
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);

24
include/l3tde/map/warp.h Normal file
View File

@ -0,0 +1,24 @@
#pragma once
#include <stdbool.h>
#include <l3tde/map/interface.h>
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);

View File

@ -0,0 +1,5 @@
#pragma once
#include <stddef.h>
char *
copy_string (const char *input, size_t input_len);

28
meson.build Normal file
View File

@ -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
)

60
src/main.c Normal file
View File

@ -0,0 +1,60 @@
#include <stdlib.h>
#include <ncurses.h>
#include <string.h>
#include <l3tde/map.h>
#include <l3tde/map/terrain.h>
#include <l3tde/map/node.h>
#include <l3tde/map/header.h>
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;
}

83
src/map.c Normal file
View File

@ -0,0 +1,83 @@
#include <stdlib.h>
#include <stdio.h>
#include <l3tde/map.h>
#include <l3tde/map/header.h>
#include <l3tde/map/node.h>
#include <l3tde/map/warp.h>
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;
}
}

30
src/map/header.c Normal file
View File

@ -0,0 +1,30 @@
#include <stddef.h>
#include <stdlib.h>
#include <l3tde/map/header.h>
#include <l3tde/util/string.h>
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);
}

20
src/map/node.c Normal file
View File

@ -0,0 +1,20 @@
#include <stdlib.h>
#include <l3tde/map/node.h>
#include <l3tde/map/terrain.h>
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);
}

29
src/map/terrain.c Normal file
View File

@ -0,0 +1,29 @@
#include <stddef.h>
#include <stdlib.h>
#include <l3tde/map/terrain.h>
#include <l3tde/util/string.h>
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);
}

34
src/map/warp.c Normal file
View File

@ -0,0 +1,34 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <l3tde/map.h>
#include <l3tde/map/warp.h>
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);
}

16
src/util/string.c Normal file
View File

@ -0,0 +1,16 @@
#include <stddef.h>
#include <stdlib.h>
#include <l3tde/util/string.h>
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;
}