diff options
author | nathansmithsmith <nathansmith7@mailfence.com> | 2023-09-14 20:09:12 -0600 |
---|---|---|
committer | nathansmithsmith <nathansmith7@mailfence.com> | 2023-09-14 20:09:12 -0600 |
commit | c160543a7982a62062aae978da08e4f18ae1e712 (patch) | |
tree | 81c8e42af6e18d63dd78ed017cf92cd6d7746152 /src/entities | |
parent | 3d114213c9797cce0a80918d0771c2314202ef95 (diff) |
Missile worky worky
Diffstat (limited to 'src/entities')
-rw-r--r-- | src/entities/antifaShip.c | 1 | ||||
-rw-r--r-- | src/entities/guidedMissile.c | 2 | ||||
-rw-r--r-- | src/entities/missile.c | 46 | ||||
-rw-r--r-- | src/entities/missile.h | 17 | ||||
-rw-r--r-- | src/entities/mussolini.c | 29 | ||||
-rw-r--r-- | src/entities/mussolini.h | 2 |
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); |