#ifndef PIXELDEFENSE_SYSTEMS_H #define PIXELDEFENSE_SYSTEMS_H #include #include "../components.h" typedef struct Game Game; /********************************** * Utils **********************************/ bool entitySetPath(const ecs_entity_t entity, const Vector2 target, Game *game); /********************************** * AI systems **********************************/ /* * 0: Game (singleton) * 1: UnitAction */ void handleUnitActionsSystem(ecs_iter_t *it); /* * 0: Game (singleton) * 1: UnitAI * 2: UnitAction */ void updateUnitAISystem(ecs_iter_t *it); /* * 0: Game (singleton) * 1: UnitAction */ void updateUnitActionsSystem(ecs_iter_t *it); /* * 1: Easing * 2: Position * 3: Size * 4: Rotation */ void updateEasingSystem(ecs_iter_t *it); /********************************** * Animation Systems **********************************/ /* * 1: Animation * 2: TextureRegion */ void updateAnimationState(ecs_iter_t *it); /* * 0: * 1: Animation * 2: TextureRegion */ void updateAnimation(ecs_iter_t *it); /********************************** * Entity Systems **********************************/ /* Observer (for removing TargetPosition) * 0: Game (singleton) for object pool * 1: Path */ void entityPathRemove(ecs_iter_t *it); /* * 0: Game (singleton) for entity map * 1: Position * 2: Size * 3: Velocity (only entities with velocity change position) * 4: SpatialGridID */ void entityUpdateSpatialID(ecs_iter_t *it); /* * 0: Game (singleton) for collisions * 1: Position * 2: Rotation * 3: Velocity * 4: Steering */ void entityUpdateKinematic(ecs_iter_t *it); /* * 1: Position * 2: Rotation * 3: Velocity * 4: TargetPosition * 5: Steering */ void entityMoveToTarget(ecs_iter_t *it); /* * 0: Game (singleton) for object pool * 1: Path */ void entityFollowPath(ecs_iter_t *it); /* * 1: Position * 2: Size */ void renderColliders(ecs_iter_t *it); /* * 1: Position * 2: Rotation */ void renderRotationDirection(ecs_iter_t *it); /* * 1: Path */ void renderDebugPath(ecs_iter_t *it); /********************************** * Event Systems **********************************/ i32 harvestEvent(ecs_entity_t entity, HarvestEvent event); void depositEvent(ecs_entity_t entity, DepositEvent event); /********************************** * Input systems **********************************/ /* * Task: * 0: Game (singleton) * 0: InputState (singleton) */ void updatePlayerInput(); /* * Task (rendering above ground): * 0: Game (singleton) * 0: InputState (singleton) */ void drawPlayerInputUIGround(); /* * Task (rendering on top): * 0: Game (singleton) * 0: InputState (singleton) */ void drawPlayerInputUI(); /********************************** * UI systems **********************************/ /********************************** * MISC **********************************/ static void setupSystems(ecs_world_t *ecs) { ECS_OBSERVER(ecs, entityPathRemove, EcsOnRemove, Path); ECS_SYSTEM(ecs, entityUpdateSpatialID, EcsOnUpdate, Position, Size, Velocity, SpatialGridID); ECS_SYSTEM(ecs, entityUpdateKinematic, EcsOnUpdate, Position, Rotation, Velocity, Steering); ECS_SYSTEM(ecs, entityMoveToTarget, EcsOnUpdate, Position, Rotation, Velocity, TargetPosition, Steering); ECS_SYSTEM(ecs, entityFollowPath, EcsOnUpdate, Path); ECS_SYSTEM(ecs, handleUnitActionsSystem, EcsOnUpdate, UnitAction); ECS_SYSTEM(ecs, updateUnitAISystem, EcsOnUpdate, UnitAI, UnitAction); // Needs to be called after AI update, since it removes finished actions ECS_SYSTEM(ecs, updateUnitActionsSystem, EcsOnUpdate, UnitAction); ECS_SYSTEM(ecs, updateAnimationState, EcsOnUpdate, Animation, TextureRegion); ECS_SYSTEM(ecs, updateAnimation, EcsOnUpdate, Animation, TextureRegion); ECS_SYSTEM(ecs, updateEasingSystem, EcsOnUpdate, Easing, Position, Size, Rotation); ECS_SYSTEM(ecs, renderDebugPath, EcsOnUpdate, Path); ECS_SYSTEM(ecs, renderColliders, EcsOnUpdate, Position, Size); ECS_SYSTEM(ecs, renderRotationDirection, EcsOnUpdate, Position, Rotation); } #endif //PIXELDEFENSE_SYSTEMS_H