Added survival mechanic that consumes inventory items if needed.
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
using System;
|
||||
|
||||
public class SurvivalState
|
||||
{
|
||||
private const float HungerDrainPerSecond = 0.035f;
|
||||
private const float ThirstDrainPerSecond = 0.055f;
|
||||
private const float PassiveEnergyDrainPerSecond = 0.025f;
|
||||
private const float AutoConsumeThreshold = 35f;
|
||||
|
||||
public float hunger = 100f;
|
||||
public float thirst = 100f;
|
||||
public float energy = 100f;
|
||||
|
||||
public float maxHunger = 100f;
|
||||
public float maxThirst = 100f;
|
||||
public float maxEnergy = 100f;
|
||||
|
||||
public bool isDead = false;
|
||||
public string deathReason = "";
|
||||
public string currentStatus = "";
|
||||
|
||||
public void Update(double delta)
|
||||
{
|
||||
if (isDead) return;
|
||||
|
||||
hunger = Math.Clamp(hunger - HungerDrainPerSecond * (float)delta, 0f, maxHunger);
|
||||
thirst = Math.Clamp(thirst - ThirstDrainPerSecond * (float)delta, 0f, maxThirst);
|
||||
energy = Math.Clamp(energy - PassiveEnergyDrainPerSecond * (float)delta, 0f, maxEnergy);
|
||||
|
||||
TryAutoConsumeFood();
|
||||
TryAutoConsumeWater();
|
||||
TryAutoConsumeEnergy();
|
||||
UpdateStatus();
|
||||
CheckDeath();
|
||||
}
|
||||
|
||||
public bool TryConsumeEnergy(float amount)
|
||||
{
|
||||
if (amount <= 0f) return true;
|
||||
if (energy < amount) return false;
|
||||
|
||||
energy -= amount;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void TryAutoConsumeFood()
|
||||
{
|
||||
if (hunger > AutoConsumeThreshold) return;
|
||||
if (!GameData.inventory.TryRemoveItem("mushroom", 1)) return;
|
||||
|
||||
hunger = Math.Clamp(hunger + 35f, 0f, maxHunger);
|
||||
}
|
||||
|
||||
private void TryAutoConsumeWater()
|
||||
{
|
||||
if (thirst > AutoConsumeThreshold) return;
|
||||
if (!GameData.inventory.TryRemoveItem("water", 1)) return;
|
||||
|
||||
thirst = Math.Clamp(thirst + 40f, 0f, maxThirst);
|
||||
}
|
||||
|
||||
private void TryAutoConsumeEnergy()
|
||||
{
|
||||
if (energy > AutoConsumeThreshold) return;
|
||||
|
||||
if (GameData.inventory.TryRemoveItem("battery_v2", 1))
|
||||
{
|
||||
energy = Math.Clamp(energy + 70f, 0f, maxEnergy);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GameData.inventory.TryRemoveItem("battery_v1", 1))
|
||||
{
|
||||
energy = Math.Clamp(energy + 45f, 0f, maxEnergy);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GameData.inventory.TryRemoveItem("steam", 1))
|
||||
{
|
||||
energy = Math.Clamp(energy + 25f, 0f, maxEnergy);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateStatus()
|
||||
{
|
||||
if (hunger <= AutoConsumeThreshold)
|
||||
{
|
||||
currentStatus = "Food supply critical";
|
||||
return;
|
||||
}
|
||||
|
||||
if (thirst <= AutoConsumeThreshold)
|
||||
{
|
||||
currentStatus = "Water supply critical";
|
||||
return;
|
||||
}
|
||||
|
||||
if (energy <= AutoConsumeThreshold)
|
||||
{
|
||||
currentStatus = "Energy reserves critical";
|
||||
return;
|
||||
}
|
||||
|
||||
currentStatus = "Survival stable";
|
||||
}
|
||||
|
||||
private void CheckDeath()
|
||||
{
|
||||
if (hunger <= 0f)
|
||||
{
|
||||
KillPlayer("Starved");
|
||||
return;
|
||||
}
|
||||
|
||||
if (thirst <= 0f)
|
||||
{
|
||||
KillPlayer("Died of thirst");
|
||||
return;
|
||||
}
|
||||
|
||||
if (energy <= 0f)
|
||||
{
|
||||
KillPlayer("Life support lost power");
|
||||
}
|
||||
}
|
||||
|
||||
private void KillPlayer(string reason)
|
||||
{
|
||||
isDead = true;
|
||||
deathReason = reason;
|
||||
currentStatus = "Survival failed: " + reason;
|
||||
GameData.canMove = false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user