From 674d1b55fb3d10700fa92bcb0e0b65d004086eb0 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 2 Nov 2023 14:26:21 +0100 Subject: [PATCH] behaviour entity trait now requires drop trait and a draw function --- src/behaviour_entity.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/behaviour_entity.h b/src/behaviour_entity.h index c0d22ee..afe237d 100644 --- a/src/behaviour_entity.h +++ b/src/behaviour_entity.h @@ -1,6 +1,7 @@ #ifndef _update_entity_h #define _update_entity_h +#include "drop.h" #include "typeclass_helpers.h" #include "vmath.h" @@ -8,23 +9,29 @@ typedef struct { void (*const spawn)(void* self, Vector at); void (*const update)(void* self, float dt); void (*const start)(void* self); + void (*const draw)(void* self); } IEntityBehaviour; typedef struct { void* data; IEntityBehaviour const* tc; + IDrop const* drop; } BehaviourEntity; -#define impl_BehaviourEntity_for(T, start_f, update_f, spawn_f)\ +#define impl_BehaviourEntity_for(T, start_f, update_f, spawn_f, draw_f)\ static inline BehaviourEntity T##_as_BehaviourEntity(T* x) {\ TC_FN_TYPECHECK(void, start_f, T*);\ TC_FN_TYPECHECK(void, update_f, T*, float);\ + TC_FN_TYPECHECK(void, draw_f, T*);\ static IEntityBehaviour const tc = {\ .spawn = (void(*const)(void*, Vector)) spawn_f,\ .update = (void(*const)(void*, float)) update_f,\ - .start = (void(*const)(void*)) start_f\ + .start = (void(*const)(void*)) start_f,\ + .draw = (void(*const)(void*)) draw_f,\ };\ - return (BehaviourEntity){.tc = &tc, .data = x};\ + TC_FN_TYPECHECK(Drop, T##_as_Drop, T*);\ + IDrop const* drop = T##_as_Drop(x).tc;\ + return (BehaviourEntity){.tc = &tc, .drop = drop, .data = x};\ }\ #endif // !_update_entity_h