import React from 'react';
import Icon from './Icon';
/**
* PlayerHud — HUD игрока в Play-режиме:
* - HP-полоска слева сверху с сегментами и подсветкой
* - Красный flash при получении урона
* - Счётчик патронов справа снизу с кольцом перезарядки
*/
function PlayerHud({ visible, hp, maxHp, ammo, damaged }) {
if (!visible) return null;
const hpPct = Math.max(0, Math.min(100, (hp / maxHp) * 100));
const lowHp = hp <= maxHp * 0.25;
const midHp = !lowHp && hp <= maxHp * 0.5;
const hpGradient = lowHp
? 'linear-gradient(90deg, #ff6f7a 0%, #c0303f 100%)'
: midHp
? 'linear-gradient(90deg, #ffc857 0%, #f59e0b 100%)'
: 'linear-gradient(90deg, #22d97a 0%, #0f9d56 100%)';
const hpGlow = lowHp
? '0 0 16px rgba(255, 111, 122, 0.55)'
: midHp
? '0 0 12px rgba(255, 200, 87, 0.35)'
: '0 0 12px rgba(34, 217, 122, 0.35)';
return (
<>
{/* === HP-bar — ЛЕВЫЙ ВЕРХНИЙ УГОЛ === */}
{Math.round(hp)} / {maxHp}
{Math.round(hpPct)}%
{/* Полоска */}
{/* Сегментные риски (10 шт) */}
{Array.from({ length: 9 }).map((_, i) => (
))}
{/* Красный flash при получении урона */}
{damaged && (
)}
{/* === Ammo — справа внизу, над hot-bar === */}
{ammo && (
)}
>
);
}
const AmmoIndicator = ({ ammo }) => {
const reloading = !!ammo.reloading;
const magPct = ammo.magazineMax > 0
? (ammo.magazine / ammo.magazineMax) * 100
: 0;
const lowAmmo = !reloading && magPct < 25;
// SVG-кольцо progress перезарядки
const RING_R = 30;
const RING_C = 2 * Math.PI * RING_R;
return (
{reloading ? (
{/* Кольцо progress */}
Перезарядка
) : (
<>
{/* Magazine */}
{ammo.magazine}
/ {ammo.magazineMax}
{/* Тонкая полоска текущей обоймы */}
{/* Reserve + R hint */}
{ammo.reserve}
R
перезаряд
>
)}
);
};
const HUD_KEYFRAMES = `
@keyframes hudHurtFlash {
0% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes hudHeartBeat {
0%, 100% { transform: scale(1); }
25%, 75% { transform: scale(1.18); }
50% { transform: scale(0.95); }
}
@keyframes hudSpin { to { transform: rotate(360deg); } }
@keyframes hudPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.55; }
}
`;
export default PlayerHud;