#pragma once #include #include "World.h" #include "Math.h" #include "Physics.h" #include "Pathfind.h" namespace vf { enum class MobState : uint8_t { Wander = 0, Chase = 1, }; struct Mob { Vec3 position; // feet centre (bottom of the collision box) Vec3 velocity; float width = 0.6f; float height = 1.8f; bool onGround = false; MobState state = MobState::Wander; uint32_t rng = 0x2545f491u; // deterministic wander stream Vec3 wanderDir; }; struct MobConfig { float moveSpeed = 3.2f; float gravity = 26.0f; float maxFallSpeed = 55.0f; float chaseRadius = 12.0f; // start chasing inside this range float loseRadius = 16.0f; // give up chasing beyond this (hysteresis) PathConfig path; }; Aabb mobBox(const Mob& mob); Vec3i mobFeetCell(const Mob& mob); // One physics tick: applies the horizontal wish direction and gravity, then // resolves AABB collisions against solid voxels axis by axis (move and slide). void stepMob(const World& world, Mob& mob, const Vec3& wishDir, const MobConfig& config, float dt); // State machine driving the mob. Chases when the target is within range and a // path exists, otherwise wanders. Updates mob.state and returns the horizontal // wish direction to hand to stepMob. Vec3 updateMobBrain(const World& world, Mob& mob, const Vec3& targetPos, const MobConfig& config); } // namespace vf