diff --git a/core/src/message_receiver.c b/core/src/message_receiver.c
index ea56b3a..b0dec28 100644
--- a/core/src/message_receiver.c
+++ b/core/src/message_receiver.c
@@ -1,7 +1,7 @@
 #include "message_receiver.h"
 #include "stddef.h"
 
-void* message_receiver_refuse(void* self, MessageID id, void* data) {
+void* message_receiver_refuse(void* self, MessageID id, uintptr_t data) {
     return NULL;
 }
 
diff --git a/core/src/message_receiver.h b/core/src/message_receiver.h
index a460801..f4a3043 100644
--- a/core/src/message_receiver.h
+++ b/core/src/message_receiver.h
@@ -7,7 +7,7 @@
 typedef uint32_t MessageID;
 
 typedef struct IMessageReceiver {
-    void* (*const handle_message)(void*, MessageID, void*);
+    void* (*const handle_message)(void*, MessageID, uintptr_t);
 } IMessageReceiver;
 
 typedef struct MessageReceiver {
@@ -15,7 +15,7 @@ typedef struct MessageReceiver {
     IMessageReceiver const* tc;
 } MessageReceiver;
 
-extern void* message_receiver_refuse(void* self, MessageID id, void* data);
+extern void* message_receiver_refuse(void* self, MessageID id, uintptr_t);
 
 extern MessageReceiver message_receiver_no_implementation(void* x);
 
@@ -26,9 +26,9 @@ static inline MessageReceiver T##_as_MessageReceiver(T* x) {\
 
 #define impl_MessageReceiver_for(T, handle_message_f)\
 static inline MessageReceiver T##_as_MessageReceiver(T* x) {\
-    TC_FN_TYPECHECK(void*, handle_message_f, T*, MessageID, void*);\
+    TC_FN_TYPECHECK(void*, handle_message_f, T*, MessageID, uintptr_t);\
     static IMessageReceiver const tc = {\
-        .handle_message = (void*(*const)(void*,MessageID,void*)) handle_message_f,\
+        .handle_message = (void*(*const)(void*,MessageID,uintptr_t)) handle_message_f,\
     };\
     return (MessageReceiver){.data = x, .tc = &tc};\
 }
diff --git a/game/src/Enemy.c b/game/src/Enemy.c
index faea59d..34f4246 100644
--- a/game/src/Enemy.c
+++ b/game/src/Enemy.c
@@ -66,11 +66,13 @@ void EnemyDestroy(Enemy* self) {
 void EnemyOnCollision(Enemy* self, Collision collision) {}
 void EnemyOnOverlap(Enemy* self, Collider* other) {}
 
-void* EnemyHandleMessage(Enemy* self, MessageID id, void* data) {
+void* EnemyHandleMessage(Enemy* self, MessageID id, uintptr_t data) {
     switch(id) {
     case MESSAGE_DEAL_DAMAGE:
-        self->health -= (uintptr_t)data;
+        self->health -= (int)data;
         self->hurt = 1;
+        if(self->health <= 0)
+            game_world_destroy_entity(Enemy_as_BehaviourEntity(self));
         break;
     default:
         break;
diff --git a/game/src/Enemy.h b/game/src/Enemy.h
index 21b56ed..a9d0b7d 100644
--- a/game/src/Enemy.h
+++ b/game/src/Enemy.h
@@ -43,7 +43,7 @@ extern void EnemyDraw(Enemy* self);
 
 extern void EnemyOnCollision(Enemy* self, Collision collision);
 extern void EnemyOnOverlap(Enemy* self, Collider* other);
-extern void* EnemyHandleMessage(Enemy* self, MessageID id, void* data);
+extern void* EnemyHandleMessage(Enemy* self, MessageID id, uintptr_t data);
 
 extern Transform* EnemyGetTransform(Enemy* self);
 extern RigidBody* EnemyGetRigidBody(Enemy* self);
diff --git a/game/src/PlayerStates.c b/game/src/PlayerStates.c
index 7720551..828eed6 100644
--- a/game/src/PlayerStates.c
+++ b/game/src/PlayerStates.c
@@ -57,7 +57,7 @@ void PlayerAttackTrigger(Player* self) {
         MakeVector(0.1f, 0.06f), PHYSICS_LAYER_COMBAT, self->rigidbody);
     if(found != NULL) {
         PhysicsEntity entity = collider_get_owner(found);
-        entity.message_receiver->handle_message(entity.data, 1, (void*)1u);
+        entity.message_receiver->handle_message(entity.data, 1, 1u);
     }
     ++self->animationTriggers;
 }
diff --git a/game/src/Prop.c b/game/src/Prop.c
index 39c760e..4ea7b37 100644
--- a/game/src/Prop.c
+++ b/game/src/Prop.c
@@ -61,10 +61,10 @@ RigidBody* PropGetRigidBody(Prop* self) {
     return self->rigidbody;
 }
 
-void* PropReceiveMessage(Prop* self, MessageID message, void* data) {
+void* PropReceiveMessage(Prop* self, MessageID message, uintptr_t data) {
     if(message == 1) {
-        int damage = *(int*)data;
-        game_world_destroy_entity(Prop_as_BehaviourEntity(self));
+        unsigned damage = (int)data;
+        LOG_INFO("Punching bag took %u damage", damage);
     }
     return 0;
 }
diff --git a/game/src/Prop.h b/game/src/Prop.h
index f46d77b..73bcddc 100644
--- a/game/src/Prop.h
+++ b/game/src/Prop.h
@@ -31,7 +31,7 @@ void PropOnOverlap(Prop* self, Collider* other);
 Transform* PropGetTransform(Prop* self);
 RigidBody* PropGetRigidBody(Prop* self);
 
-void* PropReceiveMessage(Prop* self, MessageID message, void* data);
+void* PropReceiveMessage(Prop* self, MessageID message, uintptr_t data);
 
 static long PropGetDepth(Prop* self) { return -(int)(self->transform.position.y * 1000); }