A game engine for top-down 2D RPG games.
rpg game-engine raylib c99

(temp) more progress

Changed files
+39 -43
include
keraforge
src
+14 -10
include/keraforge/actor.h
··· 20 20 struct kf_actorregistry 21 21 { 22 22 int count; 23 - char *id[KF_MAX_ACTOR_TYPES]; 23 + char *key[KF_MAX_ACTOR_TYPES]; 24 + /* Save the actor to a binary stream. */ 24 25 void (*serialize[KF_MAX_ACTOR_TYPES])(struct kf_actor *self, struct bini_stream *bs); 26 + /* Load the actor from a binary stream. */ 25 27 void (*deserialize[KF_MAX_ACTOR_TYPES])(struct kf_actor *self, struct bini_stream *bs); 28 + /* Called every frame to update the actor. Don't forget about deltatime (kf_dts, kf_dtms)! */ 29 + void (*tick[KF_MAX_ACTOR_TYPES])(struct kf_actor *self); 30 + /* Called every frame to render the actor. */ 31 + void (*draw[KF_MAX_ACTOR_TYPES])(struct kf_actor *self); 32 + /* Spritesheet for the actor. */ 33 + struct kf_spritesheet sprite[KF_MAX_ACTOR_TYPES]; 26 34 }; 27 35 /* Global actor registry instance. */ 28 36 extern struct kf_actorregistry kf_actorregistry; ··· 31 39 struct kf_actor 32 40 { 33 41 /* Unique string identifier for this actor. */ 34 - char *id; 35 - /* Spritesheet for the actor. */ 36 - struct kf_spritesheet sprites; 42 + char *key; 43 + /* Unique integer identifier for this actor, comes from kf_actorregistry. */ 44 + int id; 37 45 /* The actor's position. */ 38 46 struct kf_vec2(f32) pos; 39 47 /* The actor's velocity. */ ··· 56 64 enum kf_direction pointing; 57 65 /* If the actor is running. This will not increase their speed, you are expected to yourself. */ 58 66 bool running; 59 - /* Called every frame to update the actor. Don't forget about deltatime (kf_dts, kf_dtms)! */ 60 - void (*tick)(struct kf_actor *self); 61 - /* Called every frame to render the actor. */ 62 - void (*draw)(struct kf_actor *self); 63 67 /* Doubly-linked list of actors. */ 64 68 struct kf_actor *prev, *next; 65 69 }; ··· 69 73 70 74 71 75 /* Create a new actor. */ 72 - struct kf_actor *kf_actor_new(char *id, struct kf_spritesheet sprites, f32 width, f32 height, bool collides); 76 + struct kf_actor *kf_actor_new(char *key); 73 77 74 78 /* Load a spritesheet, filling in the details for loading character spritesheets. */ 75 79 struct kf_spritesheet kf_actor_loadspritesheet(char *filename); ··· 85 89 86 90 /* Get the registry ID of a given actor ID. 87 91 This will perform a lot of string comparisons, use sparingly! */ 88 - int kf_actor_getregistryid(char *id); 92 + int kf_actor_getregistryid(char *key); 89 93 90 94 /* Save actor data. */ 91 95 int kf_saveactors(void);
+2 -2
include/keraforge/player.h
··· 9 9 void kf_player_tick(struct kf_actor *self); 10 10 void kf_player_draw(struct kf_actor *self); 11 11 12 - u8* kf_player_serialize(struct kf_actor *self, size_t *plen); 13 - void kf_player_deserialize(struct kf_actor *self, u8 *data, size_t len); 12 + void kf_player_serialize(struct kf_actor *self, struct bini_stream *bs); 13 + void kf_player_deserialize(struct kf_actor *self, struct bini_stream *bs); 14 14 15 15 #endif
+16 -16
src/actor.c
··· 1 - #include "keraforge/bini.h" 1 + #include "keraforge/actor.h" 2 2 #include <keraforge.h> 3 3 #include <stdlib.h> 4 4 #include <raymath.h> ··· 10 10 u32 kf_actor_count = 0; 11 11 12 12 13 - struct kf_actor *kf_actor_new(char *id, struct kf_spritesheet sprites, f32 width, f32 height, bool collides) 13 + struct kf_actor *kf_actor_new(char *key) 14 14 { 15 15 struct kf_actor *actor = calloc(1, sizeof(struct kf_actor)); 16 16 kf_actor_count++; ··· 26 26 kf_actors_last = actor; 27 27 } 28 28 29 - actor->id = id; 30 - actor->sprites = sprites; 31 - actor->size.x = width; 32 - actor->size.y = height; 33 - actor->collide = collides; 29 + actor->id = kf_actor_getregistryid(key); 30 + actor->key = key; 31 + actor->size.x = 10; 32 + actor->size.y = 10; 33 + actor->collide = true; 34 34 35 35 actor->speed = 25; 36 36 actor->speedmod = 1; ··· 174 174 175 175 x += (int)(kf_s * (frames+1)) % frames; 176 176 177 - kf_drawsprite(&actor->sprites, actor->pos.x, actor->pos.y, x, y); 177 + kf_drawsprite(&kf_actorregistry.sprite[actor->id], actor->pos.x, actor->pos.y, x, y); 178 178 } 179 179 180 - int kf_actor_getregistryid(char *id) 180 + int kf_actor_getregistryid(char *key) 181 181 { 182 - size_t l = strlen(id); 182 + size_t l = strlen(key); 183 183 for (int i = 0 ; i < kf_actorregistry.count ; i++) 184 184 { 185 - char *c = kf_actorregistry.id[i]; 185 + char *c = kf_actorregistry.key[i]; 186 186 size_t cl = strlen(c); 187 - if (strncmp(c, id, l>cl?l:cl) == 0) 187 + if (strncmp(c, key, l>cl?l:cl) == 0) 188 188 { 189 189 return i; 190 190 } ··· 209 209 210 210 for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next) 211 211 { 212 - if (!actor->id) 212 + if (!actor->key) 213 213 continue; 214 - int id = kf_actor_getregistryid(actor->id); 214 + int id = kf_actor_getregistryid(actor->key); 215 215 if (id == -1) 216 216 continue; 217 - bini_wstr(bs, actor->id); 217 + bini_wstr(bs, actor->key); 218 218 kf_actorregistry.serialize[id](actor, bs); 219 219 nactors++; 220 220 } ··· 259 259 int id = kf_actor_getregistryid(key); 260 260 if (id == -1) 261 261 continue; 262 + struct kf_actor *actor = kf_actor_new(key, k, f32 width, f32 height, bool collides) 262 263 kf_actorregistry.deserialize[id](actor, &bs); 263 - nactors++; 264 264 } 265 265 266 266 kf_logdbg("loaded %d actors", nactors);
+7 -15
src/player.c
··· 1 + #include "keraforge/bini.h" 1 2 #include <keraforge.h> 2 3 3 4 ··· 81 82 } 82 83 } 83 84 84 - 85 - struct _kf_serialized_player 85 + void kf_player_serialize(struct kf_actor *self, struct bini_stream *bs) 86 86 { 87 - struct kf_vec2(f32) pos; 88 - }; 89 - 90 - u8* kf_player_serialize(struct kf_actor *self, size_t *plen) 91 - { 92 - *plen = sizeof(struct _kf_serialized_player); 93 - struct _kf_serialized_player *s = malloc(*plen); 94 - s->pos = self->pos; 95 - return (u8 *)s; 87 + bini_wf(bs, self->pos.x); 88 + bini_wf(bs, self->pos.y); 96 89 } 97 90 98 - void kf_player_deserialize(struct kf_actor *self, u8 *data, size_t len) 91 + void kf_player_deserialize(struct kf_actor *self, struct bini_stream *bs) 99 92 { 100 - (void)len; 101 - struct _kf_serialized_player *s = (struct _kf_serialized_player *)data; 102 - self->pos = s->pos; 93 + self->pos.x = bini_rf(bs); 94 + self->pos.y = bini_rf(bs); 103 95 }