#pragma once #include "Entity.hpp" #include "raylib.h" #include #include struct TransformComponent : public Component { float x = 0.0f; float y = 0.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct PhysicsComponent : public Component { float vx = 0.0f; float vy = 0.0f; float speedCap = 400.0f; void Setup() override {} void Update(float dt) override { auto transform = entity->GetComponent(); if (!transform) { return; } const float speed = std::sqrt(vx * vx + vy * vy); if (speed > speedCap && speed > 0.0f) { const float scale = speedCap / speed; vx *= scale; vy *= scale; } transform->get().x += vx * dt; transform->get().y += vy * dt; } void Cleanup() override {} }; struct GravityWellComponent : public Component { float mass = 150000.0f; float minDist = 30.0f; bool active = false; float followLerp = 12.0f; void Setup() override {} void Update(float dt) override { auto transform = entity->GetComponent(); if (!transform) { return; } // TODO: use buffered input active = IsMouseButtonDown(MOUSE_BUTTON_LEFT); const Vector2 mouse = GetMousePosition(); auto &t = transform->get(); const float blend = std::clamp(followLerp * dt, 0.0f, 1.0f); t.x += (mouse.x - t.x) * blend; t.y += (mouse.y - t.y) * blend; } void Cleanup() override {} }; struct GravityReceiverComponent : public Component { Entity *well = nullptr; bool inVoid = false; void Setup() override {} void Update(float dt) override { (void)inVoid; if (!well) { return; } auto myTransform = entity->GetComponent(); auto physics = entity->GetComponent(); auto wellTransform = well->GetComponent(); auto wellGravity = well->GetComponent(); if (!myTransform || !physics || !wellTransform || !wellGravity) { return; } if (!wellGravity->get().active) { return; } const float dx = wellTransform->get().x - myTransform->get().x; const float dy = wellTransform->get().y - myTransform->get().y; const float dist = std::sqrt(dx * dx + dy * dy); if (dist <= 0.0001f) { return; } const float clampedDist = std::max(dist, wellGravity->get().minDist); const float force = wellGravity->get().mass / (clampedDist * clampedDist); const float nx = dx / dist; const float ny = dy / dist; physics->get().vx += nx * force * dt; physics->get().vy += ny * force * dt; } void Cleanup() override {} }; struct ColliderComponent : public Component { float radius = 8.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct ScrollComponent : public Component { float scrollX = 0.0f; float speed = 2.0f; float accel = 0.018f; void Setup() override {} void Update(float dt) override { speed += accel * dt; scrollX += speed * dt * 60.0f; } void Cleanup() override {} }; struct ScrollableComponent : public Component { float worldX = 0.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct SpawnComponent : public Component { float cursorWX = 0.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct TrailComponent : public Component { void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct ProjectionComponent : public Component { void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct MeterComponent : public Component { float value = 60.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct HudComponent : public Component { void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct RenderComponent : public Component { virtual void Draw() {} void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct NullZoneComponent : public Component { float width = 70.0f; void Setup() override {} void Update(float) override {} void Cleanup() override {} }; struct CollectibleComponent : public Component { bool collected = false; void Setup() override {} void Update(float) override {} void Cleanup() override {} };