89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
#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;
|
|
}
|