diff --git a/game/src/Enemy.c b/game/src/Enemy.c index 75409ea..1e18eaf 100644 --- a/game/src/Enemy.c +++ b/game/src/Enemy.c @@ -1,8 +1,59 @@ #include "Enemy.h" #include "debug.h" +#include "Messages.h" Enemy* MakeEnemy() { Enemy* self = malloc(sizeof(Enemy)); - ASSERT_RETURN + ASSERT_RETURN(self != NULL, NULL, "Failed to allocate Enemy"); + *self = (Enemy){ + .transform = IdentityTransform, + .behaviour = NULL, + .rigidbody = NULL, + .collider = NULL, + .sprite = sprite_new_empty(), + .health = 5, + }; + self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self)); return self; } + +Enemy* SpawnEnemy(Vector location, const State* entryState) { + Enemy* self = MakeEnemy(); + self->behaviour = state_machine_init(self, entryState); + return self; +} + +void EnemyStart(Enemy* self) {} + +void EnemyUpdate(Enemy* self, float deltaTime) { + state_machine_update(self->behaviour, deltaTime); +} + +void EnemyDraw(Enemy* self) {} + +void EnemyDestroy(Enemy* self) { + state_machine_destroy(self->behaviour); + collider_destroy(self->collider); + rigidbody_destroy(self->rigidbody); + sprite_destroy(self->sprite); + free(self); +} + +void EnemyOnCollision(Enemy* self, Collision collision) {} +void EnemyOnOverlap(Enemy* self, Collider* other) {} + +void EnemyHandleMessage(Enemy* self, MessageID id, void* data) { + switch(id) { + default: return; + case MESSAGE_DEAL_DAMAGE: + self->health -= (uintptr_t)data; + break; + } +} + +Transform* EnemyGetTransform(Enemy* self) { + return &self->transform; +} +RigidBody* EnemyGetRigidBody(Enemy* self) { + return self->rigidbody; +} \ No newline at end of file diff --git a/game/src/Enemy.h b/game/src/Enemy.h index 7fab4d8..b155115 100644 --- a/game/src/Enemy.h +++ b/game/src/Enemy.h @@ -4,17 +4,26 @@ #include "transform.h" #include "state_machine.h" #include "rigidbody.h" +#include "physics_entity.h" +#include "behaviour_entity.h" #include "collider.h" +#include "sprite.h" typedef struct Enemy { Transform transform; - StateMachine behaviour; + StateMachine* behaviour; RigidBody* rigidbody; Collider* collider; + + Sprite* sprite; + + int health; } Enemy; +const MessageID ENEMY_DAMAGE_MESSAGE = 0x1; + extern Enemy* MakeEnemy(); extern Enemy* SpawnEnemy(Vector location, const State* entryState); @@ -22,4 +31,39 @@ extern void EnemyStart(Enemy* self); extern void EnemyUpdate(Enemy* self, float deltaTime); extern void EnemyDestroy(Enemy* self); +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 Transform* EnemyGetTransform(Enemy* self); +extern RigidBody* EnemyGetRigidBody(Enemy* self); +static int EnemyGetDepth(Enemy* self) { return (int)(-self->transform.position.y * 1000); } + +impl_Transformable_for(Enemy, + EnemyGetTransform +) + +impl_MessageReceiver_for(Enemy, + EnemyHandleMessage +) + +impl_Drop_for(Enemy, + EnemyDestroy +) + +impl_BehaviourEntity_for(Enemy, + EnemyStart, + EnemyUpdate, + EnemyDraw, + EnemyGetDepth +) + +impl_PhysicsEntity_for(Enemy, + EnemyGetRigidBody, + EnemyOnCollision, + EnemyOnOverlap +) + #endif // !FIGHT_ENEMY_H