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

progress

Changed files
+58 -51
include
keraforge
src
+2
include/keraforge/actor.h
··· 95 95 96 96 /* Save actor data. */ 97 97 int kf_saveactors(void); 98 + /* Load actor data. */ 99 + int kf_loadactors(void); 98 100 99 101 100 102 #endif
+38 -36
src/actor.c
··· 1 1 #include "keraforge/actor.h" 2 + #include "keraforge/fs.h" 2 3 #include <keraforge.h> 3 4 #include <stdlib.h> 4 5 #include <raymath.h> ··· 211 212 212 213 /* kf_actor_count includes unserialized actors, so we have to manually count. */ 213 214 for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next) 215 + { 216 + if (!actor->key) 217 + continue; 218 + int id = kf_actor_getregistryid(actor->key); 219 + if (id == -1) 220 + continue; 214 221 nactors++; 222 + } 215 223 bini_wlu(bs, nactors); 216 224 217 225 for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next) ··· 223 231 continue; 224 232 bini_wstr(bs, actor->key); 225 233 kf_actorregistry.serialize[id](actor, bs); 226 - nactors++; 227 234 } 228 235 229 236 kf_logdbg("serialized %d actors (%lu bytes)", nactors, bs->len); 230 237 231 238 // char *outfile = compress ? _KF_ACTORFILE_TMP : _KF_ACTORFILE; 232 239 char *outfile = _KF_ACTORFILE; 233 - 234 - FILE *fp = fopen(outfile, "wb"); 235 - if (!fp) 236 - KF_THROW("failed to open %s", outfile); 237 - if (fwrite(bs->buffer, bs->len, 1, fp) != bs->len) 240 + if (!kf_writebin(outfile, bs->buffer, bs->len)) 238 241 KF_THROW("failed to write actors to %s", outfile); 239 - fclose(fp); 240 242 241 243 return 1; 242 244 } 243 245 244 - // int kf_loadactors(void) 245 - // { 246 - // // char *infile = compress ? _KF_ACTORFILE_TMP : _KF_ACTORFILE; 247 - // char *infile = _KF_ACTORFILE; 246 + int kf_loadactors(void) 247 + { 248 + // char *infile = compress ? _KF_ACTORFILE_TMP : _KF_ACTORFILE; 249 + char *infile = _KF_ACTORFILE; 248 250 249 - // size_t len = 0; 250 - // struct bini_stream bs = { 251 - // .mode = BINI_STREAM, 252 - // .buffer = kf_readbin(infile, &len), 253 - // }; 254 - // if (!bs.buffer) 255 - // KF_THROW("failed to read/open %s", infile); 256 - // bs.cap = len; 257 - // bs.len = len; 258 - // kf_logdbg("loaded actors into binary stream: len=%lu", len); 251 + size_t len = 0; 252 + struct bini_stream bs = { 253 + .mode = BINI_STREAM, 254 + .buffer = kf_readbin(infile, &len), 255 + }; 256 + if (!bs.buffer) 257 + KF_THROW("failed to read/open %s", infile); 258 + bs.cap = len; 259 + bs.len = len; 260 + kf_logdbg("loaded actors into binary stream: len=%lu", len); 259 261 260 - // const size_t nactors = bini_rlu(&bs); 262 + const size_t nactors = bini_rlu(&bs); 261 263 262 - // for (size_t i = 0 ; i < nactors ; i++) 263 - // { 264 - // char key[4096] = {0}; 265 - // bini_rstr(&bs, key); 266 - // int id = kf_actor_getregistryid(key); 267 - // if (id == -1) 268 - // continue; 269 - // struct kf_actor *actor = kf_actor_new(key, k, f32 width, f32 height, bool collides) 270 - // kf_actorregistry.deserialize[id](actor, &bs); 271 - // } 264 + for (size_t i = 0 ; i < nactors ; i++) 265 + { 266 + char key[4096] = {0}; 267 + bini_rstr(&bs, key); 268 + int id = kf_actor_getregistryid(key); 269 + if (id == -1) 270 + continue; 271 + struct kf_actor *actor = kf_actor_new(key); 272 + kf_actorregistry.deserialize[id](actor, &bs); 273 + } 272 274 273 - // kf_logdbg("loaded %d actors", nactors); 275 + kf_logdbg("loaded %d actors", nactors); 274 276 275 - // free(bs.buffer); 277 + free(bs.buffer); 276 278 277 - // return 1; 278 - // } 279 + return 1; 280 + }
+17 -15
src/graphics.c
··· 57 57 kf_actorregistry.tick[idplayer] = kf_player_tick; 58 58 kf_actorregistry.draw[idplayer] = kf_player_draw; 59 59 60 - struct kf_actor *player = kf_actor_new("player"); 61 - player->size.x = 10; 62 - player->size.y = 10; 63 - player->collide = true; 64 - player->sizeoffset.y = 6; 65 - player->controlled = true; 66 - if (is_new_state) /* place the player in the centre of the room */ 67 - { 68 - state->player.pos.x = world->width * KF_TILE_SIZE_PX / 2.0f; 69 - state->player.pos.y = world->width * KF_TILE_SIZE_PX / 2.0f; 70 - } 71 - player->pos.x = state->player.pos.x; 72 - player->pos.y = state->player.pos.y; 73 - kf_window.player = player; 74 - 75 60 int idplayer2 = kf_actor_register("player2"); 76 61 kf_actorregistry.serialize[idplayer2] = kf_player_serialize; 77 62 kf_actorregistry.deserialize[idplayer2] = kf_player_deserialize; 78 63 kf_actorregistry.sprite[idplayer2] = kf_actor_loadspritesheet("data/res/img/char/whom.png"); 79 64 kf_actorregistry.tick[idplayer2] = kf_player_tick; 80 65 kf_actorregistry.draw[idplayer2] = kf_player_draw; 66 + 67 + if (is_new_state) 68 + { 69 + struct kf_actor *player = kf_actors; /* player should always be the first actor. */ 70 + 71 + state->player.pos.x = world->width * KF_TILE_SIZE_PX / 2.0f; 72 + state->player.pos.y = world->width * KF_TILE_SIZE_PX / 2.0f; 73 + 74 + kf_timeit("save actors", kf_saveactors()); 75 + } 76 + else 77 + { 78 + kf_timeit("load actors", kf_loadactors()); 79 + } 80 + 81 + struct kf_actor *player = kf_actors; /* player should always be the first actor. */ 82 + kf_window.player = player; 81 83 82 84 struct kf_actor *player2 = kf_actor_new("player2"); 83 85 player2->size.x = 10;
+1
src/player.c
··· 86 86 { 87 87 bini_wf(bs, self->pos.x); 88 88 bini_wf(bs, self->pos.y); 89 + bini_wb(bs, self->controlled); 89 90 } 90 91 91 92 void kf_player_deserialize(struct kf_actor *self, struct bini_stream *bs)