#include "Enemy.h" #include "debug.h" #include "Messages.h" #include "game_world.h" #include "physics.h" #include "physics_world.h" Enemy* MakeEnemy() { Enemy* self = malloc(sizeof(Enemy)); ASSERT_RETURN(self != NULL, NULL, "Failed to allocate Enemy"); *self = (Enemy){ .transform = IdentityTransform, .behaviour = NULL, .rigidbody = NULL, .collider = NULL, .sprite = sprite_new_empty(), .hurt = 0, .idle = NULL, .walk = NULL, .hurt_anim = NULL, .currentAnimation = NULL, .health = 5, }; self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self)); self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0, PHYSICS_LAYER_DEFAULT); sprite_set_origin(self->sprite, MakeVector(0.45f, 0.925f)); self->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(512)), 1.5f, LoopMode_Loop); self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(512)), 1.5f, LoopMode_Loop); return self; } Enemy* SpawnEnemy(Vector location, const State* entryState) { Enemy* self = MakeEnemy(); self->behaviour = state_machine_init(self, entryState); self->transform.position = location; game_world_add_entity(Enemy_as_BehaviourEntity(self)); physics_world_add_entity(Enemy_as_PhysicsEntity(self)); return self; } void EnemyStart(Enemy* self) {} void EnemyUpdate(Enemy* self, float deltaTime) { state_machine_update(self->behaviour, deltaTime); if(self->health <= 0) game_world_destroy_entity(Enemy_as_BehaviourEntity(self)); } void EnemyDraw(Enemy* self) { animation_sprite_draw(self->currentAnimation, &self->transform); shape_draw(collider_get_shape(self->collider), self->transform); } 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) { case MESSAGE_DEAL_DAMAGE: self->health -= (uintptr_t)data; self->hurt = 1; break; default: break; } return NULL; } Transform* EnemyGetTransform(Enemy* self) { return &self->transform; } RigidBody* EnemyGetRigidBody(Enemy* self) { return self->rigidbody; }