feat: damage types

This commit is contained in:
cha0s 2024-07-27 10:52:49 -05:00
parent 2b91a49997
commit fb747b38e6
4 changed files with 36 additions and 2 deletions

View File

@ -1,5 +1,11 @@
import Component from '@/ecs/component.js'; import Component from '@/ecs/component.js';
export const DamageTypes = {
PAIN: 0,
HEALING: 1,
MANA: 2,
};
export default class Vulnerable extends Component { export default class Vulnerable extends Component {
mergeDiff(original, update) { mergeDiff(original, update) {
const merged = {}; const merged = {};
@ -16,6 +22,7 @@ export default class Vulnerable extends Component {
return class VulnerableInstance extends super.instanceFromSchema() { return class VulnerableInstance extends super.instanceFromSchema() {
damages = {}; damages = {};
id = 0; id = 0;
Types = DamageTypes;
damage(specification) { damage(specification) {
Component.markChange(this.entity, 'damage', {[this.id++]: specification}); Component.markChange(this.entity, 'damage', {[this.id++]: specification});
} }

View File

@ -1,7 +1,15 @@
import {memo, useEffect, useState} from 'react'; import {memo, useEffect, useState} from 'react';
import {DamageTypes} from '@/ecs/components/vulnerable.js';
import styles from './damage.module.css'; import styles from './damage.module.css';
const damageTypeMap = {
[DamageTypes.PAIN]: styles.pain,
[DamageTypes.HEALING]: styles.healing,
[DamageTypes.MANA]: styles.mana,
};
function Damage({ function Damage({
camera, camera,
damage, damage,
@ -31,6 +39,7 @@ function Damage({
'--positionY': `${position.y * scale - camera.y}px`, '--positionY': `${position.y * scale - camera.y}px`,
'--randomnessX': randomness.x, '--randomnessX': randomness.x,
'--randomnessY': randomness.y, '--randomnessY': randomness.y,
'--shimmer': damageTypeMap[damage.type],
rotate: `${randomness.radians}rad`, rotate: `${randomness.radians}rad`,
zIndex, zIndex,
}} }}

View File

@ -13,6 +13,11 @@
inherits: false; inherits: false;
syntax: '<number>'; syntax: '<number>';
} }
@property --shimmer {
initial-value: '';
inherits: false;
syntax: '<custom-ident>';
}
@property --offsetX { @property --offsetX {
initial-value: 0; initial-value: 0;
inherits: false; inherits: false;
@ -46,7 +51,7 @@
fade 1.5s linear forwards, fade 1.5s linear forwards,
grow 1.5s ease-in forwards, grow 1.5s ease-in forwards,
move 1.5s cubic-bezier(0.5, 1, 0.89, 1), move 1.5s cubic-bezier(0.5, 1, 0.89, 1),
shimmer 250ms infinite ease-in-out var(--shimmer) 300ms infinite cubic-bezier(0.87, 0, 0.13, 1)
; ;
color: var(--foreground); color: var(--foreground);
font-size: calc(10px + (var(--magnitude) * 12px)); font-size: calc(10px + (var(--magnitude) * 12px));
@ -103,8 +108,20 @@
95% { --scale: 0; } 95% { --scale: 0; }
} }
@keyframes shimmer { @keyframes pain {
0% { --hue: 0 } 0% { --hue: 0 }
50% { --hue: 30 } 50% { --hue: 30 }
100% { --hue: 0 } 100% { --hue: 0 }
} }
@keyframes healing {
0% { --hue: 120 }
50% { --hue: 90 }
100% { --hue: 120 }
}
@keyframes mana {
0% { --hue: 220 }
50% { --hue: 215 }
100% { --hue: 220 }
}

View File

@ -7,5 +7,6 @@ if (playerEntity !== other && other.Vulnerable) {
+ Math.random() * (Math.pow(10, magnitude + 1) - Math.pow(10, magnitude)), + Math.random() * (Math.pow(10, magnitude + 1) - Math.pow(10, magnitude)),
), ),
position: other.Position.toJSON(), position: other.Position.toJSON(),
type: other.Vulnerable.Types.PAIN,
}) })
} }