aboutsummaryrefslogtreecommitdiff
path: root/src/entities
diff options
context:
space:
mode:
authornathansmithsmith <nathansmith7@mailfence.com>2023-09-14 20:09:12 -0600
committernathansmithsmith <nathansmith7@mailfence.com>2023-09-14 20:09:12 -0600
commitc160543a7982a62062aae978da08e4f18ae1e712 (patch)
tree81c8e42af6e18d63dd78ed017cf92cd6d7746152 /src/entities
parent3d114213c9797cce0a80918d0771c2314202ef95 (diff)
Missile worky worky
Diffstat (limited to 'src/entities')
-rw-r--r--src/entities/antifaShip.c1
-rw-r--r--src/entities/guidedMissile.c2
-rw-r--r--src/entities/missile.c46
-rw-r--r--src/entities/missile.h17
-rw-r--r--src/entities/mussolini.c29
-rw-r--r--src/entities/mussolini.h2
6 files changed, 96 insertions, 1 deletions
diff --git a/src/entities/antifaShip.c b/src/entities/antifaShip.c
index f6a9ec9..fb307fb 100644
--- a/src/entities/antifaShip.c
+++ b/src/entities/antifaShip.c
@@ -2,6 +2,7 @@
#include "game.h"
#include "settings.h"
#include "bullets.h"
+#include "assets.h"
void initAntifaShip(Entity * entity, Game * game) {
entity->model = &game->assets.models[ANTIFA_SHIP_ASSET];
diff --git a/src/entities/guidedMissile.c b/src/entities/guidedMissile.c
index cd5bbe1..7780404 100644
--- a/src/entities/guidedMissile.c
+++ b/src/entities/guidedMissile.c
@@ -73,7 +73,7 @@ void guidedMissileGoBoomBoom(Game * game, Entity * entity) {
// Get player distance and get the damage the missile will do.
float distance = Vector3Distance(player->position, entity->position);
- float damage = fabsf(GUIDED_MISSILE_DAMAGE - (distance * GUIDED_MISSILE_BOOM_DISTANCE_MOD));
+ float damage = fabs(GUIDED_MISSILE_DAMAGE - (distance * GUIDED_MISSILE_BOOM_DISTANCE_MOD));
// Hurt this mother fucker.
player->health -= damage;
diff --git a/src/entities/missile.c b/src/entities/missile.c
new file mode 100644
index 0000000..c8e22ea
--- /dev/null
+++ b/src/entities/missile.c
@@ -0,0 +1,46 @@
+#include "missile.h"
+#include "game.h"
+#include "assets.h"
+
+// I luv deadly weapons (:
+
+void initMissile(Entity * entity, Game * game) {
+ entity->model = &game->assets.models[MISSILE_ASSET];
+ entity->collisionModel = entityCreateCollisionModel(*entity->model);
+ entity->transformedCollisionModel = entityCreateCollisionModel(*entity->model);
+ setEntityRadius(entity);
+}
+
+void closeMissile(Entity * entity) {
+ entityFreeCollisionModel(entity->collisionModel);
+ entityFreeCollisionModel(entity->transformedCollisionModel);
+}
+
+void updateMissile(Game * game, Entity * entity) {
+ entityUpdateLastValues(entity);
+
+ entityUpdatePosition(entity);
+
+ entityCheckTransformedCollisionModel(entity);
+}
+
+void drawMissile(Game * game, Entity * entity) {
+ entityDraw(entity);
+}
+
+void aimMissileAtTarget(Entity * entity, Vector3 target) {
+ setMissileDirection(entity, Vector3Normalize(Vector3Subtract(entity->position, target)));
+}
+
+void setMissileDirection(Entity * entity, Vector3 direction) {
+ // Get look at matrix and rotation.
+ Matrix matrix = MatrixLookAt(Vector3Zero(), direction, (Vector3){0.0, 1.0, 0.0});
+ entity->rotation = QuaternionInvert(QuaternionFromMatrix(matrix));
+
+ // Set velocity.
+ entity->velocity.velocity = (Vector3){
+ matrix.m2 * MISSILE_SPEED,
+ matrix.m6 * MISSILE_SPEED,
+ matrix.m10 * MISSILE_SPEED
+ };
+}
diff --git a/src/entities/missile.h b/src/entities/missile.h
new file mode 100644
index 0000000..9c81b52
--- /dev/null
+++ b/src/entities/missile.h
@@ -0,0 +1,17 @@
+#include "gameCommon.h"
+#include "entity.h"
+
+#ifndef MISSILE_H
+#define MISSILE_H
+
+#define MISSILE_SPEED 100.0
+
+void initMissile(Entity * entity, Game * game);
+void closeMissile(Entity * entity);
+void updateMissile(Game * game, Entity * entity);
+void drawMissile(Game * game, Entity * entity);
+
+void aimMissileAtTarget(Entity * entity, Vector3 target);
+void setMissileDirection(Entity * entity, Vector3 direction);
+
+#endif
diff --git a/src/entities/mussolini.c b/src/entities/mussolini.c
index 9f56aa3..151e050 100644
--- a/src/entities/mussolini.c
+++ b/src/entities/mussolini.c
@@ -2,6 +2,9 @@
#include "assets.h"
#include "game.h"
#include "util.h"
+#include "missile.h"
+#include "world.h"
+#include "entity.h"
void initMussolini(Entity * entity, Game * game) {
entity->model = &game->assets.models[MUSSOLINI_ASSET];
@@ -18,11 +21,35 @@ void initMussolini(Entity * entity, Game * game) {
}
Mussolini * data = (Mussolini*)entity->data;
+
+ data->timeSinceLastMissile = GetTime();
}
void closeMussolini(Entity * entity) {
if (entity->data != NULL)
KF_FREE(entity->data);
+
+ entityFreeCollisionModel(entity->collisionModel);
+ entityFreeCollisionModel(entity->transformedCollisionModel);
+}
+
+void updateMussoliniGuns(Game * game, Entity * entity) {
+ double t = GetTime();
+ Entity * player = getEntityFromWorld(game->world, 0);
+ Mussolini * data = (Mussolini*)entity->data;
+
+ if (t - data->timeSinceLastMissile < MUSSOLINI_MISSILE_DOWN_COOL)
+ return;
+
+ // Shoot missile.
+ Entity missile = createEntity(ENTITY_MISSILE, game);
+ missile.position = entity->position;
+ aimMissileAtTarget(&missile, player->position);
+ scheduleEntityToAdd(&game->world, missile);
+
+ puts("shoot shoot");
+
+ data->timeSinceLastMissile = t;
}
void updateMussolini(Game * game, Entity * entity) {
@@ -32,6 +59,8 @@ void updateMussolini(Game * game, Entity * entity) {
Entity * player = getEntityFromWorld(game->world, 0);
Mussolini * data = (Mussolini*)entity->data;
+ updateMussoliniGuns(game, entity);
+
// Look at player.
Matrix matrix = MatrixLookAt(player->position, entity->position, (Vector3){0.0, 1.0, 0.0});
Quaternion rotation = QuaternionInvert(QuaternionFromMatrix(matrix));
diff --git a/src/entities/mussolini.h b/src/entities/mussolini.h
index 5238849..9ce453d 100644
--- a/src/entities/mussolini.h
+++ b/src/entities/mussolini.h
@@ -6,8 +6,10 @@
#define MUSSOLINI_H
#define MUSSOLINI_TURN_SPEED 1.0
+#define MUSSOLINI_MISSILE_DOWN_COOL 3.0
typedef struct Mussolini {
+ double timeSinceLastMissile;
} Mussolini;
void initMussolini(Entity * entity, Game * game);