54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
import { Vector2 } from 'three'
|
|
import Projectile from './projectile.js'
|
|
|
|
export default class Effect {
|
|
static damage({ despawn }) {
|
|
return function(projectile, entity) {
|
|
entity.damage(10, this)
|
|
if (despawn) {
|
|
projectile.despawn()
|
|
}
|
|
}
|
|
}
|
|
|
|
static skillshot({ range, radius, speed, onCollide, after }) {
|
|
return function(cursor) {
|
|
const projectile = new Projectile()
|
|
const destination = this.position.clone().add(cursor.clone().sub(this.position).normalize().multiplyScalar(range))
|
|
projectile.owner = this.id
|
|
projectile.position.copy(this.position)
|
|
projectile.destination = destination
|
|
projectile.radius = radius
|
|
projectile.speed = speed
|
|
projectile.after = after
|
|
projectile.onCollide = onCollide
|
|
this.game?.spawnProjectile(projectile)
|
|
}
|
|
}
|
|
|
|
static homingProjectile({ range, radius, speed, onCollide, after }) {
|
|
return function(cursor) {
|
|
let closest = null
|
|
let distance = Infinity
|
|
this.game?.entities.filter((e) => e.id != this.id && e.position.clone().sub(this.position).length() < range).forEach((e) => {
|
|
const newDistance = e.position.clone().sub(cursor).length() < distance
|
|
if (newDistance < distance) {
|
|
closest = e
|
|
distance = newDistance
|
|
}
|
|
})
|
|
|
|
if (closest == null) { return } // TODO: refund
|
|
|
|
const projectile = new Projectile()
|
|
projectile.owner = this.id
|
|
projectile.position.copy(this.position)
|
|
projectile.homingTarget = closest
|
|
projectile.radius = radius
|
|
projectile.speed = speed
|
|
projectile.after = after
|
|
projectile.onCollide = onCollide
|
|
this.game?.spawnProjectile(projectile)
|
|
}
|
|
}
|
|
} |