aboutsummaryrefslogtreecommitdiff
path: root/src/entities/maresciallo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/entities/maresciallo.c')
-rw-r--r--src/entities/maresciallo.c70
1 files changed, 68 insertions, 2 deletions
diff --git a/src/entities/maresciallo.c b/src/entities/maresciallo.c
index 6127786..f447819 100644
--- a/src/entities/maresciallo.c
+++ b/src/entities/maresciallo.c
@@ -1,18 +1,84 @@
#include "maresciallo.h"
#include "assets.h"
#include "game.h"
+#include "PID.h"
void initMaresciallo(Entity * entity, Game * game) {
entity->model = &game->assets.models[MARESCIALLO_ASSET];
+ entity->collisionModel = entityCreateCollisionModel(*entity->model);
+ entity->transformedCollisionModel = entityCreateCollisionModel(*entity->model);
setEntityRadius(entity);
- entity->velocity.angularVelocity = (AxisAngle){(Vector3){1.0, 1.0, 1.0}, 1.0};
+
+ // Allocate data.
+ entity->data = KF_MALLOC(sizeof(Maresciallo));
+
+ if (entity->data == NULL) {
+ ALLOCATION_ERROR;
+ return;
+ }
+
+ Maresciallo * data = (Maresciallo*)entity->data;
+
+ PIDConfig flyAwayPID = (PIDConfig){
+ .kP = 1.1,
+ .kI = 0.0,
+ .kD = 0.0,
+ .angleMode = false,
+ .doClamp = true,
+ .min = 0.0,
+ .max = 210.0
+ };
+
+ data->flyAway = (EntityFlyToPointInfo){
+ .controller.speedPID = createPID(flyAwayPID),
+ .controlType = ENTITY_FLY_TO_POINT_PID,
+ .rotationSpeed = 0.0,
+ .applyRotation = true
+ };
+
}
void closeMaresciallo(Entity * entity) {
+ if (entity->data != NULL)
+ KF_FREE(entity->data);
+
+ entityFreeCollisionModel(entity->collisionModel);
+ entityFreeCollisionModel(entity->transformedCollisionModel);
+}
+
+void getAwayMaresciallo(Game * game, Entity * entity) {
+ Maresciallo * data = (Maresciallo*)entity->data;
+ Entity * player = getEntityFromWorld(game->world, 0);
+
+ // Get target.
+ Vector3 target = Vector3Subtract(entity->position, player->position);
+ target = Vector3Normalize(target);
+ target = Vector3Scale(target, MARESCIALLO_CIRCLE_AT_DIS);
+ target = Vector3Add(player->position, target);
+
+ // Fucking get away from the smelly player.
+ entityFlyToPoint(entity, target, &data->flyAway);
+}
+
+void circlePlayerMaresciallo(Game * game, Entity * entity) {
+ Maresciallo * data = (Maresciallo*)entity->data;
+ Entity * player = getEntityFromWorld(game->world, 0);
}
void updateMaresciallo(Game * game, Entity * entity) {
- entityUpdateRotation(entity);
+ entityUpdateLastValues(entity);
+
+ Maresciallo * data = (Maresciallo*)entity->data;
+ Entity * player = getEntityFromWorld(game->world, 0);
+
+ // Fly away if to close to player.
+ if (Vector3Distance(entity->position, player->position) < MARESCIALLO_CIRCLE_AT_DIS) {
+ getAwayMaresciallo(game, entity);
+ } else {
+ circlePlayerMaresciallo(game, entity);
+ }
+
+ entityCheckTransformedCollisionModel(entity);
}
void drawMaresciallo(Game * game, Entity * entity) {