aboutsummaryrefslogtreecommitdiff
path: root/src/entities/caporale.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/entities/caporale.c')
-rw-r--r--src/entities/caporale.c85
1 files changed, 84 insertions, 1 deletions
diff --git a/src/entities/caporale.c b/src/entities/caporale.c
index 32f0f20..1203b61 100644
--- a/src/entities/caporale.c
+++ b/src/entities/caporale.c
@@ -1,6 +1,8 @@
#include "caporale.h"
#include "assets.h"
#include "game.h"
+#include <raylib.h>
+#include <raymath.h>
void initCaporale(Entity * entity, Game * game) {
entity->model = &game->assets.models[CAPORATE_ASSET];
@@ -25,6 +27,24 @@ void initCaporale(Entity * entity, Game * game) {
.rotationSpeed = 0.5,
.applyRotation = true
};
+
+ data->timeSinceLastShot = 0.0;
+
+ PIDConfig aimPIDConfig = (PIDConfig){
+ .kP = 2.0,
+ .kI = 0.0,
+ .kD = 0.0,
+ .angleMode = false,
+ .doClamp = false,
+ .min = 0.0,
+ .max = 0.0
+ };
+
+ data->aimXPID = createPID(aimPIDConfig);
+ data->aimYPID = createPID(aimPIDConfig);
+ data->aimZPID = createPID(aimPIDConfig);
+
+ data->initTarget = true;
}
void closeCaporale(Entity * entity) {
@@ -35,17 +55,80 @@ void closeCaporale(Entity * entity) {
entityFreeCollisionModel(entity->transformedCollisionModel);
}
+void updateGunsCaporale(Game * game, Entity * entity) {
+ double t = GetTime();
+ Caporale * data = (Caporale*)entity->data;
+ Entity * player = getEntityFromWorld(game->world, 0);
+
+ DrawRay(data->ray, BLUE);
+
+ // Get target.
+ Vector3 target = Vector3Subtract(player->position, entity->position);
+ target = Vector3Normalize(target);
+ target = Vector3Scale(target, CAPORALE_TARGET_POINTER_DIS);
+ data->targetSetpoint = target;
+
+ // Cool down.
+ if (t - data->timeSinceLastShot < CAPORALE_COOLDOWN)
+ return;
+
+ // Get direction.
+ target = Vector3Add(entity->position, data->target); // Transform to entity.
+ Vector3 direction = Vector3Subtract(target, entity->position);
+ direction = Vector3Normalize(direction);
+
+ // Create bullet and shoot.
+ Bullet bullet = createBulletFromDirection(*entity, direction, CAPORALE_BULLET_DAMAGE);
+ BulletHitInfo info = shootBulletAtEntity(player, bullet);
+
+ printf("%d\n", info.hit);
+
+ data->ray = bullet.ray;
+ data->timeSinceLastShot = t;
+}
+
+void updateAimCaporale(Game * game, Entity * entity) {
+ float t = GetFrameTime();
+ Caporale * data = (Caporale*)entity->data;
+ Entity * player = getEntityFromWorld(game->world, 0);
+
+ // Init.
+ if (data->initTarget) {
+ data->initTarget = false;
+ data->target = Vector3Zero();
+ data->targetVelocity = Vector3Zero();
+ return;
+ }
+
+ // Move target closer to player.
+ data->targetVelocity = (Vector3){
+ runPID(data->targetSetpoint.x, data->target.x, &data->aimXPID),
+ runPID(data->targetSetpoint.y, data->target.y, &data->aimYPID),
+ runPID(data->targetSetpoint.z, data->target.z, &data->aimZPID)
+ };
+
+ data->target = Vector3Add(data->target, Vector3Scale(data->targetVelocity, t));
+
+ // debug.
+ Vector3 target = Vector3Add(entity->position, data->target);
+ DrawCubeV(target, Vector3One(), BLUE);
+ DrawLine3D(entity->position, target, BLUE);
+}
+
void updateCaporale(Game * game, Entity * entity) {
entityUpdateLastValues(entity);
Caporale * data = (Caporale*)entity->data;
Entity * player = getEntityFromWorld(game->world, 0);
- entityFlyToPoint(entity, player->position, &data->flyToPlayer);
+ //entityFlyToPoint(entity, player->position, &data->flyToPlayer);
entityCheckTransformedCollisionModel(entity);
}
void drawCaporale(Game * game, Entity * entity) {
entityDraw(entity);
+
+ updateAimCaporale(game, entity);
+ updateGunsCaporale(game, entity);
}