aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent3d114213c9797cce0a80918d0771c2314202ef95 (diff)
Missile worky worky
Diffstat (limited to 'src')
-rw-r--r--src/assets.c3
-rw-r--r--src/assets.h5
-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
-rw-r--r--src/entitiesInclude.h1
-rw-r--r--src/entity.c3
-rw-r--r--src/entity.h5
-rw-r--r--src/game.c2
12 files changed, 108 insertions, 8 deletions
diff --git a/src/assets.c b/src/assets.c
index 94f2aa8..fd11707 100644
--- a/src/assets.c
+++ b/src/assets.c
@@ -14,7 +14,8 @@ const char modelAssetPaths[MODEL_ASSET_COUNT][ASSET_PATH_MAX] = {
"/home/nathan/Documents/KillaFacsista/assets/maresciallo.obj",
"/home/nathan/Documents/KillaFacsista/assets/generale.obj",
"/home/nathan/Documents/KillaFacsista/assets/mussolini.obj",
- "/home/nathan/Documents/KillaFacsista/assets/guidedMissile.obj"
+ "/home/nathan/Documents/KillaFacsista/assets/guidedMissile.obj",
+ "/home/nathan/Documents/KillaFacsista/assets/missile.obj"
};
void LoadAssets(Assets * assets) {
diff --git a/src/assets.h b/src/assets.h
index 63839ee..ed842a6 100644
--- a/src/assets.h
+++ b/src/assets.h
@@ -6,7 +6,7 @@
#define ASSET_PATH_MAX 255
#define TEXTURE_ASSET_COUNT 3
-#define MODEL_ASSET_COUNT 8
+#define MODEL_ASSET_COUNT 9
// Paths to assets.
extern const char textureAssetPaths[TEXTURE_ASSET_COUNT][ASSET_PATH_MAX];
@@ -30,7 +30,8 @@ enum {
MARESCIALLO_ASSET,
GENERALE_ASSET,
MUSSOLINI_ASSET,
- GUIDED_MISSILE_ASSET
+ GUIDED_MISSILE_ASSET,
+ MISSILE_ASSET
};
typedef struct Assets {
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);
diff --git a/src/entitiesInclude.h b/src/entitiesInclude.h
index be4713c..e1d2cd5 100644
--- a/src/entitiesInclude.h
+++ b/src/entitiesInclude.h
@@ -6,5 +6,6 @@
#include "entities/generale.h"
#include "entities/mussolini.h"
#include "entities/guidedMissile.h"
+#include "entities/missile.h"
// Through the magic of this ugly file you can include all entities at once.
diff --git a/src/entity.c b/src/entity.c
index fb000a7..4197444 100644
--- a/src/entity.c
+++ b/src/entity.c
@@ -11,7 +11,8 @@ const EntityTypeInfo entityTypeInfo[ENTITY_TYPE_COUNT] = {
(EntityTypeInfo){initMaresciallo, closeMaresciallo, updateMaresciallo, drawMaresciallo},
(EntityTypeInfo){initGenerale, closeGenerale, updateGenerale, drawGenerale},
(EntityTypeInfo){initMussolini, closeMussolini, updateMussolini, drawMussolini},
- (EntityTypeInfo){initGuidedMissile, closeGuidedMissile, updateGuidedMissile, drawGuidedMissile}
+ (EntityTypeInfo){initGuidedMissile, closeGuidedMissile, updateGuidedMissile, drawGuidedMissile},
+ (EntityTypeInfo){initMissile, closeMissile, updateMissile, drawMissile}
};
EntityVelocity entityVelocityIdentity() {
diff --git a/src/entity.h b/src/entity.h
index f67f091..d78f308 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -14,10 +14,11 @@ enum {
ENTITY_MARESCIALLO,
ENTITY_GENERALE,
ENTITY_MUSSOLINI,
- ENTITY_GUIDED_MISSILE
+ ENTITY_GUIDED_MISSILE,
+ ENTITY_MISSILE
};
-#define ENTITY_TYPE_COUNT 8
+#define ENTITY_TYPE_COUNT 9
typedef int8_t EntityType;
typedef int16_t EntityId; // Id in world.
diff --git a/src/game.c b/src/game.c
index 0079e7f..8ee592b 100644
--- a/src/game.c
+++ b/src/game.c
@@ -35,7 +35,7 @@ void initGame(Game * game) {
WorldEntry entries[2] = {
(WorldEntry){ENTITY_ANTIFA, (Vector3){0.0, 0.0, 0.0}, QuaternionIdentity()},
- (WorldEntry){ENTITY_GENERALE, (Vector3){0.0, 0.0, 10.0}, QuaternionIdentity()}
+ (WorldEntry){ENTITY_MUSSOLINI, (Vector3){0.0, 0.0, 150.0}, QuaternionIdentity()}
};
addEntriesToWorld(