feat: reworked typeclasses to forward-declare then define
forward declarations are simplified with decl_typeclass_impl impl_Typeclass_for now instead only define static inline impl_Typeclass_for can be used to achieve the old behaviour
This commit is contained in:
		
							parent
							
								
									760d9f2879
								
							
						
					
					
						commit
						0c6f1dd8cf
					
				| 
						 | 
				
			
			@ -19,7 +19,7 @@ typedef struct Asset {
 | 
			
		|||
} Asset;
 | 
			
		||||
 | 
			
		||||
#define impl_Asset_for(T, get_id_f, set_id_f)\
 | 
			
		||||
static inline Asset T##_as_Asset(T* x) {\
 | 
			
		||||
Asset T##_as_Asset(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(asset_id, get_id_f, T*);\
 | 
			
		||||
    TC_FN_TYPECHECK(void, set_id_f, T*, asset_id);\
 | 
			
		||||
    TC_FN_TYPECHECK(Drop, T##_as_Drop, T*);\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,8 @@
 | 
			
		|||
#define _update_entity_h
 | 
			
		||||
 | 
			
		||||
#include "drop.h"
 | 
			
		||||
#include "mirror.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
#include "vmath.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    void (*const update)(void* self, float dt);
 | 
			
		||||
| 
						 | 
				
			
			@ -16,10 +16,11 @@ typedef struct {
 | 
			
		|||
    void* data;
 | 
			
		||||
    IEntityBehaviour const* tc;
 | 
			
		||||
    IDrop const* drop;
 | 
			
		||||
    IMirror const* mirror;
 | 
			
		||||
} BehaviourEntity;
 | 
			
		||||
 | 
			
		||||
#define impl_BehaviourEntity_for(T, start_f, update_f, draw_f, get_depth_f)\
 | 
			
		||||
static inline BehaviourEntity T##_as_BehaviourEntity(T* x) {\
 | 
			
		||||
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*);\
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +32,10 @@ static inline BehaviourEntity T##_as_BehaviourEntity(T* x) {\
 | 
			
		|||
        .get_depth=(long(*const)(void*))         get_depth_f,\
 | 
			
		||||
    };\
 | 
			
		||||
    TC_FN_TYPECHECK(Drop, T##_as_Drop, T*);\
 | 
			
		||||
    TC_FN_TYPECHECK(Mirror, T##_as_Mirror, T*);\
 | 
			
		||||
    IDrop const* drop = T##_as_Drop(x).tc;\
 | 
			
		||||
    return (BehaviourEntity){.tc = &tc, .drop = drop, .data = x};\
 | 
			
		||||
    IMirror const* mirror = T##_as_Mirror(x).tc;\
 | 
			
		||||
    return (BehaviourEntity){.data = x, .tc = &tc, .drop = drop, .mirror = mirror};\
 | 
			
		||||
}\
 | 
			
		||||
 | 
			
		||||
#endif // !_update_entity_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ typedef struct {
 | 
			
		|||
} Drop;
 | 
			
		||||
 | 
			
		||||
#define impl_Drop_for(T, drop_f)\
 | 
			
		||||
static inline Drop T##_as_Drop(T* x) {\
 | 
			
		||||
Drop T##_as_Drop(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(void, drop_f, T*);\
 | 
			
		||||
    static IDrop const tc = {\
 | 
			
		||||
        .drop = (void(*const)(void*)) drop_f,\
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ static inline Drop T##_as_Drop(T* x) {\
 | 
			
		|||
extern void default_drop(void*);
 | 
			
		||||
 | 
			
		||||
#define impl_default_Drop_for(T)\
 | 
			
		||||
static inline Drop T##_as_Drop(T* x) {\
 | 
			
		||||
Drop T##_as_Drop(T* x) {\
 | 
			
		||||
    static IDrop const tc = {\
 | 
			
		||||
        .drop = default_drop,\
 | 
			
		||||
    };\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,42 @@
 | 
			
		|||
#include "debug.h"
 | 
			
		||||
#include "input.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
impl_default_Drop_for(
 | 
			
		||||
    KeyBind
 | 
			
		||||
)
 | 
			
		||||
impl_InputAxis_for(KeyBind,
 | 
			
		||||
    keybind_is_changed_by,
 | 
			
		||||
    keybind_evaluate,
 | 
			
		||||
    keybind_set_device
 | 
			
		||||
)
 | 
			
		||||
impl_default_Drop_for(
 | 
			
		||||
    ControllerAxis
 | 
			
		||||
)
 | 
			
		||||
impl_InputAxis_for(ControllerAxis,
 | 
			
		||||
    controlleraxis_is_changed_by,
 | 
			
		||||
    controlleraxis_evaluate,
 | 
			
		||||
    controlleraxis_set_device
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_default_Drop_for(
 | 
			
		||||
    ControllerButton
 | 
			
		||||
)
 | 
			
		||||
impl_InputAxis_for(ControllerButton,
 | 
			
		||||
    controllerbutton_is_changed_by,
 | 
			
		||||
    controllerbutton_evaluate,
 | 
			
		||||
    controllerbutton_set_device
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(CompositeAxis1D,
 | 
			
		||||
    compositeaxis1d_drop
 | 
			
		||||
)
 | 
			
		||||
impl_InputAxis_for(CompositeAxis1D,
 | 
			
		||||
    compositeaxis1d_is_changed_by,
 | 
			
		||||
    compositeaxis1d_evaluate,
 | 
			
		||||
    compositeaxis1d_set_device
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
KeyBind* keybind_new(SDL_Scancode key) {
 | 
			
		||||
    KeyBind* self = malloc(sizeof(KeyBind));
 | 
			
		||||
    ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for KeyBind instance");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ typedef struct {
 | 
			
		|||
} InputAxis;
 | 
			
		||||
 | 
			
		||||
#define impl_InputAxis_for(T, is_changed_by_f, evaluate_f, set_device_f)\
 | 
			
		||||
static inline InputAxis T##_as_InputAxis(T* x) {\
 | 
			
		||||
InputAxis T##_as_InputAxis(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(int, is_changed_by_f, T*, SDL_Event);\
 | 
			
		||||
    TC_FN_TYPECHECK(struct InputEvent, evaluate_f, T*, SDL_Event);\
 | 
			
		||||
    TC_FN_TYPECHECK(void, set_device_f, T*, struct InputDevice*);\
 | 
			
		||||
| 
						 | 
				
			
			@ -64,12 +64,8 @@ extern int keybind_is_changed_by(KeyBind* self, SDL_Event event);
 | 
			
		|||
extern struct InputEvent keybind_evaluate(KeyBind* self, SDL_Event);
 | 
			
		||||
extern void keybind_set_device(KeyBind* self, struct InputDevice* device);
 | 
			
		||||
 | 
			
		||||
impl_default_Drop_for(KeyBind)
 | 
			
		||||
impl_InputAxis_for(KeyBind,
 | 
			
		||||
    keybind_is_changed_by,
 | 
			
		||||
    keybind_evaluate,
 | 
			
		||||
    keybind_set_device
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(InputAxis, KeyBind)
 | 
			
		||||
decl_typeclass_impl(Drop, KeyBind)
 | 
			
		||||
 | 
			
		||||
typedef struct ControllerAxis {
 | 
			
		||||
    struct InputDevice* device;
 | 
			
		||||
| 
						 | 
				
			
			@ -81,12 +77,8 @@ extern int controlleraxis_is_changed_by(ControllerAxis* self, SDL_Event event);
 | 
			
		|||
extern struct InputEvent controlleraxis_evaluate(ControllerAxis* self, SDL_Event event);
 | 
			
		||||
extern void controlleraxis_set_device(ControllerAxis* self, struct InputDevice* device);
 | 
			
		||||
 | 
			
		||||
impl_default_Drop_for(ControllerAxis)
 | 
			
		||||
impl_InputAxis_for(ControllerAxis,
 | 
			
		||||
    controlleraxis_is_changed_by,
 | 
			
		||||
    controlleraxis_evaluate,
 | 
			
		||||
    controlleraxis_set_device
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(InputAxis, ControllerAxis)
 | 
			
		||||
decl_typeclass_impl(Drop, ControllerAxis)
 | 
			
		||||
 | 
			
		||||
typedef struct ControllerButton {
 | 
			
		||||
    struct InputDevice* device;
 | 
			
		||||
| 
						 | 
				
			
			@ -98,12 +90,8 @@ extern int controllerbutton_is_changed_by(ControllerButton* self, SDL_Event even
 | 
			
		|||
extern struct InputEvent controllerbutton_evaluate(ControllerButton* self, SDL_Event event);
 | 
			
		||||
extern void controllerbutton_set_device(ControllerButton* self, struct InputDevice* device);
 | 
			
		||||
 | 
			
		||||
impl_default_Drop_for(ControllerButton)
 | 
			
		||||
impl_InputAxis_for(ControllerButton,
 | 
			
		||||
    controllerbutton_is_changed_by,
 | 
			
		||||
    controllerbutton_evaluate,
 | 
			
		||||
    controllerbutton_set_device
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(InputAxis, ControllerButton)
 | 
			
		||||
decl_typeclass_impl(Drop, ControllerButton)
 | 
			
		||||
 | 
			
		||||
typedef struct CompositeAxis1D {
 | 
			
		||||
    InputAxis left;
 | 
			
		||||
| 
						 | 
				
			
			@ -117,13 +105,7 @@ extern struct InputEvent compositeaxis1d_evaluate(CompositeAxis1D* self, SDL_Eve
 | 
			
		|||
extern void compositeaxis1d_set_device(CompositeAxis1D* self, struct InputDevice* device);
 | 
			
		||||
extern void compositeaxis1d_drop(CompositeAxis1D* self);
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(CompositeAxis1D,
 | 
			
		||||
    compositeaxis1d_drop
 | 
			
		||||
)
 | 
			
		||||
impl_InputAxis_for(CompositeAxis1D,
 | 
			
		||||
    compositeaxis1d_is_changed_by,
 | 
			
		||||
    compositeaxis1d_evaluate,
 | 
			
		||||
    compositeaxis1d_set_device
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(InputAxis, CompositeAxis1D)
 | 
			
		||||
decl_typeclass_impl(Drop, CompositeAxis1D)
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_input_axis_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
#include "transform.h"
 | 
			
		||||
#include "stdint.h"
 | 
			
		||||
#include "physics_entity.h"
 | 
			
		||||
#include "shape.h"
 | 
			
		||||
 | 
			
		||||
typedef uint32_t PhysicsMask;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ extern void physics_entity_solve_contacts(PhysicsEntity self, List* contacts);
 | 
			
		|||
extern void physics_entity_update(PhysicsEntity self);
 | 
			
		||||
 | 
			
		||||
#define impl_PhysicsEntity_for(T, get_rigidbody_f, on_collision_f, on_overlap_f)\
 | 
			
		||||
static inline PhysicsEntity T##_as_PhysicsEntity(T* x) {\
 | 
			
		||||
PhysicsEntity T##_as_PhysicsEntity(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T*);\
 | 
			
		||||
    TC_FN_TYPECHECK(void, on_collision_f, T*, Collision);\
 | 
			
		||||
    TC_FN_TYPECHECK(void, on_overlap_f, T*, Collider*);\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,10 @@
 | 
			
		|||
#include "player_input.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(PlayerInput,
 | 
			
		||||
    playerinput_drop
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
PlayerInput* playerinput_new(void* target, int device) {
 | 
			
		||||
    PlayerInput* self = malloc(sizeof(PlayerInput));
 | 
			
		||||
    ASSERT_RETURN(self != NULL, NULL, "Could not allocate memory for PlayerInput instance");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
#include "list.h"
 | 
			
		||||
#include "input.h"
 | 
			
		||||
#include "input_axis.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
 | 
			
		||||
typedef struct PlayerInput {
 | 
			
		||||
    InputDevice* device;
 | 
			
		||||
| 
						 | 
				
			
			@ -16,8 +17,6 @@ extern void playerinput_add(PlayerInput* self, InputAxis axis, InputDelegateFn d
 | 
			
		|||
extern void playerinput_set_device(PlayerInput* self, int device);
 | 
			
		||||
extern void playerinput_drop(PlayerInput* self);
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(PlayerInput,
 | 
			
		||||
    playerinput_drop
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(Drop, PlayerInput)
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_player_input_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,10 @@ struct RigidBody {
 | 
			
		|||
    List contacts;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(RigidBody,
 | 
			
		||||
    rigidbody_get_transform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
RigidBody* rigidbody_make(PhysicsEntity owner) {
 | 
			
		||||
    RigidBody* self = malloc(sizeof(RigidBody));
 | 
			
		||||
    ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for rigidbody");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,8 @@
 | 
			
		|||
#ifndef _fencer_rigidbody_h
 | 
			
		||||
#define _fencer_rigidbody_h
 | 
			
		||||
 | 
			
		||||
#include "shape.h"
 | 
			
		||||
#include "transformable.h"
 | 
			
		||||
#include "list.h"
 | 
			
		||||
#include "stdint.h"
 | 
			
		||||
#include "physics.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +59,6 @@ extern void rigidbody_debug_draw_contacts(RigidBody* self);
 | 
			
		|||
 | 
			
		||||
extern Transform* rigidbody_get_transform(RigidBody* self);
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(RigidBody,
 | 
			
		||||
    rigidbody_get_transform
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(Transformable, RigidBody)
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_rigidbody_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,15 @@ struct Spritesheet {
 | 
			
		|||
    IVector tile_size;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Spritesheet,
 | 
			
		||||
    _internal_spritesheet_destroy
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Asset_for(Spritesheet,
 | 
			
		||||
    spritesheet_get_asset_id,
 | 
			
		||||
    spritesheet_set_asset_id
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
void _internal_spritesheet_destroy(Spritesheet* self) {
 | 
			
		||||
    SDL_DestroyTexture(self->texture);
 | 
			
		||||
    free(self);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
#define _fencer_spritesheet_h
 | 
			
		||||
 | 
			
		||||
#include "asset.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
#include "vmath.h"
 | 
			
		||||
#include <SDL2/SDL_render.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -21,13 +22,7 @@ extern void spritesheet_set_asset_id(Spritesheet* self, asset_id id);
 | 
			
		|||
 | 
			
		||||
extern void _internal_spritesheet_destroy(Spritesheet* self_void);
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Spritesheet,
 | 
			
		||||
    _internal_spritesheet_destroy
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Asset_for(Spritesheet,
 | 
			
		||||
    spritesheet_get_asset_id,
 | 
			
		||||
    spritesheet_set_asset_id
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(Drop, Spritesheet)
 | 
			
		||||
decl_typeclass_impl(Asset, Spritesheet)
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_spritesheet_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								core/src/transform.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								core/src/transform.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
#include "transform.h"
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Transform,
 | 
			
		||||
    transform_get_transform
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#ifndef _fencer_transform_h
 | 
			
		||||
#define _fencer_transform_h
 | 
			
		||||
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
#include "vmath.h"
 | 
			
		||||
#include "transformable.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -56,8 +57,6 @@ Transform* transform_get_transform(Transform* self) {
 | 
			
		|||
    return self;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Transform,
 | 
			
		||||
    transform_get_transform
 | 
			
		||||
);
 | 
			
		||||
decl_typeclass_impl(Transformable, Transform)
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_transform_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ extern void transformable_set_rotation(Transformable self, float rotation);
 | 
			
		|||
extern void transformable_rotate(Transformable self, float delta);
 | 
			
		||||
 | 
			
		||||
#define impl_Transformable_for(T, get_transform_f)\
 | 
			
		||||
static inline Transformable T##_as_Transformable(T* x) {\
 | 
			
		||||
Transformable T##_as_Transformable(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(Transform*, get_transform_f, T*);\
 | 
			
		||||
    static ITransformable const tc = {\
 | 
			
		||||
        .get_transform =    (Transform*(*const)(void*)) get_transform_f\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,4 +4,7 @@
 | 
			
		|||
#define TC_FN_TYPECHECK(__Return, __Name, ...)\
 | 
			
		||||
__Return (*const __Name##_)(__VA_ARGS__) = __Name; (void)__Name##_
 | 
			
		||||
 | 
			
		||||
#define decl_typeclass_impl(__Typeclass, __Type)\
 | 
			
		||||
extern __Typeclass __Type##_as_##__Typeclass(__Type*);
 | 
			
		||||
 | 
			
		||||
#endif // !_fencer_typeclass_helpers_h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ typedef struct {
 | 
			
		|||
} Damagable;
 | 
			
		||||
 | 
			
		||||
#define impl_Damagable_for(T, damage_f)\
 | 
			
		||||
static inline Damagable T##_as_Damagable(T* x) {\
 | 
			
		||||
Damagable T##_as_Damagable(T* x) {\
 | 
			
		||||
    TC_FN_TYPECHECK(int, damage_f, T*, DamageEventData*);\
 | 
			
		||||
    static const IDamagable tc = {\
 | 
			
		||||
        .damage = (int(*const)(void*, DamageEventData*)) damage_f,\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,31 @@ START_REFLECT(Enemy)
 | 
			
		|||
    REFLECT_TYPECLASS(Enemy, Damagable)
 | 
			
		||||
END_REFLECT(Enemy)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Enemy,
 | 
			
		||||
    EnemyGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Enemy,
 | 
			
		||||
    EnemyDestroy
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Enemy,
 | 
			
		||||
    EnemyStart,
 | 
			
		||||
    EnemyUpdate,
 | 
			
		||||
    EnemyDraw,
 | 
			
		||||
    EnemyGetDepth
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Enemy,
 | 
			
		||||
    EnemyGetRigidBody,
 | 
			
		||||
    EnemyOnCollision,
 | 
			
		||||
    EnemyOnOverlap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Damagable_for(Enemy,
 | 
			
		||||
    EnemyDamage
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
Enemy* MakeEnemy() {
 | 
			
		||||
    Enemy* self = malloc(sizeof(Enemy));
 | 
			
		||||
    ASSERT_RETURN(self != NULL, NULL, "Failed to allocate Enemy");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@
 | 
			
		|||
 | 
			
		||||
#include "Damagable.h"
 | 
			
		||||
#include "EnemyStates.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
 | 
			
		||||
typedef struct Enemy {
 | 
			
		||||
    Transform transform;
 | 
			
		||||
| 
						 | 
				
			
			@ -56,29 +57,10 @@ extern int EnemyDamage(Enemy* self, DamageEventData* data);
 | 
			
		|||
 | 
			
		||||
DECL_REFLECT(Enemy)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Enemy,
 | 
			
		||||
    EnemyGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Enemy,
 | 
			
		||||
    EnemyDestroy
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Enemy,
 | 
			
		||||
    EnemyStart,
 | 
			
		||||
    EnemyUpdate,
 | 
			
		||||
    EnemyDraw,
 | 
			
		||||
    EnemyGetDepth
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Enemy,
 | 
			
		||||
    EnemyGetRigidBody,
 | 
			
		||||
    EnemyOnCollision,
 | 
			
		||||
    EnemyOnOverlap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Damagable_for(Enemy,
 | 
			
		||||
    EnemyDamage
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(Transformable, Enemy)
 | 
			
		||||
decl_typeclass_impl(Drop, Enemy)
 | 
			
		||||
decl_typeclass_impl(BehaviourEntity, Enemy)
 | 
			
		||||
decl_typeclass_impl(PhysicsEntity, Enemy)
 | 
			
		||||
decl_typeclass_impl(Damagable, Enemy)
 | 
			
		||||
 | 
			
		||||
#endif // !FIGHT_ENEMY_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,27 @@ START_REFLECT(Player)
 | 
			
		|||
    REFLECT_TYPECLASS(Player, BehaviourEntity)
 | 
			
		||||
END_REFLECT(Player)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Player,
 | 
			
		||||
    DestroyPlayer
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Player,
 | 
			
		||||
    PlayerStart,
 | 
			
		||||
    PlayerUpdate,
 | 
			
		||||
    PlayerDraw,
 | 
			
		||||
    PlayerGetDepth
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Player,
 | 
			
		||||
    PlayerGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Player,
 | 
			
		||||
    PlayerGetRigidBody,
 | 
			
		||||
    PlayerOnCollision,
 | 
			
		||||
    PlayerOnOverlap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
static inline
 | 
			
		||||
void Internal_PlayerInitInput(Player* self) {
 | 
			
		||||
    playerinput_add(self->playerInput, CompositeAxis1D_as_InputAxis(compositeaxis1d_new(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
#include "player_input.h"
 | 
			
		||||
#include "rigidbody.h"
 | 
			
		||||
#include "collider.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
 | 
			
		||||
extern const Vector PLAYER_SPEED;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,25 +62,9 @@ static long PlayerGetDepth(Player* self) { return (int)(-10-self->transform.posi
 | 
			
		|||
 | 
			
		||||
DECL_REFLECT(Player);
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Player,
 | 
			
		||||
    DestroyPlayer
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Player,
 | 
			
		||||
    PlayerStart,
 | 
			
		||||
    PlayerUpdate,
 | 
			
		||||
    PlayerDraw,
 | 
			
		||||
    PlayerGetDepth
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Player,
 | 
			
		||||
    PlayerGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Player,
 | 
			
		||||
    PlayerGetRigidBody,
 | 
			
		||||
    PlayerOnCollision,
 | 
			
		||||
    PlayerOnOverlap
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(BehaviourEntity, Player)
 | 
			
		||||
decl_typeclass_impl(Drop, Player)
 | 
			
		||||
decl_typeclass_impl(Transformable, Player)
 | 
			
		||||
decl_typeclass_impl(PhysicsEntity, Player)
 | 
			
		||||
 | 
			
		||||
#endif // !FIGHT_PLAYER_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,27 @@ START_REFLECT(Prop)
 | 
			
		|||
    REFLECT_TYPECLASS(Prop, BehaviourEntity)
 | 
			
		||||
END_REFLECT(Prop)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Prop,
 | 
			
		||||
    PropGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Prop,
 | 
			
		||||
    PropGetRigidBody,
 | 
			
		||||
    PropOnCollision,
 | 
			
		||||
    PropOnOverlap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Prop,
 | 
			
		||||
    DestroyProp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Prop,
 | 
			
		||||
    PropStart,
 | 
			
		||||
    PropUpdate,
 | 
			
		||||
    PropDraw,
 | 
			
		||||
    PropGetDepth
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
Prop* MakeProp(Sprite* sprite, Shape* shape) {
 | 
			
		||||
    Prop* self = malloc(sizeof(Prop));
 | 
			
		||||
    ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Prop instance");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@
 | 
			
		|||
#include "sprite.h"
 | 
			
		||||
#include "rigidbody.h"
 | 
			
		||||
#include "collider.h"
 | 
			
		||||
#include "typeclass_helpers.h"
 | 
			
		||||
 | 
			
		||||
typedef struct Prop {
 | 
			
		||||
    Transform transform;
 | 
			
		||||
| 
						 | 
				
			
			@ -35,25 +36,9 @@ static long PropGetDepth(Prop* self) { return -(int)(self->transform.position.y
 | 
			
		|||
 | 
			
		||||
DECL_REFLECT(Prop)
 | 
			
		||||
 | 
			
		||||
impl_Transformable_for(Prop,
 | 
			
		||||
    PropGetTransform
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_PhysicsEntity_for(Prop,
 | 
			
		||||
    PropGetRigidBody,
 | 
			
		||||
    PropOnCollision,
 | 
			
		||||
    PropOnOverlap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_Drop_for(Prop,
 | 
			
		||||
    DestroyProp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
impl_BehaviourEntity_for(Prop,
 | 
			
		||||
    PropStart,
 | 
			
		||||
    PropUpdate,
 | 
			
		||||
    PropDraw,
 | 
			
		||||
    PropGetDepth
 | 
			
		||||
)
 | 
			
		||||
decl_typeclass_impl(Transformable, Prop)
 | 
			
		||||
decl_typeclass_impl(PhysicsEntity, Prop)
 | 
			
		||||
decl_typeclass_impl(Drop, Prop)
 | 
			
		||||
decl_typeclass_impl(BehaviourEntity, Prop)
 | 
			
		||||
 | 
			
		||||
#endif // !FIGHT_PROP_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue