From 465551e9817cacf3028e9ab5ae0d89af3cca2ffb Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 5 May 2023 23:20:07 +0200 Subject: [PATCH] replaced tilemap with world --- src/tilemap.c | 82 --------------------------------------------------- src/tilemap.h | 41 -------------------------- src/world.c | 60 +++++++++++++++++++++++++++++++++++++ src/world.h | 37 +++++++++++++++++++++++ 4 files changed, 97 insertions(+), 123 deletions(-) delete mode 100644 src/tilemap.c delete mode 100644 src/tilemap.h create mode 100644 src/world.c create mode 100644 src/world.h diff --git a/src/tilemap.c b/src/tilemap.c deleted file mode 100644 index ef9ce4d..0000000 --- a/src/tilemap.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "tilemap.h" -#include "corelib/layers.h" -#include "stdio.h" -#include "string.h" -#include "signal.h" -#include "stdio.h" - -void draw_tilemap(const tilemap_t* tilemap, const tileset_t* tileset) { - sprite_t sprite; - for(int y=0;yheight;++y) { - for(int x=0;xwidth;++x) { - size_t index = get_tile(tilemap, x, y); - if(index == 0) continue; - const tile_t tile = tileset->set[index-1]; - sprite = tile.sprite; - sprite.depth = RLAYER_TILEMAP; - sprite.x = x; sprite.y = y; - draw_sprite(&sprite); - } - } -} - -int save_tilemap(const tilemap_t* map, const char* file) { - FILE* fs = fopen(file, "w"); - if(fs == NULL) { - fprintf(stderr, "ERROR: Failed to open file %s\n", file); - return 1; - } - fprintf(fs, "%d,%d,", map->width, map->height); - for(int i = 0; i < map->width * map->height; ++i) - fprintf(fs,"%zu,", map->tiles[i]); - fclose(fs); - return 0; -} - -int load_tilemap(tilemap_t* map, const char* file) { - FILE* fs = fopen(file, "r"); - if(fs == NULL) { - fprintf(stderr, "ERROR: Failed to open file %s\n", file); - return 1; - } - char buf[99]; - char* writer = buf; - int n = 0; - size_t* tile = map->tiles; - int entries=0; - while(1) { - n = fgetc(fs); - const char c = (char)n; - switch(n) { - case ' ': - case '\n': - case '\t': - break; // ignore - case EOF: - case ',': - *writer = '\0'; - if(entries == 0) { - map->width = atoi(buf); - } else if(entries == 1) { - map->height = atoi(buf); - } else { - if(entries-2 >= TILEMAP_MAX_SIZE) goto end_while; - *tile = (size_t)atoi(buf); - ++tile; - } - writer = buf; - ++entries; - if(n == EOF) - goto end_while; - else - break; - default: - *writer = c; - ++writer; - break; - } - } -end_while: - fclose(fs); - return 0; -} diff --git a/src/tilemap.h b/src/tilemap.h deleted file mode 100644 index 478bebd..0000000 --- a/src/tilemap.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _tilemap_h -#define _tilemap_h - -#include "corelib/render.h" - -#define TILEMAP_MAX_SIZE 16384 -#define TILESET_MAX_SIZE 255 - -typedef struct tile_t { - sprite_t sprite; - short walkable; -} tile_t; - -typedef struct tileset_t { - tile_t* set; - size_t size; -} tileset_t; - -typedef struct tilemap_t { - size_t tiles[TILEMAP_MAX_SIZE]; - int width, height; - float x, y; -} tilemap_t; - -static inline int get_tilemap_index(const tilemap_t* tilemap, int x, int y) { - return x + y * tilemap->width; -} -static inline size_t get_tile(const tilemap_t* tilemap, int x, int y) { - return *(tilemap->tiles + get_tilemap_index(tilemap, x, y)); -} -static inline void set_tile(tilemap_t* tilemap, int x, int y, size_t value) { - *(tilemap->tiles + get_tilemap_index(tilemap, x, y)) = value; -} - -extern void draw_tilemap(const tilemap_t* tilemap, const tileset_t* tileset); -/*load csv tilemap from file*/ -extern int load_tilemap(tilemap_t* tilemap, const char* file); -/*write csv tilemap to file*/ -extern int save_tilemap(const tilemap_t* tilemap, const char* file); - -#endif /* _tilemap_h */ diff --git a/src/world.c b/src/world.c new file mode 100644 index 0000000..6f62c91 --- /dev/null +++ b/src/world.c @@ -0,0 +1,60 @@ +#include "world.h" + +object_t g_objects[WORLD_NUM_OBJECTS]; + +void world_clear() { + for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) { + g_objects[i].active = 0; + g_objects[i].enabled = 0; + } +} + +void object_draw_sprite(object_t* object) { + draw_sprite(&object->sprite); +} + +object_t* _find_free_object() { + for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) { + if(g_objects[i].active == 0) { + return g_objects + i; + } + } + return NULL; +} + +object_t* make_object() { + object_t* o = _find_free_object(); + o->active = 1; + o->enabled = 1; + o->evt_draw = &object_draw_sprite; + o->evt_update = NULL; + memset(&o->sprite, 0, sizeof(sprite_t)); + return o; +} + +object_t* instantiate_object(const object_t *original) { + object_t* obj = make_object(); + *obj = *original; + obj->active = 1; + return obj; +} + +void update_objects() { + for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) { + if(g_objects[i].active == 1 + && g_objects[i].enabled == 1 + && g_objects[i].evt_update != NULL) { + g_objects[i].evt_update(g_objects + i); + } + } +} + +void draw_objects() { + for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) { + if(g_objects[i].active == 1 + && g_objects[i].enabled == 1 + && g_objects[i].evt_draw != NULL) { + g_objects[i].evt_draw(g_objects + i); + } + } +} diff --git a/src/world.h b/src/world.h new file mode 100644 index 0000000..2fd381d --- /dev/null +++ b/src/world.h @@ -0,0 +1,37 @@ +#ifndef _world_h +#define _world_h + +#include "render.h" +#include + +#define WORLD_NUM_OBJECTS 255 + +typedef struct object_t object_t; + +typedef void(*tick_fn)(struct object_t*); +typedef void(*draw_fn)(struct object_t*); + +struct object_t { + sprite_t sprite; + int active; // 1 if this object is in use and should not be overriden + int enabled; // 1 if this object's events should be triggered + + uintptr_t timer; // free to use for whatever + + tick_fn evt_update; + draw_fn evt_draw; +}; + +extern object_t g_objects[WORLD_NUM_OBJECTS]; + +void world_clear(); + +object_t* make_object(); +object_t* instantiate_object(const object_t* original); + +void object_draw_sprite(object_t* object); + +void update_objects(); +void draw_objects(); + +#endif /* _world_h */