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 | |
parent | 3d114213c9797cce0a80918d0771c2314202ef95 (diff) |
Missile worky worky
Diffstat (limited to 'src')
-rw-r--r-- | src/assets.c | 3 | ||||
-rw-r--r-- | src/assets.h | 5 | ||||
-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 | ||||
-rw-r--r-- | src/entitiesInclude.h | 1 | ||||
-rw-r--r-- | src/entity.c | 3 | ||||
-rw-r--r-- | src/entity.h | 5 | ||||
-rw-r--r-- | src/game.c | 2 |
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. @@ -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( |