59 lines
1.3 KiB
JavaScript
59 lines
1.3 KiB
JavaScript
import {memo, useEffect, useState} from 'react';
|
|
|
|
import {DamageTypes} from '@/ecs/components/vulnerable.js';
|
|
|
|
import styles from './damage.module.css';
|
|
|
|
const damageTypeMap = {
|
|
[DamageTypes.PAIN]: styles.pain,
|
|
[DamageTypes.HEALING]: styles.healing,
|
|
[DamageTypes.MANA]: styles.mana,
|
|
};
|
|
|
|
function Damage({
|
|
damage,
|
|
scale,
|
|
zIndex,
|
|
}) {
|
|
const [randomness] = useState({
|
|
radians: Math.random() * (Math.PI / 16) - (Math.PI / 32),
|
|
x: 1 * (Math.random() - 0.5),
|
|
y: Math.random(),
|
|
})
|
|
useEffect(() => {
|
|
const handle = setTimeout(() => {
|
|
damage.onClose();
|
|
}, 1_500);
|
|
return () => {
|
|
clearTimeout(handle);
|
|
};
|
|
}, [damage]);
|
|
const {amount, position} = damage;
|
|
return (
|
|
<div
|
|
className={styles.damage}
|
|
style={{
|
|
'--magnitude': Math.max(1, Math.floor(Math.log10(Math.abs(amount)))),
|
|
'--positionX': `${position.x * scale}px`,
|
|
'--positionY': `${position.y * scale}px`,
|
|
'--randomnessX': randomness.x,
|
|
'--randomnessY': randomness.y,
|
|
'--shimmer': damageTypeMap[damage.type],
|
|
'--uiScale': scale,
|
|
rotate: `${randomness.radians}rad`,
|
|
zIndex,
|
|
}}
|
|
>
|
|
<p
|
|
style={{
|
|
scale: `${scale}`,
|
|
}}
|
|
>
|
|
{Math.abs(amount)}
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default memo(Damage);
|