+2
include/keraforge/actor.h
+2
include/keraforge/actor.h
+38
-36
src/actor.c
+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
+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;