calamity-cobra-2/src/game/ecs/component/action/component_action_gripped.c
2023-08-26 09:28:06 -04:00

77 lines
2.1 KiB
C

#include "component_action_gripped.h"
/* DEPENDENCIES: GameObject */
/* Gripped component. These objects can be gripped by entities with ActionGrip components. */
/* What if this object is ungripped (i.e., the gripped is destroyed?) This happens... */
static void
_component_action_gripped_ungrip(ComponentActionGripped* self, ECS* ecs)
{
/* Just kill yourself, lol! */
ecs_entity_delete(ecs, self->component.id);
}
/* When this object is being gripped, do this. */
static void
_component_action_gripped_set(ComponentActionGripped* self, ECS* ecs)
{
ComponentGameObject* gameObject;
ComponentGameObject* gripperGameObject;
ComponentSprite* sprite;
ComponentPhysics* physics;
ComponentPhysics* gripperPhysics;
gripperGameObject = ecs_component_get(ecs, ECS_COMPONENT_GAME_OBJECT, self->gripperID);
/* If we can't find the gripper game object, ungrip this. */
if (!gripperGameObject)
{
_component_action_gripped_ungrip(self, ecs);
return;
}
gameObject = ecs_component_get(ecs, ECS_COMPONENT_GAME_OBJECT, self->component.id);
physics = ecs_component_get(ecs, ECS_COMPONENT_PHYSICS, self->component.id);
gripperPhysics = ecs_component_get(ecs, ECS_COMPONENT_PHYSICS, self->gripperID);
sprite = ecs_component_get(ecs, ECS_COMPONENT_SPRITE, self->component.id);
glm_vec3_copy(gripperPhysics->position, physics->position);
glm_vec3_copy(gripperPhysics->velocity, physics->velocity);
gameObject->height = gripperGameObject->height + (physics->size[1] * 2);
sprite->offset[2] = COMPONENT_ACTION_GRIPPED_Z_OFFSET;
gameObject->isBounce = gripperGameObject->isBounce;
gameObject->isAffectedByGravity = gripperGameObject->isAffectedByGravity;
}
/* Runs on add action gripped component. */
void
component_action_gripped_add(ComponentActionGripped* self, ECS* ecs)
{
self->timer = COMPONENT_ACTION_GRIPPED_TIMER;
}
/* Ticks grip component. */
void
component_action_gripped_tick(ComponentActionGripped* self, ECS* ecs)
{
if (self->timer > 0)
{
self->timer--;
if (self->timer <= 0)
{
self->timer = 0;
self->isAbleToBeGripped = true;
}
return;
}
if (self->isGripped)
_component_action_gripped_set(self, ecs);
}