112 lines
2.5 KiB
PHP
112 lines
2.5 KiB
PHP
<?php
|
|||
|
|
|
||
|
|
namespace App\Services\Game;
|
||
|
|
|
||
|
|
use App\Models\Character;
|
||
|
|
|
||
|
|
class HealthService
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* Regenerate health for a character
|
||
|
|
*/
|
||
|
|
public function regenerate(Character $character): void
|
||
|
|
{
|
||
|
|
if ($character->isDead()) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$regenRate = config('game.health.regen_rate', 2);
|
||
|
|
$character->heal($regenRate);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the health regen rate
|
||
|
|
*/
|
||
|
|
public function getRegenRate(): int
|
||
|
|
{
|
||
|
|
return config('game.health.regen_rate', 2);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the health regen interval in seconds
|
||
|
|
*/
|
||
|
|
public function getRegenInterval(): int
|
||
|
|
{
|
||
|
|
return config('game.health.regen_interval', 600);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Heal a character
|
||
|
|
*/
|
||
|
|
public function heal(Character $character, int $amount): void
|
||
|
|
{
|
||
|
|
$character->heal($amount);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Deal damage to a character
|
||
|
|
*/
|
||
|
|
public function damage(Character $character, int $amount): int
|
||
|
|
{
|
||
|
|
return $character->takeDamage($amount);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Revive a character from hospital
|
||
|
|
*/
|
||
|
|
public function revive(Character $character): bool
|
||
|
|
{
|
||
|
|
if (!$character->isDead() && !$character->isInHospital()) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
$cost = config('game.health.hospital_cost', 1000);
|
||
|
|
|
||
|
|
if ($character->money < $cost) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
$character->money -= $cost;
|
||
|
|
$character->health = $character->max_health;
|
||
|
|
$character->status = 'active';
|
||
|
|
$character->in_hospital_until = null;
|
||
|
|
$character->save();
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Send character to hospital
|
||
|
|
*/
|
||
|
|
public function sendToHospital(Character $character): void
|
||
|
|
{
|
||
|
|
$character->health = 0;
|
||
|
|
$character->status = 'in_hospital';
|
||
|
|
$character->in_hospital_until = now()->addSeconds(config('game.health.regen_interval', 600) * 5); // 5 intervals
|
||
|
|
$character->save();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Restore all health for a character
|
||
|
|
*/
|
||
|
|
public function restoreAll(Character $character): void
|
||
|
|
{
|
||
|
|
$character->health = $character->max_health;
|
||
|
|
|
||
|
|
if ($character->status !== 'active') {
|
||
|
|
$character->status = 'active';
|
||
|
|
}
|
||
|
|
|
||
|
|
$character->in_hospital_until = null;
|
||
|
|
$character->save();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if character needs hospital
|
||
|
|
*/
|
||
|
|
public function needsHospital(Character $character): bool
|
||
|
|
{
|
||
|
|
return $character->isDead() || $character->isInHospital();
|
||
|
|
}
|
||
|
|
}
|