diff librpg/rpg/tileset.c @ 218:71f989ae8de9

rpg: add support for animated tiles
author David Demelier <markand@malikania.fr>
date Wed, 18 Nov 2020 13:46:29 +0100
parents 64f24b482722
children
line wrap: on
line diff
--- a/librpg/rpg/tileset.c	Wed Nov 18 10:13:29 2020 +0100
+++ b/librpg/rpg/tileset.c	Wed Nov 18 13:46:29 2020 +0100
@@ -17,11 +17,37 @@
  */
 
 #include <assert.h>
+#include <stdlib.h>
 
+#include <core/animation.h>
 #include <core/sprite.h>
 
 #include "tileset.h"
 
+static inline int
+anim_cmp(const void *d1, const void *d2)
+{
+	const struct tileset_animation *mtd1 = d1;
+	const struct tileset_animation *mtd2 = d2;
+
+	if (mtd1->id < mtd2->id)
+		return -1;
+	if (mtd1->id > mtd2->id)
+		return 1;
+
+	return 0;
+}
+
+static inline const struct tileset_animation *
+find(const struct tileset *ts, unsigned int r, unsigned int c)
+{
+	const struct tileset_animation key = {
+		.id = c + (r * ts->sprite->ncols)
+	};
+
+	return bsearch(&key, ts->anims, ts->animsz, sizeof (key), anim_cmp);
+}
+
 bool
 tileset_ok(const struct tileset *ts)
 {
@@ -29,9 +55,39 @@
 }
 
 void
+tileset_start(struct tileset *ts)
+{
+	for (size_t i = 0; i < ts->animsz; ++i) {
+		struct tileset_animation *ta = &ts->anims[i];
+
+		if (ta->animation)
+			animation_start(ta->animation);
+	}
+}
+
+void
+tileset_update(struct tileset *ts, unsigned int ticks)
+{
+	for (size_t i = 0; i < ts->animsz; ++i) {
+		struct tileset_animation *ta = &ts->anims[i];
+
+		if (!ta->animation)
+			continue;
+
+		if (animation_update(ta->animation, ticks))
+			animation_start(ta->animation);
+	}
+}
+
+void
 tileset_draw(const struct tileset *ts, unsigned int r, unsigned int c, int x, int y)
 {
 	assert(ts);
 
-	sprite_draw(ts->sprite, r, c, x, y);
+	const struct tileset_animation *ta;
+
+	if ((ta = find(ts, r, c)))
+		animation_draw(ta->animation, x, y);
+	else
+		sprite_draw(ts->sprite, r, c, x, y);
 }