Files

86 lines
2.9 KiB
C++

#pragma once
#include <cstdint>
#include "Block.h"
#include "Item.h"
namespace vf {
enum class DamageSource : uint8_t { Fall, Starvation, Drowning, MobAttack, Fire, Lava, Void, Generic };
struct SurvivalConfig {
float maxHealth = 20.0f;
float maxHunger = 20.0f;
float maxSaturation = 20.0f;
float regenIntervalSeconds = 0.5f;
int regenHungerThreshold = 18;
float exhaustionPerRegenHeart = 6.0f;
float exhaustionThreshold = 4.0f;
float starveIntervalSeconds = 4.0f;
float starveDamagePerTick = 1.0f;
float safeFallDistance = 3.0f;
float fallDamagePerBlock = 1.0f;
float breathHoldSeconds = 15.0f;
float drownIntervalSeconds = 1.0f;
float drownDamagePerTick = 2.0f;
};
struct SurvivalState {
float health;
float hunger;
float saturation;
float exhaustion = 0.0f;
float regenTimer = 0.0f;
float starveTimer = 0.0f;
float airRemaining;
float drownTimer = 0.0f;
bool alive = true;
explicit SurvivalState(const SurvivalConfig& config = {});
};
enum class ExertionAction : uint8_t { Walk, Sprint, Jump, SprintJump, Swim, MineBlock, AttackHit };
// Exhaustion added per unit of `action` (per block moved, per jump, per hit).
float exhaustionCost(ExertionAction action);
void addExhaustion(SurvivalState& state, const SurvivalConfig& config, float amount);
void applyExertion(SurvivalState& state, const SurvivalConfig& config, ExertionAction action,
float units = 1.0f);
// One fixed tick: drains accumulated exhaustion into saturation/hunger,
// regenerates health while well fed, and starves the player when hunger is
// empty.
void tickHungerAndRegen(SurvivalState& state, const SurvivalConfig& config, float dt);
// Applies raw damage from `source`, clamping health at zero. Returns true if
// this hit killed the player.
bool applyDamage(SurvivalState& state, DamageSource source, float amount);
// Eats a food item: restores hunger/saturation up to their caps. No-op for
// non-food items.
void eat(SurvivalState& state, const SurvivalConfig& config, ItemId food);
// Damage for a landing after falling `fallDistance` blocks; 0 within the safe
// distance. Applies the damage to `state` and returns the amount applied.
float applyFallDamage(SurvivalState& state, const SurvivalConfig& config, float fallDistance);
// Call once per tick with the player's submersion state. Drains held breath
// while submerged and applies periodic damage once it runs out; recovers
// breath while not submerged.
void tickBreath(SurvivalState& state, const SurvivalConfig& config, float dt, bool isUnderwater);
// Seconds to break `block` bare-handed; Bedrock and fluids are unbreakable
// and return positive infinity.
float blockHardness(Block block);
// Seconds to break `block` with `tool` held (ItemId::None for bare hands),
// combining hardness with the tool's mining speed multiplier.
float miningSeconds(Block block, ItemId tool);
} // namespace vf